especificación de registro de Java

Especificación de registro de Java

cual es el registro

Enciclopedia de Baidu: los dispositivos de red, los sistemas y los programas de servicio, etc., generarán un registro de eventos llamado registro durante la operación; cada línea del registro registra la descripción de las operaciones relacionadas, como la fecha, la hora, el usuario y la acción.

Wikipedia: Registrar el funcionamiento de equipos de cómputo o software como servidores

El archivo de registro proporciona registros precisos del sistema y finalmente localiza los detalles del error y la causa raíz de acuerdo con el registro. La característica de un registro es que describe algunos eventos discretos (discontinuos).

para que sirve el registro

  1. Depuración de impresión : es decir, puede usar el registro para registrar variables o registrar una parte de la lógica. Registre el proceso de ejecución del programa, es decir, los códigos que ejecuta el programa, para facilitar la resolución de problemas lógicos.
  2. Localización del problema : localiza rápidamente el problema cuando el programa es anormal o está fuera del valle, para que sea conveniente resolver el problema más adelante. Debido a que la depuración en línea no es posible, simular un entorno de producción en un entorno de prueba requiere mucho tiempo y es laborioso. Por lo tanto, es muy importante confiar en la información registrada en el registro para localizar el problema.
  3. Registro de comportamiento del usuario : registre la comodidad de la operación del usuario, que se utiliza para el análisis de big data, como monitoreo, control de riesgos, recomendación, etc. Este tipo de registro generalmente lo usan otros equipos para el análisis, y puede haber varios equipos, por lo que generalmente hay un cierto requisito de formato. Los desarrolladores deben registrar de acuerdo con este formato para facilitar el uso de otros equipos. Por supuesto, generalmente se acuerdan los comportamientos y las operaciones a registrar, por lo que el desarrollador tiene principalmente el papel de ejecución.
  4. Análisis de causa raíz (necesario para volcar el bote) : es decir, registrar registros en lugares clave. Es conveniente localizar el problema de cada terminal, y es posible localizar de quién es el problema.

Principios de impresión de registros

nivel de registro

Hay cinco niveles de registro comunes, a saber, error, advertencia, información, depuración y seguimiento.

  • error: registro de errores, que se refiere a errores graves que afectan el negocio normal y requieren monitoreo de configuración de operación y mantenimiento;
  • advertir: registros de advertencia, errores generales, tienen poco impacto en el negocio, pero necesitan atención de desarrollo;
  • info: registro de información, que registra información clave para la resolución de problemas, como el tiempo de llamada, los parámetros de entrada y salida, etc.;
  • depuración: se utiliza para desarrollar DEBUG, los datos de tiempo de ejecución en la lógica clave;
  • trace: La información más detallada, generalmente esta información solo se registra en el archivo de registro.

1. No puede usar directamente la API en el sistema de registro (Log4j, Logback), pero use la API en el marco de trabajo de registro SLF4J.

SLF4J es un marco de registro de modo de fachada, que favorece el mantenimiento y la unificación de los métodos de procesamiento de registros para varias clases, y puede reemplazar fácilmente el marco de registro subyacente sin modificar el código.

private static final Logger log = LoggerFactory.getLogger(XXX.class);

2. No imprima el registro de información en el cuerpo del bucle.

Trate de no imprimir registros de información en el cuerpo del ciclo

for (int i = 0; i < 10; i++) {
    log.info("....");
}

3. El registro debe imprimir los parámetros de entrada y salida del método.

No necesitamos imprimir muchos registros, solo necesitamos imprimir registros efectivos que puedan localizar rápidamente el problema.

¿Cuáles son los registros más efectivos y críticos? Por ejemplo, cuando entra el método, imprima los parámetros de entrada. Luego, cuando el método regresa, imprime los parámetros y devuelve el valor. Los parámetros de entrada son generalmente información clave, como ID de usuario o bizSeq. Por ejemplo:

public String testLogMethod(Document doc, Mode mode){
   log.debug(“method enter param:{}”,userId);
   String id = "666";
   log.debug(“method exit param:{}”,id);
   return id;
}

4. Seleccione el formato de registro apropiado

El formato de registro ideal debe incluir la información más básica: como la marca de tiempo actual (precisión general de milisegundos), el nivel de registro, el nombre del hilo, etc. Esto se puede configurar en el registro de inicio de sesión :

<property name="log.pattern"
              value="%d{HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>

    <!-- 控制台输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="com.lifecore.common.log.regex.LogbackPatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
<!--            <sensitive>true</sensitive>-->
        </encoder>
	</appender>

Si nuestro formato de registro ni siquiera registra la hora actual, entonces ni siquiera sabemos el punto de tiempo de la solicitud.

5. Se recomienda utilizar el marcador de posición de parámetro {} en lugar de empalmar con +.

Contador de ejemplo:

logger.info("Processing trade with id: " + id + " and symbol: " + symbol);
1

En el ejemplo anterior, usar el operador + para concatenar cadenas tiene una cierta pérdida de rendimiento.

Por ejemplo:

logger.info("Processing trade with id: {} and symbol : {} ", id, symbol); 
1

Usamos llaves {} como marcadores de posición en el registro, que es más elegante y conciso que usar el operador +. Además, en comparación con el contraejemplo, el uso de marcadores de posición es solo una acción de reemplazo que puede mejorar efectivamente el rendimiento.

6. Se recomienda utilizar un método asincrónico para generar registros.

Eventualmente, el registro se enviará a un archivo u otros flujos de salida, y se requerirá el rendimiento de IO. Si es asíncrono, puede mejorar significativamente el rendimiento de E/S.
A menos que existan requisitos especiales, se recomienda utilizar un método asíncrono para generar registros. Tome el inicio de sesión como ejemplo, es muy simple configurar la asincronía, solo use AsyncAppender

<appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="ASYNC"/>
</appender>
123

7. No utilice e.printStackTrace(), no imprima solo la mitad del registro de excepciones, sino que emita todos los mensajes de error.

Contador de ejemplo:

try{
  // 业务代码处理
}catch(Exception e){
  e.printStackTrace();
}
12345
try {
    //业务代码处理
} catch (Exception e) {
    // 错误
    LOG.error('你的程序有异常啦');
} 
123456
try {
    //业务代码处理
} catch (Exception e) {
    // 错误
    LOG.error('你的程序有异常啦', e.getMessage());
} 
123456

Ejemplo positivo:

try{
  // 业务代码处理
}catch(Exception e){
  log.error("你的程序有异常啦",e);
}
12345

razón:

El registro de pila impreso por e.printStackTrace() se intercala con el registro de código comercial y, por lo general, no es conveniente verificar el registro de excepciones.
La cadena generada por la instrucción e.printStackTrace() registra información de la pila. Si la información es demasiado larga y el bloque de memoria donde se encuentra el conjunto de constantes de cadena no tiene espacio, es decir, la memoria está llena, entonces la solicitud del usuario será atascado ~

8. Está prohibido habilitar la depuración en el entorno en línea.

Debido a que hay muchos registros de depuración en el sistema general y una gran cantidad de registros de depuración se utilizan en varios marcos, el disco puede estar lleno poco después de habilitar la depuración en línea, lo que afecta el funcionamiento normal del sistema empresarial.

9. No registrar excepciones y lanzar excepciones

El contraejemplo es el siguiente:

log.error("IO exception", e);
throw new MyException(e);
12

Si se implementa de esta manera, la información de la pila generalmente se imprime dos veces. Esto se debe a que cuando se detecta MyException, se imprimirá nuevamente.
Tal registro, o empaque y lanzamiento, ¡no use ambos! De lo contrario, sus registros se verán muy confusos.

9. Evite la doble impresión de registros

Evite imprimir registros repetidamente, lo que desperdiciará espacio en disco. Si ya tiene una línea de registro que expresa claramente el significado, evite la impresión redundante. El ejemplo inverso es el siguiente:

if(user.isVip()){
  log.info("该用户是会员,Id:{}",user,getUserId());
  //冗余,可以跟前面的日志合并一起
  log.info("开始处理会员逻辑,id:{}",user,getUserId());
  //会员逻辑
}else{
  //非会员逻辑
}
12345678

Si está utilizando el marco de registro de log4j, asegúrese de configurar additivity=false en log4j.xml, ya que puede evitar la impresión de registros repetidamente.
Ejemplo positivo:

<logger name="com.taobao.dubbo.config" additivity="false"> 
1

10. Separación de archivos de registro

Podemos separar diferentes tipos de registros, como access.log o error level error.log, que se pueden imprimir por separado en un archivo.
Por supuesto, también se puede imprimir en diferentes archivos de registro de acuerdo con diferentes módulos comerciales, de modo que sea más conveniente cuando solucionemos problemas y hagamos estadísticas de datos.

11. Para el módulo de funciones principales, se recomienda imprimir un registro más completo

En nuestro desarrollo diario, si el núcleo o la lógica es un código complejo, se recomienda agregar comentarios detallados y registros más detallados.

10. Separación de archivos de registro

Podemos separar diferentes tipos de registros, como access.log o error level error.log, que se pueden imprimir por separado en un archivo.
Por supuesto, también se puede imprimir en diferentes archivos de registro de acuerdo con diferentes módulos comerciales, de modo que sea más conveniente cuando solucionemos problemas y hagamos estadísticas de datos.

11. Para el módulo de funciones principales, se recomienda imprimir un registro más completo

En nuestro desarrollo diario, si el núcleo o la lógica es un código complejo, se recomienda agregar comentarios detallados y registros más detallados.
¿Qué tan detallado debe ser el registro? Piénselo, si hay un error en cualquier paso de su programa principal, puede ubicarlo a través del registro, entonces estará bien.

Supongo que te gusta

Origin blog.csdn.net/heroguo007/article/details/128846016
Recomendado
Clasificación