采集Log4j日志

使用Log4j2记录和管理Java应用的运行日志后,您可以使用Log4j2 Appender或Logtail将日志采集到日志服务,以便于后续的查询分析。

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用户并授予日志服务Logstore的写入权限,配置权限的步骤请参见配置权限助手

操作步骤

说明

本文以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日志到日志服务

说明
  • Log4j2 Appender采集是Log4j2内置的日志采集方式,对于已集成Log4j2的应用程序,只需进行简单的配置,即可启用Appender实时发送日志,无需写入服务器的硬盘。适用于需要即时处理大量日志数据的大数据应用场景。

  • 使用Logtail采集需要在服务器上安装Logtail组件,Logtail组件支持多种处理插件。

通过Log4j2 Appender采集Log4j日志

image
  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

    日志服务的Proiect名。

    logStore

    日志服务的Logstore名。

    endpoint

    日志服务的公网域名,获取方式请参见服务接入点

    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日志

image
重要

配置Logtail时需要提供文件路径,请您保证应用程序日志可正常写入到日志文件中。

  1. 安装Logtail

    安装Logtail的操作步骤,请按照安装Logtail(Linux系统)完成。

  2. 配置Logtail采集配置

    日志服务提供配置向导,帮助您快速完成Logtail采集配置。操作步骤请按照采集主机文本日志完成。

步骤三:查看日志

  1. 登录日志服务控制台

  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

相关文档