Prefácio
À medida que o tamanho do projeto se torna cada vez maior, novos módulos serão introduzidos continuamente. Diferentes módulos imprimirão seus próprios logs, o que acabará por levar o log não poder ser visualizado. Por exemplo, em meu próprio projeto, existem os seguintes logs:
Entre eles, a quantidade de dados de log do log de mensagens e do thread de segundo plano é muito grande. Se todos os logs forem impressos em um arquivo e usando o arquivo tail -f log.log , você descobrirá que os logs estão rolando rapidamente e você não poderá visualizar ou até localizar um SQL ou log de acesso ao serviço específico.
A solução é classificar e produzir logs diferentes para que os logs mútuos não se afetem. O acesso a logs por interfaces particularmente importantes pode localizar e solucionar problemas facilmente.
Etapa 1: Configure no log4j.properties
Primeiro poste todas as minhas próprias configurações log4j.properties :
log4j.rootLogger = info, console, arquivo log4j.appender.console = net.czt.log.asyncconsoleAppenderLog4j.appender.console.layout = org.apache.Log4j.patternLayoutLog4j.Apman.ConsolElPache.bache %-17c {2} (%13f:%l)%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {session_id} - %m %nlog4j.appender.console.buffersize = 10000log4j.appender.console.encoding = utf-8 log4j.appender.file = org.apache.log4j.rollingFileAppenderLog4j.appender.file.file =/home/work/apache-tomcat-6.0.39/logs/crazyant.loglog4j.appender.file.maxb ackupindex = 5log4j.appender.file.maxfilesize = 1gblog4j.appender.file.layout = org.apache.log4j.patternlayoutLog4j.append.file.layout.conversionPattern = [%-5p] crazyant-web%d {yyyy-mm-dd hh: mm: ss, sss}%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} | Método:%L%n%m%nLog4j.appender.file.buffersize = 10000log4j.appender.file.encoding = utf-8 log4j.logger.net.czt.crazyant.msg = depuração, messagelog4j.additivity.net.czt.crazyant.msg=falselog4j.appender.message=org.apache.log4j.RollingFileAppenderlog4j.appender.message.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_message.loglog4j.appender.mess age.Append=truelog4j.appender.message.MaxFileSize=1GBlog4j.appender.message.MaxBackupIndex=5log4j.appender.message.layout=org.apache.log4j.PatternLayoutlog4j.appender.message.layout.ConversionPattern=%d{yyyy-MM-dd Hh: mm: ss} [%-5p] [%c {1}] [%t]-%m%nlog4j.append.message.encoding = utf-8 log4j.logger.net.czt.crazyant.async.service = depuG, asynclog4j.additivity.net.czt.crazyant.async.service = Falselog4j.appender.async = org.apache.log4j.rollingFileAppenderLog4j.append.async.file =//home/Apache-Tomcat-6.0J.3.3.39.sync.file =//working/Apache-TCAT-6..0J.3.3.39.39 r.async.Append=truelog4j.appender.async.MaxFileSize=1GBlog4j.appender.async.MaxBackupIndex=5log4j.appender.async.layout=org.apache.log4j.PatternLayoutlog4j.appender.async.layout.ConversionPattern=%d{yyyy-MM-dd Hh: mm: ss} [%-5p] [%c {1}] [%t]-%m%nlog4j.appender.async.encoding = utf-8 log4j.logger.net.czt.orm.mybatis.sqlmonitanager = Debug,, Debug, Deput. showsqlog4j.additivity.net.czt.orm.mybatis.sqlmonitormanager = Falselog4j.logger.net.czt.transaction.intercept.smartTransactionInterceptor = Debug, Showsqlog4j.additivity.net.czt.transaction.intercept.smartTransactionInterceptor = FALSELOG4J.APPENDE.SHOWSQL = ORG .apache.log4j.rollingFileAppenderLog4j.appender.showsql.file =/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.logl og4j.appender.showsql.append = truelog4j.appender.showsql.maxfilesize = 1gblog4j.appender.showsql.maxbackupIndex = 5log4j .APPEND.SHOWSQL.LAYOUT = org.apache.log4j.patternlayoutLog4j.appender.showsql.layout.conversionPattern =%d {yyyy-mm-dd Hh: mm: ss} [%-5p] [%c {1}] [%t]-%m%nlog4j.append.showsql.encoding = utf-8 log4j.logger.net.czt.crazyant.service = depurs serviceLog4j.additivity.net.czt.crazyant.service = FALSELOG4J.APPENDER.SERVICE = org.apache.log4j.rollingFileAppenderLog4j.appender.service.file =/home/work/apacheGomcat-6.0.39/logs/LOGROGROGROT.SEVEN.39/LOGS/LOLGY/APACATEGROTEGROG4J.1. rvice.append = truelog4j.appender.service.maxfilesize = 1gblog4j.appender.service.maxbackupindex = 5log4j.appender.service.appends %.erg.apache.log4j.patternlayoutlog4j.apnder.service Hh: mm: ss} [%-5p] [%c {1}] [%t]-%m%nlog4j.appende.service.encoding = utf-8Abaixo do arquivo de configuração, você pode ver facilmente que a mensagem de saída (mensagem), assync (thread de back -end), showql (log de banco de dados) e serviço (chamada de interface) para diferentes arquivos de log, respectivamente.
Algumas dessas explicações:
log4j.rootLogger=INFO, console, file
Log4J tem o conceito de rootlogger e logger comum. Por padrão, precisamos apenas de um rootLogger, ou seja, todos os logs serão emitidos apenas para este arquivo de log.
Dê uma olhada na configuração de um madeireiro normal (pegando o serviço de log da interface como exemplo):
1. log4j.logger.net.czt.crazyant.service=DEBUG, service
O " net.czt.crazyant.service " nesta frase indica o caminho completo do pacote que entra em vigor na configuração normal do logger do logger
O serviço de cores indica o nome do madeireiro comum
2. log4j.additivity.net.czt.crazyant.service=false
O " net.czt.crazyant.service " é o mesmo que o acima, indicando o pacote direcionado pelo item de configuração.
O significado de configuração nesta frase é que não produz o log do pacote para o log rootlogger, mas apenas o produz para o log que você configurou;
3. log4j.appender.service=org.apache.log4j.RollingFileAppender e os itens de configuração abaixo desta seção de configuração
A string "Service" aqui é a mesma que o "serviço" do primeiro item de configuração acima, indicando a configuração do logger comum;
Os itens de configuração abaixo são os mesmos do rootlogger, indicando o arquivo de saída todos os dias, codificando UTF8, regras de sharding, modo de saída para cada linha, etc.
O problema que encontrei foi que, após log4j.properties acima, descobri que cada arquivo de log foi criado, mas não havia conteúdo nele. Por que isso? Vamos dar uma olhada na segunda coisa em que você presta atenção abaixo;
Etapa 2: Ao emitir o log, você precisa definir a classe específica correspondente ao objeto de log.
O que isso significa? No item de configuração acima, há uma string de pacote " net.czt.crazyant.service ". Então, vamos pensar sobre isso, como o log4j de saída logger logs em pacotes diferentes para diferentes arquivos? Pense nisso, existem dois métodos:
1. Use o método intercepter ou AOP, o log4j detecta a saída do log por si só. Quando detecta qual embalagem o log é gerado, ele será emitido para o arquivo correspondente;
2. O usuário passa um parâmetro de classe, o log4j obtém o pacote correspondente da classe e usa -o como base para localizar diferentes arquivos de log;
Olhando para o código, é óbvio que o Log4J usa o último método simples e direto:
importar org.apache.commons.logging.log; importar org.apache.commons.logging.logfactory; classe pública myclassImpl implementa myclass { / ** * registrador de logs final estático privado = logFactory.getLog (myClassimpl.class); / ** * meu func */ public void myfunc () {Logger.info ("Call Method MyFunc."); }} Em logger = LogFactory.getLog(MyClassImpl.class) , o parâmetro de classe usando o logger é passado e o endereço do pacote que a classe é refletido é o endereço de pacote usado pelo log4j para produzir o log.
Essa abordagem também possui recursos poderosos, que facilita a classificação de log lógica. Por exemplo, muitos códigos não pertencem a um pacote, mas pertencem logicamente juntos. Por exemplo, o processamento de mensagens não é apenas a interface que chama o pacote de serviço, mas também pode chamar a operação de enviar MSG. Se você deseja produzir alguns logs no pacote MSG para o serviço, quando o MSG Logger é inicializado, uma classe de serviço será passada.
Ou para todos os logs de uma determinada classe, todos os seus objetos de madeireiro podem ser de uma única instância de objeto encapsulada, e há apenas um parâmetro passado nesta instância de objeto único, que pode ser usado para identificar essa classificação lógica.
Resumir
Em Log4j.properties , a saída separada dos logs do pacote ou da classe específica é suportada, mas também exige que a inicialização do logger no código possa corresponder ao pacote na configuração do log.
Ok, o acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo seja de ajuda para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.