本文以电商平台的日志为例,介绍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