JavaRush /Java-Blog /Random-DE /Java-Protokollierung. Wickeln Sie eine Kugel Stectrace ab...

Java-Protokollierung. Wickeln Sie eine Kugel Stectrace ab

Veröffentlicht in der Gruppe Random-DE
„Guten Tag, heute wurde ein Vorfall am Industriestandort registriert, ich bitte den Entwickler, sich der Analysegruppe anzuschließen.“ Einer Ihrer Arbeitstage könnte so beginnen, oder es könnte der Morgen sein – das spielt keine Rolle. Aber fangen wir von vorne an. Indem Sie hier in JavaRush Probleme lösen, lernen Sie, Code zu schreiben, der funktioniert und das tut, was von ihm erwartet wird. Schaut man sich den Hilfebereich an , wird deutlich, dass dies nicht immer beim ersten Mal klappt. Bei der Arbeit wird es genauso sein. Nicht immer löst man ein Problem beim ersten Mal: ​​Insekten sind unsere ewigen Begleiter. Es ist wichtig, dass Sie die Ereignisse des Fehlers wiederherstellen können. Protokollierung.  Wickeln Sie eine Kugel Stectrace ab – 1Beginnen wir mit einem Beispiel. Stellen wir uns vor, Sie wären Polizist. Sie wurden zum Ort des Vorfalls gerufen (in einem Geschäft wurde Glas zerbrochen), Sie sind dort angekommen und sie warten auf Antworten von Ihnen, was passiert ist. Wo soll ich anfangen? Ich weiß nicht, wie die Polizei arbeitet. Ganz bedingt – sie beginnen mit der Suche nach Zeugen, Beweisen und all dem Zeug. Was wäre, wenn der Ort selbst Ihnen im Detail erzählen könnte, was passiert ist? Zum Beispiel so:
  • 21:59 Besitzer schaltete den Alarm ein (5 Minuten bis zur vollständigen Aktivierung)
  • 22:00 Besitzer schloss die Tür
  • 22:05 vollständige Alarmaktivierung
  • 22:06 Besitzer zog den Griff
  • 23:15 Geräuschsensor eingeschaltet
  • 23:15 Uhr rannte ein Rudel Hunde vorbei und bellte laut
  • 23:15 Geräuschsensor ausgeschaltet
  • 01:17 Der Stoßsensor am Außenglas der Vitrine wurde aktiviert
  • 01:17 Eine Taube flog ins Glas
  • 01:17 Glas zerbrach
  • 01:17 Sirene an
  • 01:17 Die Taube schüttelte sich ab und flog davon
Nun, man muss sich nicht lange mit solchen Details befassen, es ist sofort klar, was passiert ist. Das Gleiche ist in der Entwicklung. Es ist sehr cool, wenn man anhand der Aufnahmen erkennen kann, was passiert ist. Jetzt erinnern Sie sich vielleicht an das Debuggen, denn Sie können alles debuggen. Aber nein. Sie sind nach Hause gegangen und nachts ist alles kaputt gegangen. Es gibt nichts zu debuggen: Sie müssen verstehen, warum es kaputt gegangen ist, und es reparieren. Hier kommen die Protokolle ins Spiel, die Geschichte von allem, was über Nacht passiert ist. Ich schlage vor, dass Sie im Laufe des Artikels darüber nachdenken, was einer der berühmtesten Logger ist (nicht wirklich ein Logger, sondern eher eine Art Überwachung), von dem wahrscheinlich jeder gehört hat, der die Nachrichten hört (sieht). Dank ihm werden einige Ereignisse wiederhergestellt. Jetzt lasst uns ernst werden. Bei der Protokollierung in Java werden alle Ereignisse aufgezeichnet, die im Code auftreten. Es liegt in Ihrer Verantwortung als Programmierer, aufzuschreiben, was Ihr Code getan hat, denn dann werden Ihnen diese Protokolle zur Analyse übergeben. Wenn alles gut gemacht ist, wird jeder Fehler sehr schnell behoben und behoben. Ich werde hier wahrscheinlich nicht näher darauf eingehen, welche Art von Loggern es gibt. In diesem Artikel beschränken wir uns auf das Einfache java.util.Logger: Es ist mehr als genug, um sich kennenzulernen. Jeder Protokolleintrag enthält Datum, Uhrzeit, Ereignisebene und Nachricht. Datum und Uhrzeit werden automatisch eingetragen. Die Ereignisebene wird vom Autor der Nachricht ausgewählt. Es gibt mehrere Ebenen. Die wichtigsten sind Info, Debug, Fehler.
  • INFO – normalerweise handelt es sich dabei um Informationsmeldungen darüber, was gerade passiert, so etwas wie eine Historie nach Datum: 1915 – etwas ist passiert, 1916 – etwas anderes.
  • DEBUG – beschreibt die Ereignisse eines bestimmten Moments detaillierter. Beispielsweise sind die Details einer Schlacht in der Geschichte auf dem Debug-Niveau. „ Kommandant Takoytovich rückte mit seiner Armee in Richtung des Dorfes Selovicha vor .“
  • FEHLER – auftretende Fehler werden normalerweise hier geschrieben. Sie haben wahrscheinlich bemerkt, dass try-catchder Block catchdurch ersetzt wird , wenn Sie etwas einschließen e.printStacktrace(). Der Eintrag wird lediglich auf der Konsole ausgegeben. Wenn Sie einen Logger verwenden, können Sie diesen Eintrag an den Logger senden (haha), Sie verstehen schon.
  • WARN – hier werden Warnungen geschrieben. Zum Beispiel ein überhitztes Licht in einem Auto. Dies ist nur eine Warnung und es ist besser, etwas zu ändern, aber dies ist keine Panne. Wenn die Maschine ausfällt, protokollieren wir mit der Stufe FEHLER.
Wir haben die Level sortiert. Aber keine Sorge: Der Grat dazwischen ist sehr schmal – nicht jeder kann es erklären. Außerdem kann es von Projekt zu Projekt unterschiedlich sein. Ein leitender Entwickler erklärt Ihnen, auf welcher Ebene und was Sie protokollieren müssen. Die Hauptsache ist, dass Ihnen diese Aufzeichnungen für zukünftige Analysen ausreichen. Und das wird sofort verstanden. Als nächstes folgen die Einstellungen. Loggern kann mitgeteilt werden, wohin sie schreiben sollen (in die Konsole, Datei, JMS oder anderswo) und die Ebene angeben (Info, Fehler, Debug...). Ein Beispiel für Einstellungen für unseren einfachen Logger sieht so aus:
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
In diesem Fall ist alles so konfiguriert, dass der Logger gleichzeitig in eine Datei und auf die Konsole schreibt. In diesem Fall? Wenn etwas in der Konsole gelöscht wird, ist es außerdem einfacher, nach Datei zu suchen. INFO-Ebene für beide. Für die Datei wird außerdem ein Namensmuster angegeben. Dies ist eine minimale Konfiguration, die es Ihnen ermöglicht, gleichzeitig in die Konsole und eine Datei zu schreiben. auf truejava.util.logging.FileHandler.append setzen , damit alte Einträge in der Datei nicht gelöscht werden. Ein Anwendungsbeispiel ist folgendes (ohne Kommentare kommentiert der Logger sich selbst):
public class Main {
    static Logger LOGGER;
    static {
        try(FileInputStream ins = new FileInputStream("C:\\log.config")){ \\полный путь до Datei с конфигами
            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,"Размер gleicht " + 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);
        }
    }
}
Das ist nicht das beste Beispiel, ich habe das vorliegende genommen. Beispielausgabe:
апр 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: Размер gleicht 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)
Hier möchte ich mich auf die Notizen konzentrieren:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер gleicht 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Dieser Eintrag ist ziemlich nutzlos und nicht informativ. Wie der Fehlereintrag:
WARNING: что-то пошло не так
Das sollten Sie nicht schreiben: Es ist ein Protokoll um des Protokolls willen, es stört nur. Versuchen Sie, immer sinnvolle Dinge zu schreiben. Ich denke, das reicht aus, um es nicht mehr zu benutzen System.out.printlnund auf Spielzeug für Erwachsene umzusteigen. Es java.util.logginghat Nachteile. Die oben beschriebenen Werte gibt es beispielsweise nicht hier, aber in den meisten verwendeten Loggern. Ich habe es für diesen Artikel ausgewählt, java.util.loggingweil es keine zusätzlichen Manipulationen an der Verbindung erfordert. LOGGER.infoIch möchte auch anmerken, dass es anstelle von verwendet werden kann. LOGGER.log(Level.INFO... Einer der Nachteile taucht hier bereits auf: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- Es ermöglicht die Übertragung einer Nachricht und eines Objekts Exception, der Logger selbst wird es wunderbar aufschreiben. Gleichzeitig LOGGER.warning("");empfängt es lediglich eine Nachricht, d.h. Die Ausnahme kann nicht übergeben werden, Sie müssen sie selbst in einen String übersetzen. Ich hoffe, dass dieses Beispiel ausreicht, um sich mit der Java-Protokollierung vertraut zu machen. Dann können Sie andere Logger (log4j, slf4j, Logback...) anschließen – es gibt viele davon, aber das Wesentliche ist dasselbe^, den Verlauf von Aktionen aufzuzeichnen. Offizielles Tutorial
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION