当应用出现业务异常问题时,您可以通过分析业务日志,精准定位业务异常。日志分析功能支持分析日志服务SLS或直接采集的日志,本文介绍如何开通日志分析功能并分析直接采集的日志。

前提条件

ARMS Agent版本为v2.7.1.4或以上。登录ARMS控制台,在应用监控 > Agent列表页面的Java版本发布说明页签获取2.7.1.4版本的Agent安装包。

日志源说明

日志分析功能支持分析的日志源包括:日志服务SLS的日志、直接采集的日志。本文仅介绍如何查询并分析直接采集的日志,日志服务SLS的日志分析详情,请参见日志分析(日志服务SLS)

  • 日志分析(直接采集):通过ARMS探针采集日志框架的输出并直接推送到ARMS的日志分析中心,通过一键开启后无需其他操作即可在ARMS控制台查询分析应用日志。
    说明 日志分析(直接采集)功能需要将探针升级到v2.7.1.4及以上版本。
  • 日志分析(日志服务SLS):

    您需要将应用的日志采集到日志服务SLS,并在ARMS应用配置中配置相应的Project和Logstore,ARMS会内嵌日志服务的页面方便您进行日志分析。

功能开通说明

开通日志采集功能

  1. ARMS控制台左侧导航栏,选择应用监控 > 应用列表
  2. 在顶部菜单栏,选择地域,然后单击应用名称。
  3. 在左侧导航栏中单击应用设置,并在右侧单击自定义配置页签。
  4. 自定义配置页签的应用日志关联配置区域,选择日志源为默认日志,打开日志框架自动采集开关,选择需要采集的日志级别,并设置单条日志显示的最大长度和日志上报限制。
    说明 日志分析功能不会采集日志级别低于应用中配置的日志输出级别的日志。例如应用中配置的日志输出级别为Warn,即使在ARMS控制台配置采集了Debug级别的日志,也不会生效。如果想不重启应用修改应用日志输出级别,您可以使用ARMS的Arthas诊断中的Arthas Shell功能动态修改日志框架的日志输出级别,更多信息,请参见Arthas Shell
    本地日志分析
  5. 自定义配置页签左下角单击保存

日志采集原理

  1. 通过ARMS探针拦截日志框架的日志打印方法,获取日志内容。
  2. 为日志增加部分上下文(例如traceId、spanName、threadName)。
  3. 将日志推送至ARMS日志分析中心存储。
  4. 在ARMS控制台的日志分析页面,查询该条日志。
说明 整个日志采集链路时延大约为10s。

功能额外开销

  • CPU额外开销:0.01核
  • 内存额外开销:20 M以内
  • 带宽额外开销:最大为每秒配置的日志上报条数上限×配置最长日志字符数(个)

单条日志结构

一条日志包含日志附带的Label以及日志自身解析出的字段。

表 1. 日志附带的Label字段
字段 说明
majorVersion 探针主版本号。
minorVersion 探针子版本号。
serverIp 探针所在主机IP。
userId 应用所属用户ID。
appId 应用ID。
job 日志来源,固定为arms-agent。
logType 日志类型,固定为userLog。
表 2. 日志解析出的字段
字段 说明
level 日志级别。
log 包括格式化时间和日志原文。时间和日志中间使用短划线(-)连接。
loggerName Logger名称。
parentAppId 本条日志关联的调用链中上游应用ID。
spanName 本条日志关联的SpanName。
parentSpanName 本条日志关联的上游SpanName。
threadName 线程名称。
traceId 关联的TraceID。
ts 日志上报时间。

常用查询语句示例

下面以appIda2n80plglh@89f2dd21b561bdc的应用为例说明。

关键字查询

例如搜索包含关键字error的日志,查询语句为:
{job="arms-agent", appId="a2n80plglh@89f2dd21b561bdc"} |= "error"
例如搜索traceIdeaac105afb16540713955671006d0009的日志,查询语句为:
{job="arms-agent", appId="a2n80plglh@89f2dd21b561bdc"} |= "eaac105afb16540713955671006d0009"

多条件查询

例如搜索同时包含关键字errorException的日志,查询语句为:
{job="arms-agent", appId="a2n80plglh@89f2dd21b561bdc"} |= "error" |= "Exception"

分析日志

例如想要分析不同spanName error日志输出的数量变化趋势,查询语句为:
sum(count_over_time({job="arms-agent", appId="a2n80plglh@89f2dd21b561bdc"} | json [1m])) by (spanName)
查询结果如下:日志分析(最新)

同理可以查询不同loggerName、threadName、level的日志输出数量变化。