大明對日誌的經驗總結

来源:https://www.cnblogs.com/xiao2/archive/2018/09/02/9576319.html
-Advertisement-
Play Games

前言 說一個自己經歷過的事情,有一次我在開發一個通過csv文件批量導入交易的job的時候,在UAT環境上進行性能測試,發現執行失敗了。通過查看日誌發現,機器空間不足了, df h 一看發現32G的機器只有20k的空間,然後一看日誌文件的大小,就占了20G。日誌這東西,不能記得太多,不然影響性能而且占 ...


前言

說一個自己經歷過的事情,有一次我在開發一個通過csv文件批量導入交易的job的時候,在UAT環境上進行性能測試,發現執行失敗了。通過查看日誌發現,機器空間不足了,df -h一看發現32G的機器只有20k的空間,然後一看日誌文件的大小,就占了20G。日誌這東西,不能記得太多,不然影響性能而且占空間,也不能記得太少,不然出了問題,日誌查不到關鍵的信息

經驗

1. 使用直接SLF4J,而非具體的日誌框架

在項目開發中,應該在代碼中直接使用SLF4J,而非LOG4JLogback等一些框架。SLF4J是Java里上事實上的日誌標準介面,通過門面模式,可以很方便替換具體日誌框架的實現,降低了業務代碼與日誌框架的耦合度。

2. 生產環境只列印INFO級別的日誌信息

一般而言,debug及其以下級別的信息都是沒有必要顯示出來的,除非是開發定位bug的時候。

3. 使用isDebugEanbled等相似方法降低日誌性能消耗

頻繁計算日誌是否應該記錄會對系統性能產生影響,通過顯示調用判斷是否需要列印方法如isDebugEanbled來優化性能:

if (logger.isDebugEnabled()) {
    logger.debug("this is debug message");
}

4. 使用lambda表達式

該經驗針對第三條進一步優化。
如果我們簡單封裝了日誌方法,比如

public void degbug(String message) {
    if (logger.isDebugEnabled()) {
        logger.debug(message);
    }
}

這樣雖然通過isDebugEnabled方法判斷使用需要列印日誌提高了性能,但是如果message本身是有多個字元串拼接而成的話仍然會消耗一定的資源,比如調用上文的debug方法:

debug("client" + (clientId) + "is error");

儘管使用isDebugEnabled方法,但是在該方法調用入參的時候會先拼接message這個參數,然後在調用isDebugEnabled方法進行判斷,如果此時是不需要列印的話,那麼這個拼接message的消耗就白白浪費了。應該先判斷是否需要列印,然後在拼接字元串。我們可以使用lambda表達式懶求值的特性實現:

public void degbug(Supplier<String> supplier) {
    if (logger.isDebugEnabled()) {
        logger.debug(supplier != null ? supplier.get() : null);
    }
}

說明

基於slf4j簡單封裝,實現了以上經驗的第三、四點。

下載地址:Github, 碼雲


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • https://www.cnblogs.com/jiahaoJAVA/p/6244278.html 1 什麼是redis? Redis 是一個基於記憶體的高性能key-value資料庫。 (有空再補充,有理解錯誤或不足歡迎指正) 2 Reids的特點 Redis本質上是一個Key-Value類型的記憶體 ...
  • 題意 約翰要帶N(1≤N≤100000)只牛去參加集會裡的展示活動,這些牛可以是牡牛,也可以是牝牛.牛們要站成一排.但是牡牛是好鬥的,為了避免牡牛鬧出亂子,約翰決定任意兩隻牡牛之間至少要有K(O≤K<N)只牝牛. 請計算一共有多少種排隊的方法.所有牡牛可以看成是相同的,所有牝牛也一樣.答案對5000 ...
  • 俗話說 「不要重覆造輪子」,關於是否有必要不再本次討論範圍。 創建這個項目的主要目的還是提升自己,看看和知名類開源項目的差距以及學習優秀的開源方式。 ...
  • 持續集成(Continuous Integration)指的是,頻繁地(一天多次)將代碼集成到主幹。 持續集成的目的,就是讓產品可以快速迭代,同時還能保持高質量。 它的核心措施是,代碼集成到主幹之前,必須通過自動化測試。只要有一個測試用例失敗,就不能集成。 持續集成可以把工程師從繁瑣的任務中解放出來 ...
  • fail-fast機制即為快速失敗機制,個人認為是一種防護措施,在集合結構發生改變的時候,使盡全力拋出ConcurrentModificationException,所以該機制大部分用途都是用來檢測Bug的; 下麵的代碼可以引發fail-fast fail-fast原理 每個集合都會實現可遍歷的介面 ...
  • 在日常的Java開發中,位運算使用的不多,使用的更多的是算數運算(+、-、*、/、%)、關係運算(<、>、<=、>=、==、!=)和邏輯運算(&&、||、!),所以相對來說對位運算不是那麼熟悉,本文將以Java的位運算來詳細介紹下位運算及其應用。 1、 位運算起源 位運算起源於C語言的低級操作,Ja ...
  • 1.分散式 把一個項目拆成幾個部分,然後分別交給不同的人或部門去完成,部門與部門之間互相團結協作共同完成這個大項目。 2.集群 集群就是大家一起幹活,負載均衡就是每個人乾的都差不多(在同一個項目里),不能把某個人累死,也不能讓某個人閑死。 3.反向代理 就是把不同的活分給不同的人去做。 4.散列表、 ...
  • (一)說明 這裡我是按自己的理解去實現的,時間複雜度和空間複雜度和演算法導論上的可能不一樣,感興趣的話參考下就行,感覺最重要的還是演算法思想。根據演算法性能去實現演算法以後再研究。 (二)計數排序 計數排序的基本思想是:對每一個輸人元素x,確定小於x 的元素個數。 利用這一信息,就 可以直接把x放到它在輸出 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...