JavaRush /Java Blog /Random-TW /Java 日誌記錄。展開 strace 球

Java 日誌記錄。展開 strace 球

在 Random-TW 群組發布
“下午好,今天工業現場記錄到了一起事件,請開發商加入分析小組。” 你一天的工作可能會從這樣的事情開始,也可能是早上——這並不重要。但讓我們從頭開始。透過在 JavaRush 中解決問題,您將學會編寫有效的程式碼並執行預期的操作。如果您查看幫助部分,很明顯,第一次並不總是有效。在工作中也是如此。你並不總是能在第一次就解決問題:錯誤是我們永恆的伴侶。重要的是您可以恢復錯誤的事件。 記錄。 展開 stectrace 球 - 1讓我們從一個例子開始。讓我們假設您是一名警察。您被叫到事件現場(商店的玻璃被打破),您到達了,他們正在等待您對所發生事件的答复。從哪裡開始?我不知道警察是怎麼工作的。非常有條件 - 他們開始尋找證人、證據和所有這些東西。如果這個地方本身可以詳細告訴你發生了什麼事怎麼辦?例如,像這樣:
  • 21:59 主人打開警報(5分鐘後完全啟動)
  • 22:00 業主關門
  • 22:05 警報全面啟動
  • 22:06 主人拉動把手
  • 23:15 噪音感應器開啟
  • 23:15 一群狗跑過去,大聲吠叫
  • 23:15 噪音感應器關閉
  • 01:17 展示櫃外玻璃上的震動感應器開啟
  • 01:17 一隻鴿子飛進玻璃杯
  • 01:17 玻璃碎了
  • 01:17 警笛響起
  • 01:17 鴿子擺脫束縛飛走
好吧,你不必深入研究這些細節;發生了什麼事就立刻清楚了。開發中也是如此。當你可以從錄音中得知發生了什麼事時,這真是太酷了。現在您可能還記得調試,因為您可以調試所有內容。但不是。你回到家,晚上一切都壞了,沒有什麼可以調試的:你需要了解它壞掉的原因並修復它。這就是日誌發揮作用的地方,它記錄了一夜之間發生的一切的歷史。在這篇文章的過程中,我建議你想一下,每個聽(看)新聞的人可能都聽說過的最著名的記錄器之一(不是真正的記錄器,更像是監控)是什麼?感謝他,一些事件得以恢復。現在讓我們嚴肅點吧。Java 中的日誌記錄是記錄程式碼中發生的任何事件的過程。身為程式設計師,你有責任寫下你的程式碼做了什麼,因為這樣這些日誌就會提供給你進行分析。如果一切都做得好,那麼任何錯誤都會很快被整理和修復。在這裡,我可能不會深究到底有哪些記錄器。在這篇文章中,我們將把自己限制在簡單的範圍內java.util.Logger:這對於相互了解來說已經足夠了。每個日誌條目包含日期時間、事件等級、訊息。日期和時間是自動輸入的。事件級別由訊息作者選擇。有幾個層次。主要是資訊、調試、錯誤。
  • 資訊 - 通常這些是有關正在發生的事情的資訊訊息,類似於日期的歷史記錄:1915 - 發生了一些事情,1916 - 發生了其他事情。
  • DEBUG - 更詳細地描述特定時刻的事件。例如,歷史上的一場戰鬥的細節都是調試級別
  • ERROR - 發生的錯誤通常寫在這裡。您可能已經注意到,當您將某些內容包裝在 中時try-catch,該區塊catch會被替換為e.printStacktrace()。它僅將條目輸出到控制台。使用記錄器,您可以將此條目傳送到記錄器(哈哈),您明白了。
  • WARN - 警告寫在這裡。例如,汽車中的過熱燈。這只是一個警告,最好改變一些東西,但這不是故障。當機器發生故障時,我們將記錄錯誤等級。
我們已經整理好了等級。但別擔心:它們之間的界線很窄——不是每個人都能解釋它。另外,它可能因項目而異。高級開發人員將向您解釋什麼級別以及要記錄什麼。最主要的是這些記錄足夠你以後分析了。這是即時理解的。接下來是設定。記錄器可以被告知寫入位置(控制台、檔案、jms 或其他地方),並指定層級(資訊、錯誤、偵錯...)。 我們的簡單記錄器的設定範例如下所示:
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
在這種情況下,所有內容都經過配置,以便記錄器同時寫入檔案和控制台。在這種情況下?如果控制台中刪除了某些內容,而且按檔案搜尋會更容易。兩者的資訊等級。也為該檔案指定了名稱模式。這是一個最小的配置,可讓您同時寫入控制台和檔案。 java.util.logging.FileHandler.append設定為true以便檔案中的舊條目不會被刪除。使用範例如下(沒有註釋,記錄器對自身進行註釋):
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);
        }
    }
}
這不是最好的例子,我舉了手邊的一個。輸出範例:
апр 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)
這裡我想重點說一下筆記:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
這篇文章毫無用處,而且沒有提供任何資訊。就像錯誤條目一樣:
WARNING: что-то пошло не так
你不應該這樣寫:它只是為了日誌而日誌,它只會造成妨礙。嘗試總是寫有意義的事情。 我認為這足以停止使用它System.out.println並轉向成人玩具。它java.util.logging有缺點。例如,我上面描述的層級不在這裡,但它們在大多數使用的記錄器中。我在本文中選擇它是java.util.logging因為它不需要對連接進行額外的操作。我還要指出的是,它可以用來代替 這裡已經出現的缺點之一: LOGGER.info-它允許您傳輸訊息和對象,記錄器本身會將其精美地寫下來。同時,它只接收一則訊息,即 異常無法傳遞,必須自己翻譯成字串。我希望這個範例足以讓您熟悉 Java 日誌記錄。然後你可以連接其他記錄器(log4j、slf4j、Logback...)—它們有很多,但本質是相同的^來記錄操作的歷史。 官方教程LOGGER.log(Level.INFO...LOGGER.log(Level.WARNING,"что-то пошло не так" , e);ExceptionLOGGER.warning("");
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION