使用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的配置文件
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
日志服务的Proiect名。
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
安装Logtail的操作步骤,请按照安装Logtail(Linux系统)完成。
配置Logtail采集配置
日志服务提供配置向导,帮助您快速完成Logtail采集配置。操作步骤请按照采集主机文本日志完成。
步骤三:查看日志
登录日志服务控制台。
在Project列表区域,单击目标Project。
在控制台左侧,单击日志存储,在日志库列表中单击目标Logstore。
查看日志数据是否上传成功。在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页面进行查询分析。
使用Logtail方式采集
在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),请参考服务接入点。