JavaRush /Blogue Java /Random-PT /Registro Java. Desenrole uma bola de stectrace

Registro Java. Desenrole uma bola de stectrace

Publicado no grupo Random-PT
“Boa tarde, hoje foi registrado um incidente no parque industrial, peço ao desenvolvedor que se junte ao grupo de análise.” Um dos seus dias de trabalho pode começar algo assim, ou pode ser de manhã – não importa. Mas vamos começar do início. Ao resolver problemas aqui no JavaRush, você aprende a escrever código que funciona e faz o que se espera dele. Se você olhar a seção de ajuda , fica claro que isso nem sempre funciona na primeira vez. Será a mesma coisa no trabalho. Nem sempre você resolverá um problema na primeira vez: os insetos são nossos eternos companheiros. É importante que você possa restaurar os eventos do bug. Exploração madeireira.  Desenrole uma bola de stectrace - 1Vamos começar com um exemplo. Vamos imaginar que você é um policial. Você foi chamado ao local do incidente (um vidro foi quebrado em uma loja), você chegou e eles estão aguardando suas respostas sobre o ocorrido. Por onde começar? Não sei como funciona a polícia. Muito condicionalmente - eles começam a procurar testemunhas, evidências e tudo mais. E se o próprio lugar pudesse contar em detalhes o que aconteceu? Por exemplo, assim:
  • 21:59 proprietário ligou o alarme (5 minutos até totalmente ativado)
  • 22:00 dono fechou a porta
  • 22:05 ativação total do alarme
  • 22:06 dono puxou a maçaneta
  • 23:15 sensor de ruído ligado
  • 23:15 uma matilha de cães passou correndo, latindo alto
  • 23:15 sensor de ruído desligado
  • 01:17 o sensor de choque no vidro externo da vitrine foi ligado
  • 01:17 um pombo voou para dentro do vidro
  • 01:17 vidro quebrou
  • 01:17 sirene ligada
  • 01:17 o pombo se sacudiu e voou para longe
Bem, você não precisa se aprofundar nesses detalhes por muito tempo; fica imediatamente claro o que aconteceu. O mesmo está em desenvolvimento. É muito legal quando você consegue perceber pelas gravações o que aconteceu. Agora você deve estar se lembrando da depuração, porque você pode depurar tudo. Mas não. Você foi para casa e à noite tudo quebrou, não tem nada para depurar: você precisa entender porque quebrou e consertar. É aqui que entram em jogo os registros, a história de tudo o que aconteceu durante a noite. No decorrer do artigo, sugiro que você pense sobre qual é um dos madeireiros mais famosos (não é exatamente um logger, é mais um monitoramento), do qual todos que ouvem (assistem) as notícias provavelmente já ouviram falar? Graças a ele, alguns eventos foram restaurados. Agora vamos falar sério. Logging em Java é o processo de registrar quaisquer eventos que ocorrem no código. É sua responsabilidade como programador anotar o que seu código fez, pois então esses logs serão entregues a você para análise. Se tudo for bem feito, qualquer bug será resolvido e corrigido muito rapidamente. Aqui, provavelmente não vou me aprofundar nos tipos de madeireiros que existem. Neste artigo nos limitaremos ao simples java.util.Logger: é mais que suficiente para nos conhecermos. Cada entrada de log contém data e hora, nível de evento e mensagem. A data e a hora são inseridas automaticamente. O nível do evento é escolhido pelo autor da mensagem. Existem vários níveis. Os principais são informação, depuração, erro.
  • INFO - geralmente são mensagens informativas sobre o que está acontecendo, algo como um histórico por data: 1915 - algo aconteceu, 1916 - outra coisa.
  • DEBUG - descreve com mais detalhes os eventos de um determinado momento. Por exemplo, os detalhes de uma batalha na história estão no nível de depuração." O comandante Takoytovich avançou com seu exército em direção à aldeia de Selovicha ."
  • ERRO - os erros que ocorrem geralmente são escritos aqui. Você provavelmente já percebeu que quando envolve algo try-catch, o bloco catché substituído por e.printStacktrace(). Ele apenas envia a entrada para o console. Usando um logger, você pode enviar essa entrada para o logger (haha), essa é a ideia.
  • AVISO - os avisos estão escritos aqui. Por exemplo, uma luz de superaquecimento em um carro. Este é apenas um aviso, e é melhor mudar alguma coisa, mas ainda não é um colapso. Quando a máquina quebrar, registraremos com o nível ERROR.
Nós resolvemos os níveis. Mas não se preocupe: a linha entre eles é muito tênue – nem todos conseguem explicar isso. Além disso, pode diferir de projeto para projeto. Um desenvolvedor sênior explicará em que nível e o que registrar. O principal é que esses registros sejam suficientes para análises futuras. E isso é entendido na hora. A seguir estão as configurações. Os registradores podem ser informados onde escrever (no console, arquivo, jms ou em outro lugar) e especificar o nível (info, erro, depuração...). Um exemplo de configurações para nosso registrador simples é assim:
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
Neste caso, tudo está configurado para que o logger grave em um arquivo e no console ao mesmo tempo. Nesse caso? se algo for apagado no console, será mais fácil pesquisar por arquivo. Nível INFO para ambos. Um padrão de nome também é especificado para o arquivo. Esta é uma configuração mínima que permite gravar no console e em um arquivo ao mesmo tempo. java.util.logging.FileHandler.appenddefinido como verdadeiro para que entradas antigas no arquivo não sejam apagadas. Um exemplo de uso é este (sem comentários, o logger comenta sobre si mesmo):
public class Main {
    static Logger LOGGER;
    static {
        try(FileInputStream ins = new FileInputStream("C:\\log.config")){ \\полный путь до file с конфигами
            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,"Размер equals " + 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 não é o melhor exemplo, peguei o que estava em mãos. Exemplo de saída:
апр 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: Размер equals 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)
Aqui quero me concentrar nas notas:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Esta entrada é totalmente inútil e não informativa. Como a entrada de erro:
WARNING: что-то пошло не так
Você não deveria escrever isso: é um log por um log, só vai atrapalhar. Tente sempre escrever coisas significativas. Acho que isso é suficiente para parar de usar System.out.printlne passar para os brinquedos para adultos. Tem java.util.loggingdesvantagens. Por exemplo, os níveis que descrevi acima não estão aqui, mas estão nos loggers mais usados. Eu o escolhi para este artigo java.util.loggingporque não requer manipulações adicionais de conexão. Observo também que pode ser usado LOGGER.infoem vez de LOGGER.log(Level.INFO... Uma das desvantagens já aparece aqui: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- permite transmitir uma mensagem e um objeto Exception, o próprio logger irá anotá-lo lindamente. Ao mesmo tempo, LOGGER.warning("");ele recebe apenas uma mensagem, ou seja, A exceção não pode ser passada, você mesmo deve traduzi-la em uma string. Espero que este exemplo seja suficiente para se familiarizar com o log Java. Então você pode conectar outros loggers (log4j, slf4j, Logback...) - existem muitos deles, mas a essência é a mesma ^ para registrar o histórico de ações. Tutorial oficial
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION