El registro de Log4j2 es fácil de usar

uso del registro log4j2

1. Introducción a log4j2

Apache Log4j2 es una versión mejorada de Log4j.
Log4j2 se basa en algunos diseños excelentes de logback y soluciona algunos problemas, lo que aporta algunas mejoras importantes, que incluyen principalmente: 1.
Manejo de excepciones: en el logback, las excepciones en Appender no serán notadas por la aplicación. , pero se proporcionan algunos mecanismos de manejo de excepciones en log4j2.
2. Mejora del rendimiento: en comparación con log4j 1 y logback, log4j2 tiene una mejora de rendimiento obvia, que es aproximadamente 10 veces mayor que la de logback en configuración asincrónica.
3. Configuración de recarga automática: en referencia al diseño de inicio de sesión, proporciona una configuración de parámetros de actualización automática, que puede modificar dinámicamente el nivel de registro sin reiniciar la aplicación.
4. Mecanismo libre de basura: en la mayoría de los casos, log4j2 puede utilizar su mecanismo libre de basura diseñado para evitar jvm gc causado por la recopilación frecuente de registros.

Para obtener más información, consulte su documentación oficial: http://logging.apache.org/log4j/2.x/manual/configuration.html

Log4j2 se puede utilizar como implementación de registro o fachada de registro, pero en el desarrollo diario se acostumbra utilizar log4j2 como implementación de registro y slf4j como fachada de registro.

2. Practica

2.1 dependencia de pom

  1. Si es una prueba de un proyecto maven local:

    Después de 2.9, se agrega un nuevo formato de visualización para los números de proceso:%processId

    Como fachada de registro y para implementar ****, log4j2 necesita importar las siguientes dependencias:

    <dependencies>
        <!--log4j依赖:api和core-->
        <!--log4j日志门面-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.13.3</version>
        </dependency>
        <!--log4j日志实现-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.13.3</version>
        </dependency>
    </dependencies>
    
    
    

    slf4j sirve como fachada del registro y log4j2 sirve como las dependencias de importación necesarias para la implementación del registro:

    <dependencies>
        <!--使用slf4j作为日志门面-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.28</version>
        </dependency>
        <!--使用log4j的适配器进行绑定-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!--log4j日志实现-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.13.3 </version>
        </dependency>
    </dependencies>
    
  2. Si es un proyecto Springboot, debe citar las siguientes dependencias:

    Si el paquete de dependencia spring-boot-starter-web se importa al proyecto, recuerde eliminar la dependencia de registro propia de spring spring-boot-starter-logging, de la siguiente manera:

    <dependencies>
       <!--springboot工程需要使用的log4j2的依赖--> 
    	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
     	<!--如果引用由web的依赖,需要排除掉spring自带的logging日志依赖-->   
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>    
    
    

2.2 Archivo de configuración

Después de agregar las dependencias anteriores, debe agregar un archivo de configuración log4j2.xmly colocarlo en resourcesel directorio:

<?xml version="1.0" encoding="UTF-8"?>
<!-- status表示设置的日志级别,高于该级别的日志显示,monitorInterval配置成一个正整数,则每隔指定的时间(秒),
        log4j2会刷新一次配置。如果不配置则不会动态刷新 -->
<configuration status="info" monitorInterval="600" >

    <properties>
        <property name="LOG_HOME">./logs</property>
        <!--info日志的标准输出文件名字-->
        <property name="FILE_NAME_INFO">std</property>
        <!--error日志的标准输出文件名字-->
        <property name="FILE_NAME_ERROR">error</property>
        <!--日志输出的格式-->
        <!--日期时间|日志级别|所属类的全类名|线程名|进程号|方法名|日志信息-->
        <property name="PATTERN_LAYOUT">%d{yyyy-MM-dd HH:mm:ss}|%-5level|%c{5}|%t|%processId|%M|%m%n</property>
    </properties>
    <!--先定义所有的appender -->
    <Appenders>
        <!--这个输出控制台的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式 引用定义的格式-->
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
        </Console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
        <!--append为true表示消息追加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
        <RollingRandomAccessFile   name="info" fileName="${LOG_HOME}/${FILE_NAME_INFO}.log" append="true"
                                   filePattern="${LOG_HOME}/${FILE_NAME_INFO}.log.%d{yyyy-MM-dd}">
            <Policies>
                <!--TimeBasedTriggeringPolicy :时间滚动策略,默认0点小时产生新的文件, modulate="true" : 产生文件是否以0点偏移时间-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--       日志输出格式     -->
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
        </RollingRandomAccessFile  >

        <!--添加过滤器Filters,可以有选择的输出某个级别以上的类别  onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝  -->
        <RollingRandomAccessFile   name="error" fileName="${LOG_HOME}/${FILE_NAME_ERROR}.log"
                                   filePattern="${LOG_HOME}/${FILE_NAME_ERROR}.log.%d{yyyy-MM-dd}">
            <Policies>
                <!--TimeBasedTriggeringPolicy :时间滚动策略,默认0点小时产生新的文件, modulate="true" : 产生文件是否以0点偏移时间-->
                <TimeBasedTriggeringPolicy/>
            </Policies>

            <Filters>
                <!--记录error级别信息 -->
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!--输出日志的格式 -->
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
        </RollingRandomAccessFile  >
    </Appenders>


    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="error" />
            <appender-ref ref="info"/>
        </root>
        <!--向root上报这个包下的debug级别的日志-->
        <logger name = "com.kevin" level="debug" />
    </loggers>
</configuration>

2.3 Código de prueba

package com.kevin.log4j;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;

/**
 * @Author Kevin
 * @Date 22:04 2023/4/18
 * @Description
 */
public class Log4j2Demo {
    
    

    private static  Logger log = LogManager.getLogger();
    @Test
    public void log4j2DemoTest1(){
    
    
        System.out.println("===========显示打印Debug日志信息=============");
        log.debug("log level is DEBUG:{}","this is DEBUG log...");
        
        System.out.println("===========显示打印Info日志信息=============");
        log.info("log level is INFO:{}","this is INFO log...");
        
        System.out.println("===========显示打印Warn日志信息=============");
        log.warn("log level is WARN:{}","this is WARN log...");
        
        System.out.println("===========显示打印Error日志信息=============");
        log.error("log level is ERROR:{}","this is ERROR log...");
    }
}

Insertar descripción de la imagen aquí

Salida de consola:
Insertar descripción de la imagen aquí

Resultados en el archivo de registro:
Insertar descripción de la imagen aquí

Formato del archivo de configuración: el archivo de configuración log2j puede estar en formato xml o json.La
ubicación del archivo de configuración: de forma predeterminada, log4j2 buscará archivos con nombres como log4j2.xml, log4j.json, log4j.jsn, etc. en el directorio classpath. Si no se encuentra ninguno, se generará de acuerdo con la configuración predeterminada, es decir, se enviará a la consola. También puede personalizar la ubicación del archivo de configuración (que debe configurarse en web.xml ) Generalmente se coloca en el directorio raíz de src/main/resources.

El nombre del archivo de configuración: debe ser log4j2

Error personal: configuré log4j2.xml en log4j.xml. Como resultado, log4j2 no encontró la configuración xml correspondiente y la envió a la consola de acuerdo con la configuración predeterminada: solo se muestra información de registro de nivel de error:
Insertar descripción de la imagen aquí

2.4 Explicación detallada de los archivos de configuración

La configuración del archivo log4j2.xml es aproximadamente la siguiente:

  • Configuración
    • propiedades
    • Anexos
      • Consola
        • Diseño de patrón
      • Archivo
      • Archivo de acceso aleatorio rodante
      • asíncrono
    • Registradores
      • registrador
      • Raíz
        • AppenderRef

1. Configuración: es el nodo raíz y tiene múltiples atributos como estado y monitorInterval.

  • estado: Se utiliza para indicar el nivel de registro que controla log4j2. Los niveles de valores de pequeño a grande son: "trace", "debug", "info", "warn", "error" y "fatal" . Solo se utilizarán los niveles superiores Se mostrarán los registros con el nivel de valor de estado.
  • monitorInterval: con qué frecuencia se vuelve a leer el archivo de configuración y la configuración se puede modificar sin reiniciar la aplicación Unidad de tiempo: segundos;

2. Anexos: fuente de salida, utilizada para definir la salida del registro.
Log4j2 admite muchas fuentes de salida, incluidas Consola, Archivo, RollingRandomAccessFile, MongoDB, Flume, etc.

  • Consola: fuente de salida de la consola, que imprime registros en la consola. Generalmente se configura durante el desarrollo para la depuración.

  • Archivo: fuente de salida del archivo, escribe el registro en el archivo especificado, debe configurar la ubicación de entrada (por ejemplo: ./app/logs)

  • RollingRandomAccessFile: Esta fuente de salida también escribe en un archivo. La diferencia es que es más potente que File. Puede especificar que cuando el archivo alcance un cierto tamaño (como 20 MB), se iniciará otro archivo para continuar escribiendo el registro. Otro archivo involucrará un archivo nuevo. Reglas de nomenclatura, por lo que necesita configurar reglas de nomenclatura de archivos; este método es más práctico, porque no puede seguir escribiendo en un archivo. Si continúa escribiendo, el archivo será demasiado grande y se congelará. al abrir, y no será conveniente encontrar el registro.

    RollingRandomAccseeFile: tiene los siguientes atributos comunes:

    • fileName especifica la ubicación y el nombre del archivo de registro actual
    • filePattern especifica las reglas de transferencia de archivos y cambio de nombre cuando se produce el desplazamiento. La mayoría de ellos utilizan el tiempo .log. para el desplazamiento:filePattern="${LOG_HOME}/${FILE_NAME_INFO}.log.%d{yyyy-MM-dd}">
    • SizeBasedTriggeringPolicy especifica que Rolling se activa cuando el tamaño del archivo es mayor que el valor especificado por tamaño.
    • DefaultRolloverStrategy especifica la cantidad máxima de archivos para guardar
    • La configuración de TimeBasedTriggeringPolicy debe usarse junto con filePattern. Tenga en cuenta que la regla de cambio de nombre de archivo configurada en filePattern es ${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i, y la granularidad de tiempo mínima es mm. que son minutos; si el tamaño especificado es 1, la combinación generará un nuevo archivo cada 1 minuto. Si se cambia a %d{aaaa-MM-dd HH}, la granularidad mínima es hora y se generará un archivo cada hora.

3. PatternLayout: formato de salida del registro

  • La consola o la fuente de salida del archivo (Consola, Archivo, RollingRandomAccessFile) debe contener un nodo PatternLayout, que se utiliza para especificar el formato del archivo de salida (como el número de línea del método del archivo de tiempo de la salida del registro, etc.)

  • Por ejemplo%d{yyyy-MM-dd HH:mm:ss}|%-5level|%c{5}|%t|%processId|%M|%m%n

  • Fecha y hora | Nivel de registro | Nombre completo de la clase a la que pertenece | Nombre del hilo | Número de proceso | Nombre del método | Información de registro

    # 日志常用的显示格式含义:
    %c 输出所属类的全名,可写为 %c{Num} ,Num类名输出的范围 如:"com.kevin.study.DemoClass",%C{2}将使日志输出输出范围为:study.DemoClass
    %d 输出日志时间其格式为 可指定格式 如 %d{yyyy-MM-dd HH:mm:ss}等
    %l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
    %n 换行符
    %m输出代码指定信息,如info(“message”),输出message 一般输出:%m%n放在最后
    %msg 显示日志文本
    %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
    %-5p 输出日志的优先级,即 FATAL ,ERROR 等; 与-5level效果一样
    %r 输出从启动到显示该条日志信息所耗费的时间(毫秒数)
    %t 输出产生该日志事件的线程名
    %processId 输出进程号,2.9之后新增
    %M 显示方法名
    

4. Registradores: Registrador

Los registradores se dividen en: registrador raíz y registrador personalizado. Cuando el registrador especificado no se puede obtener de acuerdo con el nombre del registro, se utiliza Root como registrador predeterminado. Al personalizar, debe especificar el nombre de cada registrador (para el nombre se puede usar el nombre del paquete como el nombre del registro, diferentes paquetes están configurados con diferentes niveles, etc.), nivel de registro, aditividad (si se hereda el registrador configurado a continuación), para registradores generales (como Consola, Archivo, RollingRandomAccessFile) Generalmente, es necesario configurar una o más fuentes de salida AppenderRef;

Cada registrador puede especificar un nivel (TRACE, DEBUG, INFO, WARN, ERROR, ALL o OFF). Si no se especifica, el nivel predeterminado es ERROR.

La aditividad especifica si se debe enviar el registro al agregador de la clase principal al mismo tiempo. El valor predeterminado es verdadero.

5. Propiedades: las propiedades
se utilizan para definir constantes como referencia en otras configuraciones, esta configuración es opcional, por ejemplo:

  • Defina la ubicación de almacenamiento del registro, en la carpeta de registros en el directorio actual:<property name="LOG_HOME">./logs</property>
  • Defina el formato de salida del registro:<property name="PATTERN_LAYOUT">%d{yyyy-MM-dd HH:mm:ss}|%5p|%c{5}|%t|%processId|%M|%m%n</properties>

Supongo que te gusta

Origin blog.csdn.net/weixin_43155804/article/details/130279633
Recomendado
Clasificación