Prefacio
A medida que el tamaño del proyecto se vuelve cada vez más grande, se introducirán nuevos módulos continuamente. Diferentes módulos imprimirán sus propios registros, lo que eventualmente conducirá a que el registro no pueda verse. Por ejemplo, en mi propio proyecto, existen los siguientes registros:
Entre ellos, la cantidad de datos de registro del registro de mensajes y el hilo de fondo es muy grande. Si todos los registros se imprimen en un archivo y utilizan el archivo tail -f log.log , encontrará que los registros se desplazan rápidamente, y no puede ver o incluso localizar un registro específico de SQL o acceso de servicio.
La solución es clasificar y emitir diferentes registros para que los registros mutuos no se afecten entre sí. El acceso a los registros de interfaces particularmente importantes puede localizar y solucionar problemas fácilmente.
Paso 1: Configurar en log4j.properties
Primero publique todas mis propias configuraciones log4j.properties :
log4j.rootlogger = info, console, archivo log4j.appender.console = net.czt.log.asyncconsoleppenderlog4j.appender.console.layout = org.apache.log4j.patternlayautlog4j.appender.console.layout.conversionpattern %-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/crazy.loglog4j.appender.file.maxbb ackupindex = 5log4j.appender.file.maxfilesize = 1gblog4j.appender.file.layout = org.apache.log4j.patternlayoutlog4j.appender.file.layout.conversionPattern = [%-5p] Crazyant-Web%d {aaayyyy-mm-dd hh: mm: ss, sss}%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {session_id} Método:%l%n%m%nlog4j.appender.file.buffersize = 10000log4j.appender.file.encoding = utf-8 log4j.logger.net.czt.crazyant.msg = debug, messagelog4j.additivity.net.czt.crazyant.msg = falselog4j.appender.message = org.apache.log4j.rollingFilePepepePlenderLog4j.appender.message.file =/home/work/apache-tomcat-6.0.39/logs/crazyant_message. edad.append = truelog4j.appender.message.maxfilesize = 1gblog4j.appender.message.maxbackupIndex = 5log4j.appender.message.layout = org.apache.log4j.patternlayOutlog4j.appender.message.layout.conconversionpattern HH: MM: SS} [%-5p] [%C {1}] [%t]-%m%nlog4j.appender.message.encoding = utf-8 log4j.logger.net.czt.crazyant.async.service = Debug,, debug, asynclog4j.additivity.net.czt.crazyant.async.Service = falselog4j.appender.async = org.apache.log4j.rollingFilePepepePlenderLog4j.Appender.async.file =/home/work/appOmcat-6.0.39/logs/crazy_async.Loglogloglogloge r.async.append = truelog4j.appender.async.maxFilesize = 1gblog4j.appender.async.maxbackupIndex = 5log4j.appender.async.Layout = org.apache.log4j.patternlayoutlog4j.appender.async.Aloyout.conconversionPattern =%d {yyyyyyyyyyyyyy HH: MM: SS} [%-5p] [%C {1}] [%t]-%m%nlog4j.appender.async.encoding = utf-8 log4j.logger.net.czt.orm.mybatis.sqlmonitormanager = Debug,, debug,, showsqllog4j.additivity.net.czt.orm.mybatis.sqlmonitormanager = falselog4j.logger.net.czt.transaction.interceptor.smarttransactioninterceptor = debug, showsqllog4j.additivity.net.czt.transaction.interceptor.smartTransactionInterceptor = falselog4j.appender.showsql = org.apache.log4j.rollingFileAppenderLog4j.appender.showsql.file =/home/work/apache-tomcat-6.0.39/logs/loceant_sql.shil.Logl. Og4j.appender.showsql.append = truelog4j.appender.showsql.maxfilesize = 1gblog4j.appender.showsql.maxbackupindex = 5log4j .Appender.showsql.Layout = org.apache.log4j.patternlayoutlog4j.appender.showsql.layout.conversionPattern =%d {yyyy-mm-dd HH: MM: SS} [%-5p] [%c {1}] [%t]-%m%nlog4j.appender.showsql.Encoding = utf-8 log4j.logger.net.czt.crazyant.service = debug, debug, ServiceLog4j.additivity.net.czt.crazyant.service = falselog4j.appender.service = org.apache.log4j.rollingFilePepepeSpenderLog4j.appender.service.file =/home/work/apache-tomcat-6.0.39/logs/locaSant_service.loglog4J rvice.append = truelog4j.appender.service.maxfilesize = 1gblog4j.appender.service.maxbackupIndex = 5log4j.appender.service.layout = org.apache.log4j.patternlayautlog4j.appender.service.layout.conversionpattern HH: MM: SS} [%-5p] [%c {1}] [%t]-%m%nlog4j.appender.service.Encoding = utf-8Debajo del archivo de configuración, puede ver fácilmente que emitir el mensaje (mensaje), async (subproceso de backend), showsql (registro de la base de datos) y servicio (llamada de interfaz) a diferentes archivos de registro respectivamente.
Algunas de estas explicaciones:
log4j.rootLogger=INFO, console, file
LOG4J tiene el concepto de RoadLogger y Logger ordinario. De manera predeterminada, solo necesitamos un rootLogger, es decir, todos los registros solo se emitirán a este archivo de registro.
Eche un vistazo a la configuración de un registrador normal (tomando el servicio de registro de interfaz como ejemplo):
1. log4j.logger.net.czt.crazyant.service=DEBUG, service
El " net.czt.crazyant.service " en esta oración indica la ruta completa del paquete que entra en vigencia en la configuración de registro de registrador normal
El servicio de color indica el nombre del registrador ordinario
2. log4j.additivity.net.czt.crazyant.service=false
El " net.czt.crazyant.service " es el mismo que el anterior, lo que indica el paquete dirigido por el elemento de configuración.
El significado de la configuración en esta oración es que no emite el registro del paquete al registro de RoadLogger, sino que solo lo lleva al registro que configuró;
3. log4j.appender.service=org.apache.log4j.RollingFileAppender , y los elementos de configuración debajo de esta sección de configuración
La cadena "Servicio" aquí es la misma que el "Servicio" del primer elemento de configuración anterior, lo que indica la configuración del registrador ordinario;
Los elementos de configuración a continuación son los mismos que RootLogger, que indican el archivo de salida todos los días, codifican UTF8, reglas de fragmentación, modo de salida para cada línea, etc.
El problema que encontré era que después de que se configuraba log4j.properties . ¿Por qué es esto? Echemos un vistazo a la segunda cosa a la que presta atención a continuación;
Paso 2: Al emitir el registro, debe configurar la clase específica correspondiente al objeto de registro.
¿Qué significa? En el elemento de configuración anterior, hay una cadena de paquete " net.czt.crazyant.service ". Entonces, pensemos en ello nosotros mismos, ¿cómo los registros de registros de salida LOG4J en diferentes paquetes a diferentes archivos? Piénselo, hay dos métodos:
1. Utilice el interceptor o el método AOP, log4j detecta la salida de registro por sí solo. Cuando detecta qué paquete se genera el registro, se emitirá al archivo correspondiente;
2. El usuario pasa un parámetro de clase, log4j obtiene el paquete correspondiente de la clase y usa esto como base para localizar diferentes archivos de registro;
Mirando el código, es obvio que LOG4J usa el último método simple y directo:
importar org.apache.commons.logging.log; import org.apache.commons.logging.logFactory; La clase pública myClassImpl implementa myclass { / ** * loger * / private static final log logger = logFactory.getLog (myclassImpl.class); / ** * mi func */ public void myfunc () {logger.info ("Método de llamada myFunc."); }} En logger = LogFactory.getLog(MyClassImpl.class) , el parámetro de clase que usa el registrador se pasa, y la dirección del paquete que se refleja la clase es la dirección del paquete utilizada por log4j para emitir el registro.
Este enfoque también tiene características potentes, que facilitan la clasificación de registro lógico. Por ejemplo, muchos códigos no pertenecen a un paquete, pero pertenecen lógicamente juntos. Por ejemplo, el procesamiento de mensajes no es solo la interfaz que llama al paquete de servicio, sino que también puede llamar a la operación de enviar MSG. Si desea emitir algunos registros en el paquete MSG al servicio, entonces cuando se inicializa el registrador de msg, acaba de pasar una clase de servicio.
O para todos los registros de una determinada clase, todos sus objetos de registrador pueden ser de una sola instancia de objeto encapsulado, y solo se pasa un parámetro en esta instancia de objeto único, que puede usarse para identificar esta clasificación lógica.
Resumir
En Log4j.properties , se admite la salida separada de los registros del paquete o la clase específica, pero también requiere que la inicialización del registrador en el código pueda corresponder al paquete en la configuración del registro.
De acuerdo, lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo sea de ayuda para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse.