3.1 Lista de niveles de eventos

El registro es el proceso de registrar cualquier evento que ocurra mientras se ejecuta el programa. Tu deber como programador es record everything importantporque luego, cuando productionhaya errores extraños y/o graves, no tendrás nada más que estos logs.

Cualquier error se eliminará muchas veces más rápido si tienes toda la información sobre el mismo y sobre todo el historial de las llamadas. Pero de aquí se deduce una conclusión simple: registrar todo en general: llamadas de todos los métodos, valores de todos los parámetros.

Esta tampoco es una opción: demasiada información es tan mala como muy poca. Necesitamos registro inteligente. Hecho por el hombre para el hombre. Y aquí llegamos al primer hecho sobre el registro: todas las entradas en el registro se dividen en categorías incluso en el momento de su creación.

Lista de niveles de eventos

El programador, al escribir un evento en el registro, debe decidir por sí mismo qué tan importante es esta información. El nivel de gravedad del evento lo elige el autor del mensaje. Hay log4j5 niveles de importancia de la información registrada:

  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

A continuación, hablaremos de ellos con más detalle.

3.2 DEPURAR

El nivel DEBUGse considera el menos importante. La información que se escribe en el registro con este nivel de importancia solo se necesita durante la depuración de la aplicación. Para registrar la información necesaria durante la depuración, se utiliza el método debug().

Ejemplo:

class Manager {
    private static final Logger logger = LoggerFactory.getLogger(Manager.class);

    public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

Preste atención, el método debugestá al principio del método (el método aún no ha tenido tiempo de hacer nada) y escribe el valor de la variable pasada al método en el registro. Este es el caso de uso más común para el método debug().

3.3 INFORMACIÓN y ADVERTENCIA

Los siguientes dos niveles son INFOy WARN. Hay dos métodos para ellos: info()y warn().

El nivel INFOse usa simplemente para mensajes informativos: esto y aquello sucede. Cuando comienza a analizar un error en el registro, puede ser muy útil para leer su fondo. El método es perfecto para esto info().

El nivel WARNse usa para escribir advertencias (de la palabra advertencia ). Por lo general, con este nivel de importancia, se escribe información de que algo salió mal, pero el programa sabe qué hacer en esta situación.

Por ejemplo, en el proceso de escribir un archivo en el disco, resultó que dicho archivo ya existe. Aquí el programa puede registrar una advertencia (advertencia), pero mostrar al usuario un cuadro de diálogo y ofrecer seleccionar un nombre de archivo diferente.

Ejemplo:

class FileManager {
    private static final Logger logger = LoggerFactory.getLogger(FileManager.class);

    public boolean saveFile(FileData file) {
        logger.info(“save the file ” + file.getName());
        boolean resultOK = SaveUtils.save(file);
        if (resultOK) return true;

        logger.warn(“file writing problem ” + file.getName());
        String filename = Dialog.selectFile();
        boolean result = SaveUtils.save(file, filename);
        return result;
    }

3.4 ERROR y FATAL

Finalmente, los dos niveles de registro más importantes son ERRORy FATAL. Para ellos, también existen métodos especiales con los mismos nombres: error()y fatal().

También decidieron dividir los errores en dos categorías: errores ordinarios y errores fatales . Un error fatal suele provocar un bloqueo de la aplicación (para aplicaciones de escritorio) o un bloqueo del servicio web (para aplicaciones web).

Otro buen ejemplo es el sistema operativo Windows. Si su programa acaba de colapsar, entonces desde el punto de vista del sistema operativo, esto es Error. Y si el propio sistema operativo se ha caído y ves la pantalla azul de la muerte de Windows, entonces esto ya está Fatal error.

En las aplicaciones Java, los eventos suelen Errorestar Fatalasociados con excepciones generadas. Ejemplo:

class Manager {
    private static final Logger logger = LoggerFactory.getLogger(Manager.class);

    public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

3.5 Qué registrar

Por supuesto, no vale la pena registrar todo seguido. En la mayoría de los casos, esto empeora drásticamente la legibilidad del registro y, después de todo, el registro se escribe en primer lugar para poder leerlo.

Además, no puede escribir información personal y financiera diversa en el registro. Ahora bien, con esto de forma estricta y sencilla te puedes encontrar con multas o demandas judiciales. Tarde o temprano, dicho registro se filtrará hacia un lado y luego no habrá problemas.

Entonces, ¿qué se debe registrar?

Primero, debe registrar el inicio de la aplicación . Una vez que se haya iniciado la aplicación, se recomienda registrar su modo de operación y varias configuraciones importantes; esto facilitará la lectura del registro en el futuro.

En segundo lugar, debe registrar el estado de todos los servicios de terceros con los que funciona su aplicación: sistemas de correo, cualquier servicio externo. Como mínimo, debe asegurar el momento de la conexión con ellos para asegurarse de que funcionan correctamente.

En tercer lugar, todas las excepciones deben registrarse . Si se esperan, la información sobre ellos se puede escribir de forma compacta. La información completa sobre las excepciones brinda entre el 50 % y el 80 % de la información importante cuando se busca un error.

También debe registrar el cierre de la aplicación . La aplicación debe terminar normalmente y no arrojar docenas de errores en el registro. A menudo, en este lugar puede encontrar tareas atascadas, problemas con el grupo de subprocesos o problemas con la eliminación de archivos temporales.

Asegúrese de registrar todo lo relacionado con la seguridad y la autorización del usuario . Si un usuario intenta iniciar sesión o restablecer su contraseña 10 veces seguidas, esta información debería reflejarse en los registros.

Registre la mayor cantidad de información posible sobre tareas asincrónicas ; las excepciones a menudo se pierden en tales subprocesos. Para una tarea asíncrona, asegúrese de registrar su inicio y finalización. La finalización exitosa debe registrarse de la misma manera que una problemática.

¿Qué otra cosa? Lanzamiento de tareas cronometradas, lanzamiento de tareas almacenadas SQL-procedures, sincronización de datos, todo lo relacionado con transacciones distribuidas. Creo que es suficiente para empezar. Se agregará a esta lista en el futuro.