Java開發之log日誌的使用儘量不用e.printStackTrace

2021-01-19 跟我一起學編程

前言

在Java開發中,無論是運行還是調試,一般都會對異常進行處理,一則明確問題出在哪個地方,一則也是代碼完整性的一部分。談到log日誌,小編建議初學java的朋友使用框架集成的log4j、logback這類統一列印日誌,儘量不使用catch的e.printStackTrace(),為什麼呢?下面我們來做簡單介紹。

為什麼儘量不用e.printStackTrace

直接用e.printStackTrace來列印日誌有錯嗎?當然不錯,但是不好。主要原因有以下幾點:

1、佔用太多內存,造成鎖死

要列印字符串輸出到控制臺上,需要字符串常量池所在的內存塊有足夠的空間。然而,因為e.printStackTrace() 語句要產生的字符串記錄的是堆棧信息,太長太多,內存被填滿了!大量線程產出字符串產出到一半,等待有內存被釋放,鎖死了,導致整個應用掛掉了。

2、日誌交錯混合,不易讀

從開始學習java,老師就教我們寫代碼要具有可讀性,易讀性。同樣,日誌的輸出如果不具有易讀性,也是讓程式設計師非常頭疼的一件事。那麼為什麼e.printStackTrace輸出的日誌具有不易讀性了呢?

printStackTrace()默認使用了System.err輸出流進行輸出,與System.out是兩個不同的輸出流,那麼在列印時自然就形成了交叉。再就是輸出流是有緩衝區的,所以對於什麼時候具體輸出也形成了隨機。

Log4j的使用

1、首先,引入log4j.jar,在web.xml中配置log4j的訪問配置。

2、在log4j.properties中配置log4j的輸出級別信息

3、在action中定義log

private Logger log = Logger.getLogger(HomeAction.class);

log.info("這裡就可以寫入日誌信息了");

結語

log的使用增加了日誌的可讀性,避免了程序死鎖問題的發生,同時也為程式設計師在日常運營和調試中提供了極大的幫助。

相關焦點

  • e.printStackTrace()不是列印嗎,還能鎖死?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫e.printStackTrace()會導致鎖死?這僅僅是列印啊,怎麼可能?然而,因為e.printStackTrace() 語句要產生的字符串記錄的是堆棧信息,太長太多,內存被填滿了!注意 上面代碼語句:4208行!來看圖3:沒毛病,沒沒事兒找事兒冤枉誰。就是這句代碼惹的禍!當然,我承認,被 try 住的代碼本身就有問題,導致很多調用都會拋異常。
  • 別在Java 代碼裡亂打日誌了,這才是正確的打日誌姿勢!
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫使用slf4j使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。實現方式統一使用: Logback框架打日誌的正確方式什麼時候應該打日誌當你遇到問題的時候,只能通過debug功能來確定問題,你應該考慮打日誌,良好的系統,是可以通過日誌進行問題定為的。
  • Day6 鴻蒙,如何使用Logger日誌工具做開發準備
    當成功創建了你的第一個Harmony程序後,了解使用Harmony中的日誌工具Logger,將會對你後續的程序開發起到很大的幫助。首先我們先從熟悉的安卓開發環境來回顧一下。
  • 阿里巴巴 Java 開發手冊之工程分層
    版權歸屬:阿里巴巴集團技術團隊 著作目的:幫助更多軟體開發者搭建規範開發品臺,促進工程標準化本文分享關於阿里巴巴Java 開發手冊使用內容的工程分層結構,為幫助大家搭建一個有規範性得應用結構。需要原PDF文檔的朋友可私信提供(小編有全套阿里《java開發手冊》各版本)。
  • 面試官:Mybatis 使用了哪些設計模式?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫雖然我們都知道有20多個設計模式,但是大多停留在概念層面,真實開發中很少遇到,Mybatis源碼中使用了大量的設計模式,閱讀源碼並觀察設計模式在其中的應用,能夠更深入的理解設計模式。
  • 解析Java橫死之謎,氣定神閒看花開花落
    本小篇將分析幾種常見的Java進程消失之謎,讓你氣定神閒看花開花落。它們有可能: 被作業系統審判了 執行了上帝函數,被隊友埋坑了 使用了錯誤的啟動方式 日誌系統配置錯誤1.由於Linux系統採用的是虛擬內存分配方式,JVM的代碼,庫,堆和棧的使用都會消耗內存,但是申請出來的內存,只要沒真正access過,是不算的,因為沒有真正為之分配物理頁面。隨著使用內存越用越多。第一層防護牆就是SWAP;當SWAP也用的差不多了,會嘗試釋放cache;當這兩者資源都耗盡,殺手就出現了。
  • PHP日誌擴展 SeasLog-1.4.2 發布,支持錯誤與異常
    log extension for PHP@author Chitao.Gao [neeke@php.net] 為什麼使用SeasLog log日誌,通常是系統或軟體、應用的運行記錄。 php內置error_log、syslog函數功能強大且性能極好,但由於各種缺陷(error_log無錯誤級別、無固定格式,syslog不分模塊、與系統日誌混合),靈活度降低了很多,不能滿足應用需求。 好消息是,有不少第三方的log類庫彌補了上述缺陷,如log4php、plog、Analog等(當然也有很多應用在項目中自己開發的log類)。
  • mysql binlog和relay log日誌如何清除
    MySQL通過binlog和relay log進行主從數據的同步,binlog由主庫產生,從庫通過複製io線程拉取binlog,寫入到relay log中,sql線程讀取relay log中的事務信息,並進行應用。
  • MySQL優化:定位慢查詢的兩種方法以及使用explain分析SQL
    使用explain分析。定位慢查詢SQL在平時工作中,我想你肯定遇到過一條sql發出去了,但是等了好久才出現了返回值,這不僅僅影響了測試速度也大大降低了開發效率。所以我們有必要學習sql慢查詢定位。NOTE:默認情況下,慢查詢日誌中不會記錄管理語句,如果需要記錄的請做如下設置,設置log_slow_admin_statements = on 讓管理語句中的慢查詢也會記錄到慢查詢日誌中。
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    不用懷疑,是真的有很多人在學Java。零基礎學Java主流開發語言根據最新2020年TIOBE程式語言指數排行榜,Java仍然排名前三位。程式語言排行榜目前很多軟體都是用Java寫的,新出的系統和函數庫為了市場,也會儘量和Java兼容或者提供Java的接口。
  • Java資料庫類的原型
    我們是否可以創建一個資料庫連接類,該類允許我們僅更改配置文件,然後使用資料庫?我做了這個類的原型,這很簡單。但是這個主意很好,總是使用一個非常簡單的jar文件來獲取安裝資料庫,然後可以執行SQL查詢操作。
  • 詞根速記單詞DAY83:-log- 說
    -log- = -loq- 說log [lg] vi. 伐木 vt. 切;伐木;航行 n.記錄;航行日誌;原木拆分:詞根直接表單詞 → 每天說的內容 → 日誌例句:The system is unable to log you on. 這個系統無法讓你登錄。
  • Java開發手冊認證考試的50題
    多選 3.下列哪些說法符合《阿里巴巴Java開發手冊》:ACDA .對於「明確停止使用的代碼和配置」,如方法、變量、類、配置文件、動態配置屬性等要堅決從程序中清理出去,避免造成過多垃圾。B .永久棄用的代碼段注釋掉即可,即不用加任何注釋。
  • java-web新手開發快速入門
    java-web開發快速入門,本文對於java-web開發的要點進行了重點分析,可以給新手們提供很好的參考作用。一、Tomcat伺服器常見啟動問題:(1).Java_home環境變量,由於tomcat伺服器的bin目錄中的一些jar文件必須使用到java類庫,所以必須先配置Java_home環境變量。(2).埠佔用問題(3).Catalina_home環境變量的問題,如果配置了catalina_home環境變量,則默認啟動的是catalina_home所指向的tomcat伺服器。
  • 這款Java工具類庫簡直棒級了
    Hutool中的工具方法來自於每個用戶的精雕細琢,它涵蓋了Java開發底層代碼中的方方面面,它既是大型項目開發中解決小問題的利器,也是小型項目中的效率擔當;Hutool是項目中"util"包友好的替代,它節省了開發人員對項目中公用類和公用工具方法的封裝時間,使開發專注於業務,同時可以最大限度的避免封裝不完善帶來的bug。
  • javascript日誌列印6個方法,我猜你只會console.log()
    幾乎所有的javascript開發者最常使用的日誌列印調試api都是console.log(),其實還有很多的選項供我們選擇,筆者下面就為大家一一介紹.一、console.table()console.table()是我非常建議大家去使用的方法,它可以接受JSON或數組並以表格格式列印,在對json對象和數組進行可視化列印的時候簡單易用,結果直觀。