本文以电商平台的日志为例,介绍 Log4j 日志的分析操作。
前提条件
-
已采集 Log4j 日志。具体操作,请参见 采集 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。
例如某电商公司,希望通过分析用户行为习惯数据(例如用户登录方式、上线的时间点及时长、浏览页面、页面停留时间、平均下单时间、消费水平等)、平台稳定性、系统报错、数据安全性等信息获取平台的最佳运营方案。针对此需求,日志服务提供一站式数据采集与分析功能,帮助客户存储并分析日志。
日志服务采集到的日志样例如下所示。
-
记录用户登录行为的日志
level: INFO location: com.aliyun.log4jappendertest.Log4jAppenderBizDemo.login(Log4jAppenderBizDemo.java:38) message: User login successfully. requestID=id4 userID=user8 thread: main time: 2022-01-26T15:31+0000 -
记录用户购买行为的日志
level: INFO location: com.aliyun.log4jappendertest.Log4jAppenderBizDemo.order(Log4jAppenderBizDemo.java:46) message: Place an order successfully. requestID=id44 userID=user8 itemID=item3 amount=9 thread: main time: 2022-01-26T15:31+0000
操作步骤
-
登录 日志服务控制台 。
-
在 Project 列表区域,单击目标 Project。
-
在 页签中,单击目标 Logstore。
-
输入查询和分析语句,然后单击 最近 15 分钟 ,设置查询和分析的时间范围。
更多信息,请参见 步骤一:配置索引 。
-
统计最近 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 -
统计最近 1 小时登录次数最多的三个用户。
login | SELECT regexp_extract(message, 'userID=(?<userID>[a-zA-Z\d]+)', 1) AS userID, count(*) as count GROUP BY userID ORDER BY count DESC LIMIT 3 -
统计最近 15 分钟每个用户的付款总额。
order | SELECT regexp_extract(message, 'userID=(?<userID>[a-zA-Z\d]+)', 1) AS userID, sum(cast(regexp_extract(message, 'amount=(?<amount>[a-zA-Z\d]+)', 1) AS double)) AS amount GROUP BY userID
-