1.1 Introducción
Es vergonzoso decirlo. Recientemente, la compañía fue enviada a la compañía cliente para entrevistar a puestos de desarrollo subcontratados. Originalmente preparé algunas preguntas de entrevista relacionadas para Redis, RabbitMQ, SSM Frameworks y algunas revisiones de proyectos que había hecho. Fui a la entrevista con confianza. Como resultado, alguien preguntó cuál era el sistema de registro utilizado en el proyecto reciente tan pronto como surgió. ¿Cómo se configura el nivel de registro? Estaba confundido en ese momento. Por lo general, el gerente del proyecto lo cuidaba. Acabo de buscar en Internet y lo pegé y estaba bien. Después de que terminé de hablar, el entrevistador me dio una mirada profunda. En ese momento, me sentí avergonzado ...
1.2 Cuéntame menos sobre chismes y cuéntame la historia del desarrollo del registro (si ya lo sabes, puedes omitirlo y solo mirar la configuración de registro 1.3)
Para tener una comprensión profunda de la implementación de la tecnología log, personalmente recomiendo leer: logback + slf4j. En cuanto a la configuración del registro, es mejor comprender LOG4J, porque la mayoría de los proyectos actualmente usan LOG4J. Bien, comencemos con la historia de desarrollo del registro:
En 1999, la comunidad de código abierto Apache lanzó Log4J, que causó una sensación en todo el mundo del programa. Desde entonces, se ha convertido en el estándar para el registro y ha sido ampliamente utilizado por los programadores de Java. Más tarde, Sun también lanzó el mecanismo de registro (java.util.logging, en lo sucesivo conocido como Jul) en el JDK versión 1.4, pero el mecanismo no ha sido reconocido por el público, lo cual es realmente lamentable. Pronto, Apache lanzó el marco de registro de registro de bienes comunes (que permite a los desarrolladores métodos de implementación de registros abstractos sin prestar atención a qué tecnología de registro se usa. En términos de laicos, desea llamar a Didi a su teléfono móvil. Este marco parece ser un desprecio por el sol. Puede encontrar automáticamente y llamar a la tecnología de registro en el entorno actual para la salida de registro. El marco de registro puede admitir log4j o jul. Commons-Logging+Log4J se convirtió en una combinación clásica de registros de Java durante mucho tiempo después de eso. Sin embargo, el registro de bienes comunes no se ha actualizado por un tiempo. Me pregunto si el diseño de la registro de los bienes comunes no fue lo suficientemente bueno, y es más difícil optimizarlo. ¿Por qué dices eso? Debido a que nació el siguiente excelente marco de registro SLF4J, el autor (Ceki Gülcü) es uno de los autores de LOG4J. Su SLF4J es más elegante en diseño, y también implementó Logback Technology, que también es más de vanguardia que LOG4J. En este punto, la situación en la que el sistema de registro está dominado por el registro de bienes comunes+log4j ha comenzado a ser sacudido, y varios registros comunes+log4j? SLF4J+LOG4J? SLF4J+Logback? La combinación es realmente desgarradora. Lo que es aún más aterrador es que el jefe de Ceki Gülcü ayudó a optimizar log4j, y desde entonces, ha habido otra tecnología de registro en el mundo: LOG4J2. ¿Esto va a aprender de Tencent para hacer WeChat y QQ? Es realmente 666. Por lo tanto, si desea tener una comprensión profunda de la tecnología de registro, puede encontrar información relevante sobre logback + slf4j. En cuanto al archivo de configuración, creo que puede comprender la explicación detallada de la configuración log4j que escribí a continuación. Después de todo, muchas compañías ahora usan el marco LOG4J.
1.3 Vaya al tema, configuración básica de registro
1. Cree un nuevo archivo log4j.properties en el paquete classpath o recursos (proyecto Maven). Los siguientes parámetros son suficientes para la configuración inicial del proyecto. Para una configuración más detallada,
Continuar ver la configuración de nivel de registro 1.4 log4j;
#Specififle el nivel de registro y la fuente de salida a través del registrador raíz #the prioridad de la salida del registro: depurar <info <warn <error <fatal#fatal define el nivel de registro (información) del registrador raíz y el alias de la fuente de salida (console, myfile)#Esta definición permite que el registro se emita en la consola y archivo, y solo salga logs de la información de nivel de información de nivel de información. Implementación de la consola de fuente de salida como salida de consola ########## Definir la consola de alias de origen de salida (es decir, la fuente de salida definida por el registrador raíz)#La clase de implementación es ConsolePeppender (Fuente de salida de consola) log4j.appender.console = Org.apache.log4j.consolePepperse #the format de formats para la salida de la salida del patrón. log4j.appender.console.layout = org.apache.log4j.patternlayout#Defina el formato específico de la salida del registro log4j.appender.console.layout.conversionPattern =%d%-5p [%c.%m ()] -%m%n ###### Configurar la fuente de salida de salida Myfile como expulsión de archivo ###################################. alias myFile (es decir, la fuente de salida definida por el registrador raíz)#La clase de implementación es RollingFileAppender (fuente de salida de archivo) log4j.appender.myfile = org.apache.log4j.rollingFileAppender#Define la ruta de almacenamiento del archivo log4j.appender.myfile.file = src/logProperties/logProperties/logProperties/log4j. El archivo de registro log4j.appender.myfile.m axfilesize = 1024kb#Definir un máximo de varios archivos de registro (calcule 1 de 0, es decir, hasta 3 archivos aquí) #absent este tamaño, el archivo generado antes se sobrescribirá log4j.appender.myfile.maxbackupindex = 2#especificar el formato de formato de registro a la clase de implementación de patrones de patrones log4j.appender.myfile.layout = org.apache.log4j.patternlayout#Defina el formato específico de la salida del registro log4j.appender.console.layout.conversionPattern =%d%-5p [%c.%m ()] -%m%n ####### Output Format Format ######%d: el punto de tiempo para el registro de la forma de registro de tiempo. ISO8601, y el formato también se puede especificar. #Definition es el siguiente:%d {yyy año mm mes dd día hh hora mm minuto ss segundos sss}, y la salida será: #6 de januario de 2018 14: 47: 45: 590 #%p: nivel de registro, es decir, depug, información, error, error, fatal #%-5p: significa que el carácter es menos de 5 bits, el carácter, la izquierda, ",", ", si el carácter", ", si el carácter", ",", si el carácter ",", ", si el carácter", ",", si el carácter ",", ",", ",", lo que sigue ",", ",", ",", ", lo que sigue,", ",", ",", ",", ",", ",", ",", ",", ",", lo que sigue, ",". está a la derecha), puede aprender de él un ejemplo #%c: el nombre completo de la clase donde el registro se encuentra #%m: el nombre del método donde el registro está ubicado #%m: Información de registro #%N: Salida Una ruptura de línea de retorno de carro #%L: Número de línea de salida en el código2. Llame Registro para probar los resultados de la configuración.
importar org.apache.log4j.logmanager; import org.apache.log4j.logger; import org.apache.log4j.propertyconfigurator; public class logPropertiestest {public static void main (string [] args) { /*archivos de configuración de parse en archivos no clasificados log4jpath = system.getProperty ("user.dir")+"// src // log // logProperties // log4j.properties"; PropertyConfigurator.Configure (log4jpath);*/ logger log = logManager.getLogger (logPropertIdest.class); log.debug ("debug"); log.info ("información"); log.warn ("advertencia"); log.error ("error"); log.fatal ("error fatal"); }}1.4 Configuración de nivel de registro
La configuración del nivel de registro se puede dividir en tres categorías. La configuración anterior es configurar el nivel de registro del registrador principal, la segunda categoría es configurar el nivel de registro del registrador de subclase, y la tercera categoría es configurar el nivel de registro de la fuente de salida (consola, archivo, etc.). Su prioridad de análisis a nivel de registro está organizada de baja a alta. Lamento no explicar claramente la declaración específica. ¡Debería poder entender el caso directamente!
1. Si el nivel de registro del registrador principal (rootLogger) (suponiendo que sea el nivel de información), el nivel de registro del registrador de subclase no está configurado y el nivel de registro de la fuente de salida no está configurado, la fuente de salida solo puede salir de nivel de información o arriba;
2. Si el nivel de registro del registrador principal (rootLogger) (suponiendo que es nivel de información), el nivel de registro del registrador de subclase (suponiendo que sea nivel de depuración) y el nivel de registro de la fuente de salida no está configurado, la salida del origen de salida está por encima del nivel de depuración;
3. Si el nivel de registro del registrador principal (rootLogger) (suponiendo que es el nivel de información), el nivel de registro del registrador de subclase (suponiendo que es el nivel de depuración) y el nivel de registro de la fuente de salida (suponiendo que es el nivel de información), la fuente de salida emite un nivel de información o más;
4. Si el nivel de registro del registrador principal (rootLogger) (suponiendo que sea el nivel de información), el nivel de registro del registrador de subclase no está configurado y el nivel de registro del registrador de subclase está configurado.
El nivel de registro de la fuente de salida (suponiendo que sea el nivel de depuración), entonces la fuente de salida emite un nivel de información o superior;
Por lo tanto, en el caso anterior podemos saber que hay 2 relaciones lógicas entre el registrador y el nivel de registro de salida de la fuente de salida:
1. Si la fuente de salida no define el nivel de registro, heredará el nivel de registro más cercano a su registrador de subclase; Si el registrador de subclase no define el nivel de registro, heredará el registrador principal más cercano a su registrador principal.
2. Al imprimir el registro, la fuente de salida se comparará con el nivel de registro definido por el registrador de subclase que está más cerca de él. Si el nivel definido por la fuente de salida es más alto que el registrador de subclase, el registro se emitirá de acuerdo con el nivel de registro definido por la fuente de salida, y viceversa.
Por lo tanto, en el proyecto, puede configurar el nivel de registro de acuerdo con el método de configuración diaria:
#Control El nivel de registro del registrador principal es información. De forma predeterminada, solo los registros de información sobre el nivel de información se emiten en todos los módulos log4j.rootlogger = info, console#console#control el nivel de registro de un módulo por separado a errores, y los registros se emiten solo cuando se produce una excepción log4j.logger.log.logProperties = Error#Control el nivel de registro de una clase por separado a Debug, convocatoria para emitir información debug debug. log4j.logger.log.logproperties.logpropertiestiest = debug ######################################################################################################################################. ###############################################################################################################################. ######################################################################################################################. ###############################################################################################################################. #Pecifique el nivel de registro de la fuente de salida actual. Con la configuración anterior, no necesita configurar este elemento #log4j.appender.console.threshold = info #Especifique el formato de salida del registro: formato flexible log4j.appender.console.layout = org.apache.log4j.patternlayaut #content de formato específico log4j.appender.console [%c.%m ()] -%m%n
1.5 Conclusión
En este punto, creo que tiene una comprensión básica de la configuración del registro. Hay muchas cosas en el artículo que pueden estar mal, y todos los héroes son bienvenidos a señalarlos. Escribí un artículo para resumirlo para poder comprender profundamente la configuración de esta tecnología, para que tenga una comprensión más profunda de ella.