SpringBoot Series (3) ---- Cierto programador se quedó calvo de la noche a la mañana debido al problema del "registro"

Cierto programador se quedó calvo de la noche a la mañana debido al problema del "registro". ¿Es esto una decadencia moral o por algo? . . .

A las dos de la madrugada en plena noche. Un programador concienzudo, Xiao Zhang, está frente a la computadora y escribe en el teclado. Está desarrollando un gran sistema que la empresa no puede ofrecer. Dado que este sistema es un poco grande, a Xiao Zhang siempre le gusta System.out.println("");imprimir algunos datos clave en la consola para verlos fácilmente para depurarlos o probarlos .

Después de un período de tiempo, Xiao Zhang finalmente desarrolló el sistema a expensas de perder innumerables cabellos. Sin embargo, un día, el jefe corrió hacia Xiao Zhang y le dijo: "Xiao Zhang. ¿Hay System.out.println("");demasiado en tu sistema? Puedes deshacerte de él". No hay forma, Xiao Zhang solo puede salvar su trabajo. System.out.println("");Deshazte de esto bajo la lascivia del jefe .

Xiao Zhang simplemente lo System.out.println("");quitó, y el jefe corrió y dijo: "Creo que el resultado es bastante bueno. Podemos entender el estado de ejecución del proyecto a través de la consola". Xiao Zhang saludó a los miembros de la familia del jefe en su corazón con eso. hora. . . .

Xiao Zhang se fumó un cigarrillo para calmarse. Pensando en ello, ¿no estaría bien si lo escribiera en un archivo para poder controlarlo más tarde? Xiao Zhang pensó, ¿es hora de System.out.println("");volver? No, no, es demasiado problema, pensó Xiao Zhang, solo escribo un marco para registrar la información del sistema. Solo hazlo.

Luego fue otro día calvo. Xiao Zhang finalmente escribió el marco. Ponle un zhanglogging.jarnombre:. El rendimiento de este marco no es malo y Xiao Zhang está muy satisfecho con este marco. Sin embargo, hay circunstancias impredecibles. Con el progreso de los tiempos, Xiao Zhang siente que las funciones de este marco son un poco rudimentarias y ya no pueden seguir el ritmo de los tiempos. Xiao Zhang de repente pensó en algunas funciones altas, como el modo asincrónico, el archivo automático y la colocación de registros diarios en un archivo, ordenados por días. espera espera espera…

A continuación, hay algunos días el cabello, no diga, Zhang con excelente tecnología, y finalmente a la segunda generación desarrollado marco de registro, y darle el nombre de: zhanglogging-good.jar. Pero el cabello de Xiao Zhang se vuelve cada vez menos. A los pocos días de una buena vida, el problema que enfrentó Xiao Zhang volvió a aparecer. La API o algún diseño del nuevo marco escrito por Xiao Zhang puede ser un poco diferente del antiguo marco escrito antes. entonces que debemos hacer? Sólo puede quitar antes de que el viejo marco y poner en un nuevo marco para la revisión de la API correspondiente antes, sino también para mejorar algunas características y, por último, un marco perfecto salir, Zhang será nombrado de la siguiente manera: zhanglogging-prefect.jar;.

Pero el problema vuelve a aparecer, el código debe cambiarse cada vez que se cambia el marco, lo cual es demasiado problemático. Xiao Zhang de repente pensó en un patrón. Piense en la relación entre JDBC y los controladores de bases de datos. Ahora escribimos que las bases de datos son programación orientada a interfaces, solo necesitamos poner la implementación de la base de datos en ella. Xiao Zhang dijo, ¿por qué no diseño mi marco así? Solo hazlo.

Xiao Zhang escribió una capa de interfaz unificada para todos los marcos de registro, denominada fachada de registro (capa abstracta de registros) , denominada :, zhanglogging-abstract.jaral codificar en el futuro, solo para zhanglogging-abstract.jarprogramación, qué registro desea usar El marco solo necesita importar implementaciones de registros específicas en el proyecto. Todos los marcos de registro anteriores son capas de abstracción implementadas. Xiao Zhang realmente se rompió el corazón por la compañía, y su cabello se está volviendo cada vez menos. Hagamos una conexión de tres teclas para Xiao Zhang .

A continuación llegamos al tema de hoy:

Selección del marco de trabajo de registro SpringBoot

Hay muchos marcos de registro en desarrollo, como JUL (java.util.logging), JCL (Apche Commons Logging), Log4j, Log4j2, Logback, SLF4j, jboss-logging, etc.

Fachada de registro (la capa de abstracción del registro) Implementación de registros
JCL (Jakarta Commons Logging) SLF4j ging Simple Logging Facade para Java)jboss-logging Log4j JUL (java.util.logging) Log4j2 Logback
  • El uso del marco de registro de SpringBoot significa que necesitamos una capa de abstracción y una capa de implementación. SpringBoot elige SLF4jser la capa de abstracción logbackcomo capa de implementación . Lo que quiero decir aquí es que la capa inferior de SpringBoot es el marco de Spring, y el marco de Spring toma por defecto JCL como la capa de abstracción.

Uso de SLF4j

Cómo utilizar SLF4j en el sistema

(Ya lo hemos importado para nosotros al crear un nuevo proyecto slf4j和logback) ¿Cómo usar SLF4j en el sistema? En el desarrollo futuro, la llamada del método de registro no debe llamar directamente a la clase de implementación de registro, sino llamar al método en la capa de abstracción de registro .

  • SLF4 ofrece oficialmente un ejemplo sencillo:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
    
    
  public static void main(String[] args) {
    
    
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}
  • La siguiente figura es un ejemplo oficial de SLF4J que combina varios marcos de registro. En la figura, se puede ver claramente que la API de SLF4J siempre será la fachada del registro y se aplicará directamente a la aplicación. slf4j manual del usuario del sitio web oficial
    Inserte la descripción de la imagen aquí
    Cada marco de implementación de registros tiene su propio archivo de configuración. Después de usar slf4j, el archivo de configuración aún se convierte en el archivo de configuración del propio marco de implementación de registros;

Problema restante

Queremos escribir un proyecto SpringBoot. Planeamos usar la combinación del marco de registro Slf4j+logback, pero el proyecto integra Spring, Hibernate, MyBatis y otras dependencias de componentes. En este momento, habrá un problema, es decir, nuestro marco de componentes integrado tiene su propio marco de registro. Por ejemplo, Spring viene con él, commons-logging、Hibernate(jboss-logging)etc. En este momento, nuestro proyecto es como una mezcolanza de marcos de registro, lo cual es muy complicado, entonces necesitamos unificar los marcos de registro en nuestro proyecto, es decir, no importa en qué componentes confío Qué marco de registro viene, solo necesito configurar el mío Slf4j+logback.

Echemos un vistazo a la documentación oficial.
Inserte la descripción de la imagen aquí
Necesitamos introducir la superposición de los registros de nuestros componentes por separado. Debido a que queremos eliminar los registros del componente, es imposible eliminar el paquete del marco de registro del componente. Esto hará que el componente se bloquee, y se devolverá el código fuente subyacente. No se bloquea, por lo que cuando eliminamos el paquete jar del marco de registro de otros componentes, necesitamos importar una capa del paquete jar de superposición. Este jar todavía tiene la API del original marco de registro del componente, y el componente se ejecuta sin errores, lo que equivale a más. Hacemos una capa de adaptación, llamamos Slf4j+logback, y luego llamamos al marco de registro de cada componente a través de esta capa de adaptación.

Cómo unificar todos los registros del sistema en slf4j;

1. Excluya primero otros marcos de registro en el sistema;

2. Reemplace el marco de registro original con un paquete intermedio;

3. Importamos otras implementaciones de slf4j

Relación de registro de SpringBoot

  • pom.xmEl contenido del archivo en el nuevo proyecto se introduce automáticamente
  • Un iniciador se introduce en pom.xml. De hecho, cada iniciador introduce una gran cantidad de dependencias, entonces, ¿cómo lo verificamos, como se muestra a continuación?
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

  • Haga doble clic para ingresar al spring-boot-starter-loggingmedio, puede ver lo siguiente
	<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <version>2.4.3</version>
      <scope>compile</scope>
    </dependency>

para resumir:

  • La capa inferior de SpringBoot también se usa slf4j+logbackpara registrar
  • SpringBoot también reemplazó otros registros con slf4j;
  • Paquete de reemplazo intermedio
    Inserte la descripción de la imagen aquí
  • Si queremos introducir otros frameworks. Asegúrese de eliminar la dependencia de registro predeterminada de este marco . El marco de Spring usa commons-logging;
  • SpringBoot puede adaptarse automáticamente a todos los registros, y la capa inferior usa slf4j + logback para registrar los registros. Al introducir otros marcos, solo necesita eliminar el marco de registro del que depende este marco.

Uso del registro

Cuando ejecutamos directamente la clase de prueba del proyecto recién creado, descubrimos que SpringBoot nos ayudó a configurar el registro

  • Modifique la clase de prueba:
@SpringBootTest
class SpringbootLoggingApplicationTests {
    
    

    //记录器
    Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    void contextLoads() {
    
    
        //trace<debug<info<warn<error
        logger.trace("这是trace日志");
        logger.debug("这是debug日志");
        logger.info("这是info日志");
        logger.warn("这是warn日志");
        logger.error("这是error日志");
    }
}

Cuando se crea una instancia del registrador en la nueva versión de la idea, se
Logger logger=LoggerFactory.getLogger(getClass());
importará automáticamente y
import org.junit.platform.commons.logging.Logger;
import org.junit.platform.commons.logging.LoggerFactory;
deberá reemplazarse manualmente con
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Nivel de registro:

  • De menor a mayor trace<debug<info<warn<errorpara ajustar el nivel de salida del registro;
  • El registro solo tendrá efecto en niveles superiores después de este nivel
  • SpringBoot nos usa por defecto el infonivel, si no hay un nivel especificado, use el nivel especificado por SpringBoot por defecto; es decir, info es nuestro nivel raíz

Puede ver que solo se emite la información y los niveles superiores.
Inserte la descripción de la imagen aquí

  • Modifique en el archivo de configuración principal de la siguiente manera
logging.level.com.cz=trace

Significa que todas las clases de nuestro paquete cz se ajustan al tracenivel

Inserte la descripción de la imagen aquí

  • Continúe modificando el contenido del archivo de configuración, y luego los explicaré uno por uno.
logging.level.com.cz=trace

#当前项目下生成springboot.log日志
logging.file.name=springboot.log

# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
#logging.file.path=/spring/log

#  在控制台输出的日志的格式
logging.pattern.console=%d{
    
    yyyy-MM-dd} [%thread] %-5level %logger{
    
    50} - %msg%n

# 指定文件中日志输出的格式
logging.pattern.file=%d{
    
    yyyy-MM-dd} === [%thread] === %-5level === %logger{
    
    50} ==== %msg%n
  • logging.file.name
    Especificar la generación de registros en un archivo

Inserte la descripción de la imagen aquí

  • logging.pattern.console

    • Este último %d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%nes el formato especificado por nosotros mismos.
      Inserte la descripción de la imagen aquí
  • Formato de salida del registro:

    • %d: Indica la fecha y la hora,
    • %thread: Representa el nombre del hilo,
    • %-5level: El nivel se muestra a 5 caracteres de ancho desde la izquierda.
    • %logger{50}: Indica que el nombre del registrador puede tener hasta 50 caracteres, de lo contrario se dividirá por puntos.
    • %msg: Mensaje de registro,
    • %n: Es un carácter de nueva línea

Ubicación designada

Si aún necesitamos usar funciones como el registro asincrónico, es posible que necesitemos escribir archivos de configuración específicamente para el registro. Para obtener más información, consulte la descripción del archivo de configuración de registro oficial

  • Simplemente coloque el archivo de configuración de cada marco de registro en la ruta de clase; SpringBoot no usa su configuración predeterminada
Sistema de registro Personalización
Volver a iniciar sesión logback-spring.xml, logback-spring.groovy, logback.xmlOlogback.groovy
Log4j2 log4j2-spring.xml o log4j2.xml
JDK (registro de utilidades de Java) logging.properties

Podemos crear un logback.xml y colocarlo en el directorio de recursos, que contiene el contenido relevante de nuestra configuración de registro, solo créelo directamente, no es necesario configurar nada, SpringBoot reconocerá automáticamente

logback.xml: Es reconocido directamente por el marco de registro;

logback-spring.xml: El marco de registro no carga directamente los elementos de configuración del registro. SpringBoot analiza la configuración del registro y se puede utilizar la función de perfil avanzado de SpringBoot

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
  	可以指定某段配置只在某个环境下生效
</springProfile>

Tal como:

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--
        日志输出格式:
			%d表示日期时间,
			%thread表示线程名,
			%-5level:级别从左显示5个字符宽度
			%logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
			%msg:日志消息,
			%n是换行符
        -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <springProfile name="dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
            <springProfile name="!dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
        </layout>
    </appender>

Si se usa logback.xmlcomo un archivo de configuración de registro y también se usa la función de perfil, se producirán los siguientes errores
no applicable action for [springProfile]

Cambiar marco de registro

Pero no se recomienda cambiar . La gente tiene el marco de registro actual después de años de pruebas. Solo eche un vistazo a las siguientes cosas.

Inserte la descripción de la imagen aquí

Luego será excluido de la dependencia. En este momento, solo necesitamos introducir la capa de implementación del registro que queremos cambiar en pom.xml.

Supongo que te gusta

Origin blog.csdn.net/weixin_43844418/article/details/113986343
Recomendado
Clasificación