JavaRush /Blog Java /Random-ES /Registro de Java. Desenrollar una bola de stectrace

Registro de Java. Desenrollar una bola de stectrace

Publicado en el grupo Random-ES
"Buenas tardes, hoy se registró un incidente en el sitio industrial, solicito al desarrollador que se una al grupo de análisis." Uno de tus días de trabajo podría comenzar así, o podría ser por la mañana, no importa. Pero empecemos desde el principio. Al resolver problemas aquí en JavaRush, aprenderá a escribir código que funcione y haga lo que se espera de él. Si miras la sección de ayuda , está claro que esto no siempre funciona a la primera. En el trabajo será lo mismo. No siempre solucionarás un problema a la primera: los errores son nuestros eternos compañeros. Es importante que puedas restaurar los eventos del error. Inicio sesión.  Desenrollar una bola de stectrace - 1Comencemos con un ejemplo. Imaginemos que eres policía. Lo llamaron al lugar del incidente (se rompió un vidrio en una tienda), llegó y están esperando respuestas suyas sobre lo sucedido. ¿Dónde empezar? No sé cómo trabaja la policía. De manera muy condicional: empiezan a buscar testigos, pruebas y todo eso. ¿Y si el propio lugar pudiera contarte en detalle lo que pasó? Por ejemplo, así:
  • 21:59 propietario activó la alarma (5 minutos hasta que se active por completo)
  • 22:00 el dueño cerró la puerta.
  • 22:05 activación total de alarma
  • 22:06 el dueño tiró de la manija
  • 23:15 sensor de ruido activado
  • 23:15 pasó corriendo una jauría de perros ladrando fuerte
  • 23:15 sensor de ruido apagado
  • 01:17 el sensor de impacto en el cristal exterior de la vitrina encendido
  • 01:17 una paloma voló hacia el cristal.
  • 01:17 el vidrio se rompió
  • 01:17 sirena encendida
  • 01:17 la paloma se sacudió y se fue volando.
Bueno, no hace falta profundizar mucho en esos detalles; inmediatamente queda claro lo que pasó. Lo mismo está en desarrollo. Es genial cuando puedes saber por las grabaciones lo que pasó. Ahora quizás estés recordando la depuración, porque puedes depurar todo. Pero no. Te fuiste a casa y por la noche todo se rompió, no hay nada que depurar: hay que entender por qué se rompió y arreglarlo. Aquí es donde entran en juego los registros, la historia de todo lo que pasó durante la noche. A lo largo del artículo, le sugiero que piense en cuál es uno de los registradores más famosos (no realmente un registrador, más bien un monitoreo), del que probablemente todos los que escuchan (miran) las noticias hayan oído hablar. Gracias a él, se restablecen algunos eventos. Ahora pongámonos serios. Iniciar sesión en Java es el proceso de registrar cualquier evento que ocurra en el código. Es su responsabilidad como programador escribir lo que hizo su código, porque luego se le entregarán estos registros para su análisis. Si todo se hace bien, cualquier error se solucionará y solucionará muy rápidamente. Aquí probablemente no profundizaré en qué tipo de registradores existen. En este artículo nos limitaremos a lo simple java.util.Logger: es más que suficiente para conocernos. Cada entrada del registro contiene fecha y hora, nivel de evento y mensaje. La fecha y la hora se introducen automáticamente. El nivel del evento lo elige el autor del mensaje. Hay varios niveles. Los principales son información, depuración, error.
  • INFORMACIÓN: por lo general, estos son mensajes de información sobre lo que está sucediendo, algo así como una historia por fecha: 1915: algo sucedió, 1916: algo más.
  • DEBUG: describe los eventos de un momento particular con más detalle. Por ejemplo, los detalles de una batalla en la historia están en el nivel de depuración." El comandante Takoytovich avanzó con su ejército hacia el pueblo de Selovicha ."
  • ERROR: los errores que ocurren generalmente se escriben aquí. Probablemente hayas notado que cuando envuelves algo en try-catch, el bloque catchse sustituye por e.printStacktrace(). Solo genera la entrada a la consola. Usando un registrador, puedes enviar esta entrada al registrador (jaja), ya entiendes la idea.
  • ADVERTENCIA: las advertencias están escritas aquí. Por ejemplo, una luz de sobrecalentamiento en un coche. Esto es solo una advertencia y es mejor cambiar algo, pero esto no es una avería. Cuando la máquina se avería, iniciaremos sesión con el nivel de ERROR.
Hemos ordenado los niveles. Pero no os preocupéis: la línea que los separa es muy fina y no todo el mundo puede explicarlo. Además, puede diferir de un proyecto a otro. Un desarrollador senior le explicará en qué nivel y qué registrar. Lo principal es que estos registros son suficientes para análisis futuros. Y esto se entiende sobre la marcha. Lo siguiente son los ajustes. A los registradores se les puede indicar dónde escribir (en la consola, archivo, jms o en otro lugar) y especificar el nivel (información, error, depuración...). Un ejemplo de configuración para nuestro registrador simple se ve así:
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler

java.util.logging.FileHandler.level     = INFO
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append    = true
java.util.logging.FileHandler.pattern   = log.%u.%g.txt

java.util.logging.ConsoleHandler.level     = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
En este caso, todo está configurado para que el registrador escriba en un archivo y en la consola al mismo tiempo. ¿En ese caso? si se borra algo en la consola, además es más fácil buscar por archivo. Nivel de INFORMACIÓN para ambos. También se especifica un patrón de nombre para el archivo. Esta es una configuración mínima que le permite escribir tanto en la consola como en un archivo a la vez. java.util.logging.FileHandler.appendconfigúrelo en verdadero para que las entradas antiguas del archivo no se borren. Un ejemplo de uso es este (sin comentarios, el registrador se comenta a sí mismo):
public class Main {
    static Logger LOGGER;
    static {
        try(FileInputStream ins = new FileInputStream("C:\\log.config")){ \\полный путь до archivo с конфигами
            LogManager.getLogManager().readConfiguration(ins);
            LOGGER = Logger.getLogger(Main.class.getName());
        }catch (Exception ignore){
            ignore.printStackTrace();
        }
    }
    public static void main(String[] args) {
        try {
            LOGGER.log(Level.INFO,"Начало main, создаем лист с типизацией Integers");
            List<Integer> ints = new ArrayList<Integer>();
            LOGGER.log(Level.INFO,"присваиваем лист Integers листу без типипзации");
            List empty = ints;
            LOGGER.log(Level.INFO,"присваиваем лист без типипзации листу строк");
            List<String> string = empty;
            LOGGER.log(Level.WARNING,"добавляем строку \"бла бла\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла бла");
            LOGGER.log(Level.WARNING,"добавляем строку \"бла 23\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла 23");
            LOGGER.log(Level.WARNING,"добавляем строку \"бла 34\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла 34");


            LOGGER.log(Level.INFO,"выводим все элементы листа с типизацией Integers в консоль");
            for (Object anInt : ints) {
                System.out.println(anInt);
            }

            LOGGER.log(Level.INFO,"Размер es igual " + ints.size());
            LOGGER.log(Level.INFO,"Получим первый элемент");
            Integer integer = ints.get(0);
            LOGGER.log(Level.INFO,"выведем его в консоль");
            System.out.println(integer);

        }catch (Exception e){
            LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
        }
    }
}
Este no es el mejor ejemplo, tomé el que tenía a mano. Salida de ejemplo:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Начало main, создаем лист с типизацией Integers
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист Integers листу без типипзации
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист без типипзации листу строк
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла бла" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 23" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 34" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
INFO: выводим все элементы листа с типизацией Integers в консоль
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер es igual 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: что-то пошло не так
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
	at generics.Main.main(Main.java:45)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Aquí quiero centrarme en las notas:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер es igual 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Esta entrada es bastante inútil y poco informativa. Como la entrada de error:
WARNING: что-то пошло не так
No deberías escribir esto: es un registro por el simple hecho de ser un registro, sólo estorbará. Intenta escribir siempre cosas significativas. Creo que esto es suficiente para dejar de usarlo System.out.printlny pasar a los juguetes para adultos. Tiene java.util.loggingdesventajas. Por ejemplo, los niveles que describí anteriormente no están aquí, pero sí en los registradores más utilizados. Lo elegí para este artículo java.util.loggingporque no requiere manipulaciones adicionales con la conexión. También señalaré que se puede utilizar LOGGER.infoen lugar de LOGGER.log(Level.INFO... Una de las desventajas que ya aparece aquí: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- permite transmitir un mensaje y un objeto Exception, el propio registrador lo anotará maravillosamente. Al mismo tiempo, LOGGER.warning("");sólo recibe un mensaje, es decir. La excepción no se puede pasar, usted mismo debe traducirla a una cadena. Espero que este ejemplo sea suficiente para familiarizarse con el registro de Java. Luego puede conectar otros registradores (log4j, slf4j, Logback...); hay muchos, pero la esencia es la misma^ registrar el historial de acciones. tutorial oficial
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION