Inicialização de primavera: como posso definir o nível de log com application.properties?

301

Esta é uma pergunta muito simples, mas não consigo encontrar informações.
(Talvez meu conhecimento sobre estruturas Java esteja muito ausente)

Como posso definir o nível de log com application.properties?
E registrando o local do arquivo, etc?

Zeodtr
fonte
1
Para o registro, outra opção é definir o nível do log como variável de ambiente, por exemplo, através do painel heroku. In Settings-> Config Varsdefina logging.level.com.yourpackagepara o nível desejado (INFO, ERROR, DEBUG).
LukeSolar 25/02/19

Respostas:

355

Update: A partir da Primavera de inicialização v1.2.0.RELEASE, as configurações application.propertiesou application.ymlse aplicam. Consulte a seção Níveis de log do guia de referência.

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR

Para versões anteriores do Spring Boot, você não pode. Você simplesmente precisa usar a configuração normal para sua estrutura de log (log4j, logback) para isso. Adicione o arquivo de configuração apropriado ( log4j.xmlou logback.xml) ao src/main/resourcesdiretório e configure ao seu gosto.

Você pode habilitar o log de depuração especificando --debugao iniciar o aplicativo a partir da linha de comando.

O Spring Boot também fornece um bom ponto de partida para o logback configurar alguns padrões, cores etc., o arquivo base.xml, que você pode simplesmente incluir no arquivo logback.xml. (Isso também é recomendado no logback.xml padrão no Spring Boot.

<include resource="org/springframework/boot/logging/logback/base.xml"/>     
M. Deinum
fonte
8
Normalmente, qualquer coisa que você possa fazer na linha de comando funciona em um arquivo de configuração externo. Então, debug = true faria isso, eu acho. Esse sinalizador é um pouco especial porque o log deve ser inicializado muito cedo, mas acho que funcionaria.
Dave Syer
7
BTW, o sistema de registro preferido é o logback, e é isso que você obtém por padrão dos dispositivos iniciais. Portanto, o logback.xml é a ferramenta mais comum para configurar o log de maneira precisa. O sinalizador --debug apenas ativa alguns canais de registro do Spring selecionados.
Dave Syer
Outra dica, a bota de mola inclui um bom base.xml . Qual é um bom ponto de partida. (Veja minha resposta estendida).
M. Deinum
@ M.Deinum Obrigado novamente por sua ótima dica! Agora eu posso alterar o nível de log para o meu próprio código.
zeodtr
2
Parece que podemos, agora. Quanto ao Spring v4.1.3.RELEASE (com o Spring Boot v1.2.0.RELEASE), as configurações em application.propertiesou se application.ymlaplicam, conforme respondidas por Richard (módulo o problema :ou =--- os dois pontos parecem funcionar para mim).
quer
108

Você pode fazer isso usando seu application.properties.

logging.level.=ERROR-> Define o nível de log raiz como erro
...
logging.level.=DEBUG-> Define o nível de log raiz como DEBUG

logging.file=${java.io.tmpdir}/myapp.log-> Define o caminho absoluto do arquivo de log como TMPDIR / myapp.log

Um conjunto padrão e sensato de application.properties sobre o log usando perfis seria: application.properties:

spring.application.name=<your app name here>
logging.level.=ERROR
logging.file=${java.io.tmpdir}/${spring.application.name}.log

application-dev.properties:

logging.level.=DEBUG
logging.file=

Quando você desenvolve seu IDE favorito, basta adicionar um -Dspring.profiles.active=devargumento como VM à configuração de execução / depuração do seu aplicativo.

Isso fornecerá apenas erros ao efetuar logon de produção e depuração durante o desenvolvimento, SEM gravar a saída em um arquivo de log. Isso melhorará o desempenho durante o desenvolvimento (e economizará unidades SSD algumas horas de operação;)).

Richard
fonte
1
O sinal '=' para atribuição não funcionou. A tarefa foi realizada com um ':' como separador. logging.level.:DEBUG
randominstanceOfLivingThing
2
Estranho, eu tenho essa configuração trabalhando em um projeto de exemplo. Os sinais '' (espaço), '=' e ':' são tratados igualmente como separador, exceto nos casos em que os separadores são usados ​​nas chaves. Tem certeza de que sua chave não continha espaços em branco?
Richard
1
Pode confirmar que ":" funciona, mas "=" é ignorado. Editar: Falou em breve, havia um espaço entre "=" e o nível. tudo funciona agora.
Mike R
1
Isso não funciona no meu teste com spring-boot 1.4.0: logging.level.=DEBUGfará com que o aplicativo falhe ao iniciar e com erro: #java.lang.ClassCircularityError: java/util/logging/LogRecord
Eric Wang
2
Parece-me que logging.level.é apenas um atalho sintático de conveniência logging.level.root, que pode ser preferido como (1) menos propenso a ser confundido com um erro de digitação, (2) potencialmente mais explícito e (3) trabalhando com o =sinal de atribuição, que fornece mais consistência geral para o arquivo de configuração.
Alain BECKER
66

A maneira correta para definir a raiz nível de log está usando a propriedade logging.level.root. Consulte a documentação , que foi atualizada desde que esta pergunta foi feita originalmente.

Exemplo:

logging.level.root=WARN
O punhal de Gilbert Arenas
fonte
15

Suponha que seu aplicativo tenha o nome do pacote como com.company.myproject. Em seguida, você pode definir o nível de log para classes dentro do seu projeto, conforme indicado abaixo nos arquivos application.properties

logging.level.com.company.myproject = DEBUG

logging.level.org.springframework.web = DEBUGe logging.level.org.hibernate = DEBUGdefinirá o nível de log para classes somente da Web framework Spring e do Hibernate.

Para definir o local do arquivo de log, use

logging.file = /home/ubuntu/myproject.log

shaunthomas999
fonte
14

Se você estiver no Spring Boot, poderá adicionar diretamente as seguintes propriedades no arquivo application.properties para definir o nível de log, customizar o padrão de log e armazenar logs no arquivo externo.

Estes são diferentes níveis de registro e sua ordem do mínimo << máximo.

DESLIGADO << FATAL << ERRO << AVISO << INFO << DEBUG << << TRACE << ALL

# To set logs level as per your need.
logging.level.org.springframework = debug
logging.level.tech.hardik = trace

# To store logs to external file
# Here use strictly forward "/" slash for both Windows, Linux or any other os, otherwise, its won't work.      
logging.file=D:/spring_app_log_file.log

# To customize logging pattern.
logging.pattern.file= "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"

Por favor, passe por este link para personalizar seu registro com mais clareza.

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html

Hardik Patel
fonte
Não sei porquê, mas logging.level.tech.hardik = traçar isso não está funcionando no meu caso quando eu coloco logging.level.roo = traçar ele está trabalhando
Arvind Kumar
10

Certificando-se de que Dave Syer receba um pouco de amor, porque adicionar debug=trueao application.properties realmente permitirá o log de depuração.

oravecz
fonte
8

Caso você queira usar uma estrutura de log diferente, log4j por exemplo, achei a abordagem mais fácil é desativar o próprio log de inicializador e implementar o seu próprio. Dessa forma, eu posso configurar todos os níveis de log em um arquivo, log4j.xml (no meu caso).

Para conseguir isso, basta adicionar essas linhas ao seu pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

Você provavelmente já tem a primeira dependência e precisa apenas das outras duas. Observe que este exemplo cobre apenas o log4j.
Isso é tudo, agora você está pronto para configurar o log para inicialização no seu arquivo de configuração log4j!

atripes
fonte
Essa exclusão funcionou para mim. Minha API REST não foi escolhida e minha dependência do log4j log4j.properties.
Ankitjaininfo
eles também têm primavera-boot-starter-log4j2 agora
Kalpesh Soni
4

Você pode tentar definir o nível do log como DEBUG, pois ele mostrará tudo ao iniciar o aplicativo

logging.level.root=DEBUG
Ahmed Salem
fonte
3

Para os registros: a documentação oficial , como para o Spring Boot v1.2.0.RELEASE e Spring v4.1.3.RELEASE:

Se a única alteração que você precisa fazer no log é definir os níveis de vários loggers, você pode fazer isso em application.properties usando o prefixo "logging.level", por exemplo

logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR

Você também pode definir o local de um arquivo para o qual efetuar logon (além do console) usando "logging.file".

Para definir as configurações mais refinadas de um sistema de log, você precisa usar o formato de configuração nativo suportado pelo LoggingSystem em questão. Por padrão, o Spring Boot seleciona a configuração nativa de seu local padrão para o sistema (por exemplo, classpath: logback.xml para Logback), mas você pode definir o local do arquivo de configuração usando a propriedade "logging.config".

Eric Platon
fonte
2

Se você deseja definir mais detalhes, adicione um nome de arquivo de configuração de log "logback.xml" ou "logback-spring.xml".

no seu arquivo application.properties, insira assim:

logging.config: classpath:logback-spring.xml

no loback-spring.xml, insira assim:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/base.xml"/>

        <appender name="ROOT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">

            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>

            <file>sys.log</file>

            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">


                <fileNamePattern>${LOG_DIR}/${SYSTEM_NAME}/system.%d{yyyy-MM-dd}.%i.log</fileNamePattern>

                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>500MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>

            <encoder>
                <pattern>%-20(%d{yyy-MM-dd HH:mm:ss.SSS} [%X{requestId}]) %-5level - %logger{80} - %msg%n
                </pattern>
            </encoder>
        </appender>


        <appender name="BUSINESS_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>TRACE</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>

            <file>business.log</file>

            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

                <fileNamePattern>${LOG_DIR}/${SYSTEM_NAME}/business.%d{yyyy-MM-dd}.%i.log</fileNamePattern>

                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>500MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>

            <encoder>
                <pattern>%-20(%d{yyy-MM-dd HH:mm:ss.SSS} [%X{requestId}]) %-5level - %logger{80} - %msg%n
                </pattern>
            </encoder>
        </appender>


        <logger name="{project-package-name}" level="TRACE">
            <appender-ref ref="BUSINESS_APPENDER" />
        </logger>

        <root level="INFO">
            <appender-ref ref="ROOT_APPENDER" />
        </root>

    </configuration>
Sheldon Papa
fonte
2

As respostas existentes são ótimas. Eu só quero compartilhar com você um novo recurso de inicialização por mola, que permite agrupar logs e definir o nível de log em todo o grupo.

Exemplo dos documentos:

  • Crie um grupo de log
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
  • Defina o nível de log para o grupo
logging.level.tomcat=TRACE

É um recurso interessante que traz mais flexibilidade.

Martin Choraine
fonte
2

Na minha configuração atual, defini-a em application.yaml assim:

logging:
  level:
    ROOT: TRACE

Estou usando o spring-boot: 2.2.0.RELEASE. Você pode definir qualquer pacote que deva ter o nível TRACE assim.

fascynacja
fonte
1
Isso é configurado no nível do aplicativo. OP quer traço apenas para os logs de hibernação para o qual seria necessário um filtro de nível de pacote de configurações de log
Sudip Bhandari
2

no projeto de inicialização do Spring, podemos escrever logging.level.root = WARN, mas aqui está o problema, temos que reiniciar novamente, mesmo que tenhamos adicionado a dependência de devtools, no arquivo de propriedades, se formos modificados, qualquer valor não será detectável automaticamente, por essa limitação que conheci a solução i, e podemos adicionar o atuador no pom.xml e passar o nível do registrador como mostrado abaixo no cliente do carteiro na barra de URL http: // localhost: 8080 / loggers / ROOT ou http: // localhost: 8080 / loggers / com .mycompany e no corpo você pode passar o formato json como abaixo

{
  "configuredLevel": "WARN"
}
siddartha kamble
fonte
1

No caso do eclipse IDE e seu projeto ser finalizado, lembre-se de limpar e construir o projeto para refletir as alterações.

Sabarish Kumaran.V
fonte
1

Com o Springboot 2, você pode definir o nível de log raiz com uma variável de ambiente como esta:

logging.level.root=DEBUG

Ou você pode definir o log específico para pacotes como este:

logging.level.my.package.name=TRACE
Jakudaba
fonte
para configuração de variáveis ​​de ambiente, você prefere usar LOGGING_LEVEL_ROOT=DEBUG
:,