log4j 1 升級方案

来源:https://www.cnblogs.com/codeG7/archive/2022/11/08/16867992.html
-Advertisement-
Play Games

log4j 1 升級方案 目標 解決重要安全漏洞 多項目日誌監測改造(可選) 性能提升(可選) 功能擴展(可選) 升級要求 少修改代碼 或 不修改代碼 功能儘可能平替,而不發生基本功能變化 低學習成本 具體方案 完全平替的改造 方案特征 完全平替 沒有額外的學習成本,沒有其他的操作,只需要將jar包 ...


log4j 1 升級方案

目標

  1. 解決重要安全漏洞
  2. 多項目日誌監測改造(可選)
  3. 性能提升(可選)
  4. 功能擴展(可選)

升級要求

  1. 少修改代碼 或 不修改代碼
  2. 功能儘可能平替,而不發生基本功能變化
  3. 低學習成本

具體方案

完全平替的改造

方案特征

  1. 完全平替

沒有額外的學習成本,沒有其他的操作,只需要將jar包完全替換掉 log4j 即可。

方案具體內容

組件:reload4j

reload4j 官網

maven

<!-- pom.xml -->
<dependency>
    <groupId>ch.qos.reload4j</groupId>
    <artifactId>reload4j</artifactId>
    <version>1.2.22</version>
</dependency>

reload4j 是 log4j 原作者 Ceki Gülcü 發起 是基於 log4j 版本 1.2.17 的分支,其主要目的是為瞭解決 log4j 1.2.17 中的漏洞。

reload4j 可以做到完全平替 log4j 。

其中 log4j 1中 對安全性必要大影響的 CVE-2021-4104 CVE-2022-23302 已經在 reload4j 的 1.2.22 版本中修複。

有一定學習成本但不多(log4j1 升級到 log4j2)

方案特征

  1. 部分平替
  2. 有一定學習成本(log4j1 和 log4j2 的配置還是有一些不一樣的)
  3. 擴展的額外功能對於項目維護與正常運行有更好的幫助(不是主要因素)
  4. 不支持 jdk1.5 及以下 (reload4j 支持 1.5)

方案具體介紹

英文方案
英文方案主要涉及到代碼的改造,將原本的 log4j1 徹底改造成 log4j2 。

或者我們使用下麵的方式通過路由鏈接 log4j1 的api 完成準無代碼遷移。

組件: log4j-api 日誌介面; log4j-core 具體的實現; log4j-1.2-api log4j1 到 log4j2 的路由器,在使用 log4j1 的 api 時會在內部路由到 log4j2 的 api。

log4j2 官網

log4j2-api maven

log4j2-core maven

log4j-1.2-api maven

log4j-1.2-api 使用方法(英文)

<!-- pom.xml -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-1.2-api</artifactId>
    <version>2.12.4</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.12.4</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.12.4</version>
</dependency>

但無論如何幾乎都無法替代以下幾個類的內容缺失導致的代碼變更。
org.apache.log4j.spi.ThrowableInformation
org.apache.log4j.spi.ErrorHandler
等等

改造的功能點更多的傾向於 log4j 中對異常消息處理,異常數據處理等功能,這部分功能在項目中儘可能不要使用,從某些角度上來說,數據處理、消息處理這部分有專門的獨立處理組件,日誌組件就應該處理日誌,尤其儘可能非同步列印到日誌文件或日誌流中。

翻天覆地的調整(通過 SLF4J / commons-logging 替換 現有的 日誌配置)

方案特征

  1. 日誌擴展性極佳。
  2. 日誌性能極佳。
  3. 日誌模塊化,對其他模塊幾乎沒有影響
  4. 日誌管理更加多樣化,選擇更多。

方案具體介紹

找到所有用到 org.apache.log4j 的包,調整代碼使用過程即可。

此處只介紹 SLF4J 和 logback

slf4j 使用手冊

logback 使用手冊

slf4j maven

logback maven

<!-- pom.xml -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>2.0.3</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.4.4</version>
</dependency>
<!--logback.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>

    <property name="log.path" value="target/log/logback.log" />

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- <filter class="com.example.logback.filter.MyFilter" /> -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="file"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
        </rollingPolicy>

        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

    <logger name="org.apache" level="info" />
    <logger name="com.gargoylesoftware" level="warn" />
    <logger name="com.example.logback" level="warn" />
<!--    com.gargoylesoftware-->
<!--    <logger name="com.gargoylesoftware" level="info" />-->

</configuration>


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

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 在AndroidManifest.xml註冊ACTION事件 <activity android:name="com.test.app.MainActivity" android:configChanges="orientation|ke ...
  • 隊列結構 一.認識隊列 受限的線性結構: 我們已經學習了一種受限的線性結構:棧結構. 並且已經知道這種受限的數據結構對於解決某些特定問題,會有特別的 效果. 下麵,我們再來學習另外一個受限的數據結構:隊列. 隊列(Queue),它是一種受限的線性表,先進先出(FIFO First ln First ...
  • 項目調試的困境 程式開發總會遇到各種各樣的問題,為什麼實際結果和預期結果不一致? 這個時候如果能深入程式內部抽絲剝繭去一探究竟再好不過! 而chrome工具是前端開發的殺手鐧,經常聽到的一句話是: 出問題了?F12看看... 前端調試的手法一般就兩種: 服務端(添加調試代碼) 客戶端(開發者工具) ...
  • 前兩篇文章分享了基於 vite3 vue3 的組件庫基礎工程 *vue3-component-library-archetype* 和用於快速創建該工程的工具 *yyg-cli*,但在中大型的企業級項目中,通常會自主搭建這些腳手架或加速器。優雅哥希望每位前端伙伴能知其所以然,故接下來的文章將進入 *... ...
  • 軟體系統架構設計的目標不在於設計本身,而在於架構設計意圖的傳達。圖形化有助於在團隊間進行高效的信息同步,但不同的圖形化方式需要語義一致性和效率間實現平衡。C4模型通過不同的抽象層級來表達系統的靜態結構,並提供了最小集的抽象建模元素,為設計人員提供了一種低認知負載、易於學習和使用的高效建模方式。 ...
  • 1,設計模式概述 1.1 軟體設計模式的產生背景 "設計模式"最初並不是出現在軟體設計中,而是被用於建築領域的設計中。 1977年美國著名建築大師、加利福尼亞大學伯克利分校環境結構中心主任克裡斯托夫·亞歷山大(Christopher Alexander)在他的著作《建築模式語言:城鎮、建築、構造》中 ...
  • 面向對象 一、三大特征之繼承 python三大特征: 封裝、繼承、多態 三者中繼承最為核心,實際應用多,感受較為直觀 封裝和多態略微抽象 1、繼承的概念 繼承的含義: ​ 在現實生活中,繼承表示人與人之間資源的從屬關係 ​ 例如:兒子繼承父親 ​ 在編程的世界中,繼承表示類與類之間的資源從屬關係 ​ ...
  • 簡介: 註冊樹模式,屬於結構型的設計模式。一種很簡單的設計模式 適用場景: 類似IOC。寫一個龐大的類庫的時候,為了方便各種資源的歸納,可以統一放到一棵樹上。 優點: 把一個個游兵散將一樣的對象進行統一管理。 另外可以根據項目的業務場景自定義層級。 缺點: 增加項目的複雜性。 純粹的註冊樹寫法,缺少 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...