使用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。 
- 若您使用的不是阿里云主账号,而是使用RAM用户,需要为RAM用户授权日志服务Logstore的写入权限。授权的步骤,请先创建自定义权限策略再为RAM用户授权目标权限。 
操作步骤
本文以Java语言为示例,使用Log4j2版本进行演示。通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样。
步骤一:在项目中添加Log4j2的配置文件
- 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>
- 修改配置文件。 - 默认会在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>
- 基本使用。 - 编写测试代码,读取定义好的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"); }
- 日志样例输出,如下所示。 - 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日志
- 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>
- 修改配置文件。 - 以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 - 日志服务的Project名。 - logStore - 日志服务的Logstore名。 - endpoint - 日志服务的公网域名,获取方式请参见服务接入点。 - accessKeyId - 用户身份识别ID,获取方式,请参见创建AccessKey。 - accessKeySecret - 用于验证您拥有该AccessKey ID的密码。获取方式,请参见创建AccessKey。 
- 测试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时需要提供文件路径,请您保证应用程序日志可正常写入到日志文件中。
日志服务提供配置向导,帮助您快速通过Logtail采集文本日志。当ECS与日志服务的Project属于同一个账号且在同一地域,您可以参考主机文本日志采集。否则请参考主机文本日志采集(手动安装)。
步骤三:查看日志
- 登录日志服务控制台。 
- 在Project列表区域,单击目标Project。  
- 在页签中,单击目标Logstore。  
- 查看日志数据是否上传成功。在Logstore中查询与分析快速指引,单击消费预览快速查看日志。  
- 查询分析日志。 - 输入查询和分析语句,然后单击最近15分钟,设置查询和分析的时间范围。日志样例如下。 - 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页面进行查询分析。  - 您可以输入查询语句用于日志数据的查看、简单搜索和过滤。更多信息,请参见查询和分析日志。简单示例如下。 - 统计最近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
 
相关文档
- 使用Logtail采集日志后,如果预览页面为空或查询页面无数据,请参见Logtail采集日志失败的排查思路进行排查。在使用Logtail采集日志时,可能遇到正则解析失败、文件路径不正确、流量超过Shard服务能力等错误。查看Logtail采集错误,请参见如何查看Logtail采集错误信息。采集数据常见的错误类型,请参见日志服务采集数据常见的错误类型。 
- 使用Log4j2 Appender采集Log4j日志的使用实例以及常见问题,请查看Log4j2 Appender,以下版本请查看Log4j Appender。 
- 使用Log4j2 Appender采集Log4j日志时,配置accessKeyId和accessKeySecret的获取方式,请参见创建AccessKey。配置日志服务提供的访问域名(Endpoint),请参考服务接入点。