分析Log4j日志

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

操作步骤

  1. 登录日志服务控制台

  2. 在Project列表区域,单击目标Project。

    image

  3. 在控制台左侧,单击日志存储,在日志库列表中单击目标Logstore。

    image

  4. 输入查询和分析语句,然后单击最近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