"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. Comencemos 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.
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 bloquecatch
se sustituye pore.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.
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.append
configú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.println
y pasar a los juguetes para adultos. Tiene java.util.logging
desventajas. 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.logging
porque no requiere manipulaciones adicionales con la conexión. También señalaré que se puede utilizar LOGGER.info
en 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
GO TO FULL VERSION