1.1 Introdução
É embaraçoso dizer isso. Recentemente, a empresa foi enviada à empresa cliente para entrevistar cargos de desenvolvimento terceirizados. Originalmente, preparei algumas perguntas relacionadas à entrevista para Redis, RabbitMQ, SSM Frameworks e algumas revisões de projetos que eu havia feito. Fui à entrevista com confiança. Como resultado, alguém perguntou o que o sistema de log usou no projeto recente foi assim que eu vim? Como o nível de log é configurado? Eu estava confuso naquele momento. Eu costumava cuidar disso pelo gerente do projeto. Acabei de procurar na Internet e colei e estava tudo bem. Depois que terminei de falar, o entrevistador me deu uma olhada profunda. Naquela época, senti envergonhado ...
1.2 Conte -me menos sobre fofocas e conte -me a história do desenvolvimento do log (se você já sabe, pode pular e apenas olhar para a configuração de log 1.3)
Para ter um entendimento aprofundado da implementação da tecnologia de log, eu recomendo pessoalmente ler: Logback + SLF4J. Quanto à configuração do log, é melhor entender o LOG4J, porque a maioria dos projetos atualmente usa o log4j. Ok, vamos começar com a história de desenvolvimento do log:
Em 1999, a comunidade de código aberto do Apache divulgou o LOG4J, que causou uma sensação em todo o mundo do programa. Desde então, tornou -se o padrão para registro e tem sido amplamente utilizado pelos programadores Java. Mais tarde, a Sun também lançou o mecanismo de log (java.util.logging, a seguir denominado Jul) na versão 1.4 do JDK, mas o mecanismo não foi reconhecido pelo público, o que é realmente lamentável. Em breve, o Apache lançou a estrutura de log de lançamento de Commons (que permite aos desenvolvedores abstrair os métodos de implementação de log sem prestar atenção à qual a tecnologia de log é usada. Nos termos do leigo, você deseja ligar para o Didi no seu celular. Se você estiver em Pequim, chamará Didi de Pequim e em Hong Kong, você chamará Didi de Hong Kong). Essa estrutura parece ser um desprezo pelo sol. Ele pode encontrar e chamar a tecnologia de log automaticamente no ambiente atual para saída de log. A estrutura de log pode suportar log4j ou jul. O Commons-Logging+Log4J se tornou uma combinação clássica de toras Java por muito tempo depois disso. No entanto, o Logging do Commons não foi atualizado por um tempo. Gostaria de saber se o design do local do Commons não era bom o suficiente e é mais difícil otimizá-lo. Por que você diz isso? Como nasceu a próxima excelente estrutura de registro SLF4J, o autor (Ceki Gülcü) é um dos autores do LOG4J. Seu SLF4J é mais elegante em design, e ele também implementou a tecnologia Logback, que também é mais de ponta do que o LOG4J. Neste ponto, a situação em que o sistema de log é dominado pelo Commons-Logging+Log4J começou a ser abalado e vários comuns-Logging+Log4J? slf4j+log4j? slf4j+logback? A combinação é realmente comovente. O que é ainda mais aterrorizante é que Ceki Gülcü Boss ajudou a otimizar o LOG4J e, desde então, houve outra tecnologia de madeira no mundo - log4j2. Isso vai aprender com Tencent para fazer o WeChat e o QQ? É realmente 666. Portanto, se você deseja ter uma compreensão profunda da tecnologia de registro, poderá encontrar informações relevantes sobre o logback + slf4j. Quanto ao arquivo de configuração, acho que você pode entender a explicação detalhada da configuração do LOG4J que escrevi abaixo. Afinal, muitas empresas agora usam a estrutura LOG4J.
1.3 Vá para o tópico, configuração básica de log
1. Crie um novo arquivo de log4j.properties no pacote de recursos ou pacote de recursos (projeto Maven). Os seguintes parâmetros são suficientes para a configuração inicial do projeto. Para uma configuração mais detalhada,
Continue visualizando a configuração 1.4 LOG4J no nível de log;
#Specifique o nível de log e a fonte de saída através do logger da raiz #A prioridade da saída do log: Debug <info Implementação específica do console da fonte de saída como saída do console ########## Definir o console do alias de fonte de saída (ou seja, a fonte de saída definida pelo logger da raiz)#A classe de implementação é consolEppender (outweet fonte) log4j.appender.console = org.apache.log4j.conSolAppender log4j.appender.console.layout = org.apache.log4j.patternlayout#Definir o formato específico do log de saída log4j.append.console.layout.conversionPattern =%d%-5p [%c. the output source alias myFile (that is, the output source defined by the root logger)# The implementation class is RollingFileAppender (file output source) log4j.appender.myFile=org.apache.log4j.RollingFileAppender#Define the storage path of the log file log4j.appender.myFile.File=src/log/logProperties/log4j.log#Define O tamanho do arquivo de log Log4j.appender.myfile.m axFilesize = 1024kb#define um máximo de vários arquivos de log (calcule 1 a partir de 0, ou seja, até 3 arquivos aqui) #Absent desse tamanho, o arquivo generado antes será sobrescrito o formato. log4j.appender.myfile.layout = org.apache.log4j.patternlayout#Definir o formato específico do log de saída log4j.appender.console.layout.conversionPattern =%d%-5p [%c.%m () -%m%N ##################mon###############mon#######mon#######mon#######mon Não O formato padrão é ISO8601 e o formato também pode ser especificado. #Definition é o seguinte:%d {yyy ano mm mês dd dia hh hora mm minuto ss segundos sss}, e a saída será: #january 6 de 2018 14: 47: 45: 590 #%p: o nível de log, ou seja, o que é depurno, não é o que é o que é o que é o que é o que é o que é o que é o que é o que é o que é o que é o que é o que é o que você está fazendo com o objetivo de avaliar o desempenho de um doscidos e os que estão sendo pequenos. está à direita), você pode aprender com ele um exemplo #%c: o nome completo da classe em que o log está localizado #%m: o nome do método em que o log está localizado #%m: informações de log #%n: saída uma linha de retorno de transporte #%l: número da linha de saída no código2. Log de chamada para testar os resultados da configuração.
importar org.apache.log4j.logmanager; importar org.apache.log4j.logger; importar org.apache.log4j.propertyconfigurator; classe public logpropertestest {public static void main (string [] args) { /*arquivos de parse sob string não-clássicos log4jpath = system.getProperty ("user.dir")+"// src // log // logProperties // log4j.properties"; PropertyConfigurator.configure (log4jpath);*/ logger log = logManager.getLogger (LogPropertestest.class); log.debug ("Debug"); log.info ("Information"); log.warn ("aviso"); log.error ("erro"); log.fatal ("erro fatal"); }}1.4 Configuração do nível de log
A configuração do nível de log pode ser dividida em três categorias. A configuração acima é configurar o nível de log do registrador pai, a segunda categoria é configurar o nível de log do madeireiro da subclasse, e a terceira categoria é configurar o nível de log da fonte de saída (console, arquivo, etc.). Sua prioridade de análise no nível de log é organizada de baixa a alta. Sinto muito por não explicar claramente a declaração específica. Eu deveria ser capaz de entender o caso diretamente!
1. Se o nível de log do registrador pai (rootLogger) (assumindo que é o nível de informação), o nível de log do madeireiro da subclasse não será configurado e o nível de log da fonte de saída não estiver configurado, a fonte de saída só pode sair do nível de informações ou acima;
2. Se o nível de log do registrador pai (rootLogger) (assumindo que ele é um nível de informação), o nível de log do logger da subclasse (assumindo que ele é o nível de depuração) e o nível de log da fonte de saída não estiver configurado, a saída da fonte de saída está acima do nível de depuração;
3. Se o nível de log do registrador pai (rootLogger) (assumindo que é o nível de informação), o nível de log do madeireiro da subclasse (assumindo que é o nível de depuração) e o nível de log da fonte de saída (assumindo que seja o nível de informação), a fonte de saída gera um nível de informação ou acima;
4. Se o nível de log do registrador pai (rootLogger) (assumindo que é o nível de informação), o nível de log do logger da subclasse não será configurado e o nível de log do logger da subclasse estiver configurado.
O nível de log da fonte de saída (assumindo que é o nível de depuração), então a fonte de saída gera um nível de informação ou acima;
Portanto, a partir do caso acima, podemos saber que existem 2 relações lógicas entre o madeireiro e o nível de log de saída da fonte de saída:
1. Se a fonte de saída não definir o nível de log, ele herdará o nível de log mais próximo ao seu logger de subclasse; Se o madeireiro da subclasse não definir o nível de log, ele herdará o registrador pai mais próximo de seu registrador pai.
2. Ao imprimir o log, a fonte de saída será comparada com o nível de log definido pelo logger da subclasse mais próximo a ele. Se o nível definido pela fonte de saída for maior que o logger da subclasse, o log será emitido de acordo com o nível de log definido pela fonte de saída e vice -versa.
Portanto, no projeto, você pode configurar o nível de log de acordo com o método de configuração diária:
#Controle O nível de log do madeireiro pai é informação. Por padrão, apenas os logs acima do nível de informação são emitidos em todos os módulos log4j.rootlogger = informações, console#console#Controle o nível de log de um módulo separadamente com erro, e os logs são emitidos somente quando uma exceção ocorre Log4j.logger.log.logProperties = Erro# log4j.logger.log.logProperties.LogPropertiesTest=debug##################################################### ############################################################################################################ ###################################################################################################################################################################################################################################################Ç ############################################################################################################ #Specifique o nível de log da fonte de saída atual. Com a configuração anterior, você não precisa configurar este item #log4j.appender.console.threshold = info #Especifique o formato da saída de log: formato flexível log4j.appender.console.layout = org.apache.log4j.patternlayout #Content de formato específico log4j.apPender. [%c.%m ()] -%m%n
1.5 Conclusão
Neste ponto, acredito que você tem um entendimento básico da configuração de log. Há muitas coisas no artigo que podem estar erradas, e todos os heróis podem apontá -los. Eu escrevi um artigo para resumir para ser capaz de entender profundamente a configuração dessa tecnologia, para que eu tenha uma compreensão mais profunda dela.