全部產品
Search
文件中心

Simple Log Service:採集Log4j日誌

更新時間:Sep 24, 2024

使用Log4j2記錄和管理Java應用的作業記錄後,您可以使用Log4j2 Appender或Logtail將日誌採集到Log Service,以便於後續的查詢分析。

Log4j概述

Log4j是Apache的一個開放原始碼專案,通過使用Log4j,您可以配置日誌傳輸的目的地,例如控制台、檔案、GUI組件、Socket伺服器、NT的事件記錄器、UNIX Syslog守護進程等;您也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的層級,您能夠更加細緻地控制日誌的產生過程。這些可以通過一個設定檔來靈活地進行配置,而不需要修改應用的代碼。Log4j由三個重要的組件構成,如下所示:

  • 日誌格式化器(Layouts)

    Layouts控制日誌資訊的格式化方式。常用Layouts有:

    Layouts

    含義

    HTMLLayout

    表示日誌輸出格式化為HTML表格形式。

    SimpleLayout

    表示使用簡單的輸出格式化,格式如預設的INFO層級的訊息。

    PatternLayout

    根據自訂格式輸出日誌,您可以設定包括時間戳記、記錄層級、線程名、類名、方法名、日誌訊息等元素的排列和格式。

  • 日誌輸出端(Appenders)

    Appenders定義了日誌資訊的輸出目的地。您可以配置多個Appender,將日誌發送到不同的地方。常用Appenders有:

    Appenders

    含義

    ConsoleAppender

    將日誌輸出到控制台。

    FileAppender

    將日誌輸出到檔案中。

    DailyRollingFileAppender

    將日誌輸出到一個檔案,並且每天輸出到新的檔案。

    RollingFileAppender

    將日誌資訊輸出到一個檔案,並且指定檔案的尺寸,當檔案大小達到指定尺寸時,會自動把檔案改名,同時產生一個新的檔案。

    JDBCAppender

    將日誌資訊儲存到資料庫中。

  • 日誌記錄器(Loggers)

    Loggers定義了日誌記錄的進入點,負責捕獲日誌資訊。每個Logger都會基於其重要性或嚴重程度分配到一個記錄層級。Log4j定義了8個層級的log,優先順序從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。日誌記錄的層級具有繼承性,子類會記錄父類的所有記錄層級。每種記錄層級的含義如下:

    記錄層級

    含義

    OFF

    關閉所有日誌記錄。

    FATAL

    指出嚴重的錯誤事件,將會導致應用程式的退出。

    ERROR

    指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。

    WARN

    表明會出現潛在的錯誤情形。

    INFO

    一般用在粗粒度層級上,強調應用程式的運行過程。

    DEBUG

    一般用於調試應用程式時,對診斷問題提供協助。

    TRACE

    用於對程式追蹤,輸出程式運行中的變數,顯示執行的流程。

    ALL

    列印所有的日誌記錄。

說明

一個Logger可以對應多個Appender,一個Appender只能對應一個Layout。

前提條件

  • 已建立Project和Logstore。更多資訊,請參見管理Project管理Logstore

  • 如果使用Appender方式採集,則必須建立RAM使用者並授予Log ServiceLogstore的寫入許可權,配置許可權的步驟請參見配置許可權助手

操作步驟

說明

本文以Java語言為樣本,使用Log4j2版本進行示範。通過Log4j其他語言介面,您可以在C、C++、.Net、PL/SQL程式中使用Log4j,其文法和用法與在Java程式中一樣。

步驟一:在專案中添加Log4j2的設定檔

  1. maven工程中引入依賴。

    <dependencies>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.23.1</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.23.1</version>
      </dependency>
    </dependencies>
  2. 修改設定檔。

    預設會在classpath路徑下尋找設定檔,如果不存在則需要手動建立。下面以log4j2.xml為例,log4j2.xml中定義兩個Appender,分別輸出到控制台和檔案app.log中。定義根日誌器的記錄層級是error,輸出到控制台。定義名為com.example.demo.log的日誌器層級是warn,輸出到檔案中。更多Log4j2配置方式,請參見官網Log4j – Configuring Log4j 2 (apache.org)

    <!-- status="WARN",設定Log4j 2自身的內部狀態,而不是應用程式的日誌記錄,它用於在配置過程中捕獲和報告潛在問題。 -->
    <Configuration status="WARN">
        <!-- 定義兩個輸出日誌的目標(Appender)  start  -->
        <Appenders>
            <!-- 定義了一個名為"Console"的控制台輸出Appender,日誌將被列印到系統標準輸出。 -->
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS zzz} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
            <!--  定義了一個名為"MyFile"的檔案輸出Appender,日誌會被寫入到”app.log“這個檔案中。-->
            <File name="MyFile" fileName="app.log">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS zzz} [%t] %-5level %logger{36} - %msg%n"/>
            </File>
        </Appenders>
        <!-- 定義兩個輸出日誌的目標(Appender)  end  -->
    
        <!-- 配置日誌記錄的行為(Logger)      start  -->
        <Loggers>
            <!-- 定義了名為com.example.demo.log的日誌器,其層級設定為trace。它引用了"MyFile" Appender,即"com.example.demo.log" Logger會將trace及以上的日誌會輸出到它自己的Appender("MyFile")。 -->
            <Logger name="com.example.demo.log" level="warn">
                <AppenderRef ref="MyFile" />
            </Logger>
            <!-- 定義了根日誌器(Root Logger),其層級設定為error。它引用了"Console" Appender,即error及以上的日誌會輸出到控制台。 -->
            <Root level="error">
                <AppenderRef ref="Console" />
            </Root>
        </Loggers>
        <!-- 配置日誌記錄的行為(Logger)      end  -->
    </Configuration>
  3. 基本使用。

    編寫測試代碼,讀取定義好的Appender,進行日誌輸出,程式碼範例如下:

        public void logExampleDemo() {
            // 擷取名為 "com.example.demo.log" 的 Logger 執行個體
            Logger logger = LogManager.getLogger("com.example.demo.log");
    
            // 記錄不同層級的日誌訊息
            logger.trace("trace level");
            logger.debug("debug level");
            logger.info("info level");
            logger.warn("warn level");
            logger.error("error level");
            logger.fatal("fatal level");
        }
  4. 日誌範例輸出,如下所示。

    2024-05-28 13:37:16:295 CST [http-nio-8080-exec-8] TRACE com.example.demo.log - trace level
    2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] DEBUG com.example.demo.log - debug level
    2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] INFO  com.example.demo.log - info level
    2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] WARN  com.example.demo.log - warn level
    2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] ERROR com.example.demo.log - error level
    2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] FATAL com.example.demo.log - fatal level

步驟二:採集Log4j日誌到Log Service

說明
  • Log4j2 Appender採集是Log4j2內建的日誌採集方式,對於已整合Log4j2的應用程式,只需進行簡單的配置,即可啟用Appender即時發送日誌,無需寫入伺服器的硬碟。適用於需要即時處理大量日誌資料的巨量資料應用情境。

  • 使用Logtail採集需要在伺服器上安裝Logtail組件,Logtail組件支援多種處理外掛程式。

通過Log4j2 Appender採集Log4j日誌

  1. Maven工程中引入依賴。

    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>2.5.0</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun.openservices</groupId>
        <artifactId>aliyun-log-log4j2-appender</artifactId>
        <version>0.1.12</version>
    </dependency>
  2. 修改設定檔。

    以XML型設定檔log4j2.xml為例(不存在則在專案根目錄建立),配置Loghub相關的appender與Logger,例如:

    <Appenders>
        <Loghub name="Loghub"
                project="your project"
                logStore="your logStore"
                endpoint="your project endpoint"
                accessKeyId="your accessKey id"
                accessKeySecret="your accessKey secret"
                totalSizeInBytes="104857600"
                maxBlockMs="0"
                ioThreadCount="8"
                batchSizeThresholdInBytes="524288"
                batchCountThreshold="4096"
                lingerMs="2000"
                retries="10"
                baseRetryBackoffMs="100"
                maxRetryBackoffMs="100"
                topic="your topic"
                source="your source"
                timeFormat="yyyy-MM-dd'T'HH:mmZ"
                timeZone="UTC"
                ignoreExceptions="true">
            <PatternLayout pattern="%d %-5level [%thread] %logger{0}: %msg"/>
        </Loghub>
    </Appenders>
    <Loggers>
        <Root level="warn">
            <AppenderRef ref="Loghub"/>
        </Root>
    </Loggers>

    其中project、logStore、endpoint、accessKeyId、accessKeySecret為必選參數,是必須填寫的。選擇性參數在不填寫的情況下,使用預設值。詳細說明如下:

    參數名

    參數含義

    project

    Log Service的Proiect名。

    logStore

    Log Service的Logstore名。

    endpoint

    Log Service的公網網域名稱,擷取方式請參見服務存取點

    accessKeyId

    使用者身份識別ID,擷取方式,請參見建立AccessKey

    accessKeySecret

    用於驗證您擁有該AccessKey ID的密碼。擷取方式,請參見建立AccessKey

  3. 測試demo樣本。

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class Log4j2AppenderExample {
    
        private static final Logger LOGGER = LogManager.getLogger(Log4j2AppenderExample.class);
    
        public static void main(String[] args) throws InterruptedException {
            LOGGER.trace("log4j2 trace log");
            LOGGER.debug("log4j2 debug log");
            LOGGER.info("log4j2 info log");
            LOGGER.warn("log4j2 warn log");
            LOGGER.error("log4j2 error log", new RuntimeException("Runtime Exception"));
            Thread.sleep(1000 * 5);
        }
    }

通過Logtail採集Log4j日誌

重要

配置Logtail時需要提供檔案路徑,請您保證應用程式記錄檔可正常寫入到記錄檔中。

  1. 安裝Logtail

    安裝Logtail的操作步驟,請按照安裝Logtail(Linux系統)完成。

  2. 配置Logtail採集配置

    Log Service提供設定精靈,協助您快速完成Logtail採集配置。操作步驟請按照採集主機文本日誌完成。

步驟三:查看日誌

  1. 登入Log Service控制台

  2. 在Project列表地區,單擊目標Project。

    image

  3. 在控制台左側,單擊日誌儲存,在日誌庫列表中單擊目標Logstore。

    image

  4. 查看日誌資料是否上傳成功。在Logstore中查詢和分析日誌,單擊消費預覽快速查看日誌。

    image

  5. 查詢分析日誌。

    重要

    日誌上傳到Logstore後,必須建立索引才能進行查詢分析。配置索引,具體操作,請參見建立索引

    輸入查詢和分析語句,然後單擊最近15分鐘,設定查詢和分析的時間範圍。日誌查詢結果如下所示。

    Appender方式採集

    日誌樣式如下。

    level: ERROR
    location: com.aliyun.openservices.log.log4j.example.Log4jAppenderExample.main(Log4jAppenderExample.java:16)
    message: error log
    throwable: java.lang.RuntimeException: xxx
    thread: main
    time: 2018-01-02T03:15+0000
    log: 0 [main] ERROR com.aliyun.openservices.log.log4j.example.Log4jAppenderExample - error log
    __source__: xxx
    __topic__: yyy

    在Logstore頁面進行查詢分析。

    image

    使用Logtail方式採集

    在Logstore頁面進行查詢分析。

    image

    您可以輸入查詢語句用於日誌資料的查看、簡單搜尋和過濾。更多資訊,請參見查詢和分析日誌。簡單樣本如下。

    • 統計最近1小時發生錯誤最多的3個位置。

      level: ERROR | select location ,count(*) as count GROUP BY  location  ORDER BY count DESC LIMIT 3
    • 統計最近15分鐘各種記錄層級的日誌條數。

      | select level ,count(*) as count GROUP BY level ORDER BY count DESC

相關文檔