文章目录
- ELK 日志监控平台(二)- 优化日志格式
- 1.日志输出要点
- 2.优化应用的日志格式
- 2.1.确定日志输出要点来源
- 2.1.1.服务名称
- 2.1.2.服务环境
- 2.1.3.日志级别
- 2.1.4.日志输出时间
- 2.1.5.日志内容
- 2.1.6.日志输出对象
- 2.1.7.线程名称
- 2.2.logback.xml修改日志输出格式
- 3.修改logstash的配置文件
- 4.Kibana查看日志
ELK 日志监控平台(二)- 优化日志格式
上一篇文章《ELK 日志监控平台(一)- 快速搭建》中的最后一节,展示了一个小demo。其实细心一点就会发现一个问题,输出到 ES 的日志格式一点也不友好,实际的应用日志信息都集中在message索引字段中,而且日志的实际输出时间也不是应用中打印日志的时间,而是输出到 ES 的时间。
一个良好的日志格式可以确保日志信息易于阅读、解析和分析,便于在日志分析和故障排查中发挥作用。
1.日志输出要点
- 服务名称:service_name
- 生成该日志的具体组件或服务的名称,以便更好地区分不同来源的日志。
- 服务环境:environment
- 用于区分当前应用所在环境:测试、开发、验收、生产。
- 日志级别:level
- 指示日志的重要程度或严重程度
- 日志输出时间:time
- 包含精确到毫秒的时间信息,以便准确定位事件发生的时间点。
- 日志内容:message
- 清晰、简洁、易于理解的日志消息,描述了所记录事件的关键信息。
- 日志输出对象:clazz
- 用于记录日志的组件或对象。
- 线程名称:thread_name
- 如果是多线程应用程序,可以在日志中包含线程的名称或ID,以便更好地理解日志事件发生时的上下文。
- 跟踪标识或请求ID:trace_id(本次不实现)
- 在分布式系统中,为了能够追踪整个请求的处理过程,建议为每个请求生成唯一的跟踪标识或请求ID,并将其包含在日志中。
2.优化应用的日志格式
2.1.确定日志输出要点来源
2.1.1.服务名称
可以在配置文件中指定,例如application.yaml
。这些都是可以自定义属性来指定的,所以不一定非得和鄙人的配置方式一致。
spring:
application:
name: AHAO日志应用
2.1.2.服务环境
spring:
profiles:
active: test
2.1.3.日志级别
在logback.xml
中 %level
表示。
2.1.4.日志输出时间
在logback.xml
中 %d
表示。
2.1.5.日志内容
在logback.xml
中 %msg
表示。
2.1.6.日志输出对象
在logback.xml
中 %logger
表示。
2.1.7.线程名称
在logback.xml
中 %thread
表示。
2.2.logback.xml修改日志输出格式
首先引入增加 Logbak JSON 解析依赖。
<!-- Logback JSON Encoder -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>
logback.xml文件修改日志输出文件中的日志格式。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--日志文件所在目录-->
<property name="LOG_HOME" value="/logs/log" />
<springProperty scope="context" name="application" source="spring.application.name"/>
<springProperty scope="context" name="env" source="spring.profiles.active"/>
<!--采用打印到控制台,记录日志的方式-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--日志输出格式-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--滚动记录文件-->
<!-- <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <!–日志文件地址–>-->
<!-- <file>${LOG_HOME}/demoLog.log</file>-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!-- <!–粒度:天。等价于一天一个文件–>-->
<!-- <fileNamePattern>${LOG_HOME}/demoLog-%d{yyyy-MM-dd}.log</fileNamePattern>-->
<!-- </rollingPolicy>-->
<!-- <encoder>-->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
<!-- </encoder>-->
<!-- </appender>-->
<appender name="rollingFile2" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件地址-->
<file>${LOG_HOME}/demoLog.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--粒度:天。等价于一天一个文件-->
<fileNamePattern>${LOG_HOME}/demoLog-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<pattern>
{
"time":"%d{yyyy-MM-dd HH:mm:ss.SSS}",
"level":"%level",
"thread_name":"%thread",
"clazz":"%logger{36}",
"message":"%msg",
"environment":"${env}",
"service_name":"${application}"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<root level="INFO" additivity="false">
<appender-ref ref="rollingFile2" />
<appender-ref ref="console" />
</root>
</configuration>
3.修改logstash的配置文件
在logstash/config
目录新增一个配置文件名为 demo_json.log,内容如下:
input {
file {
path => "/logs/log/demoLog.log"
start_position => "beginning"
stat_interval => "3"
type => "demo_log"
codec => json
}
}
filter {
date {
match => ["time", "yyyy-MM-dd HH:mm:ss.SSS"]
target => "@timestamp"
}
}
output {
if [type] == "demo_log" {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
index => "demo_log-%{+YYYY.MM.dd}"
}
}
}
编码插件(codec)可以在logstash输入或输出时处理不同类型的数据。如果logstash采集的日志是JSON
格式,那我们可以在input
字段加入codec => json
来进行解析,这样就可以根据具体内容生成字段,方便分析和储存。同理 logstash输出为JSON
格式,可以在output
字段加入codec=>json
。
filter/date
插件可以用来转换你的日志记录中的时间字符串,变成 LogStash::Timestamp 对象,然后转存到 @timestamp 字段里
- **match中参数:**字段名,格式化模式,要转换的时间格式
- **target:**值类型是字符串,默认值是“@timestamp”。将匹配的时间戳存储到给定的目标字段中。
最后重新启动 Logstash。
4.Kibana查看日志
进入Stack Management/索引模式,并点击 demo_log*
界面(上一篇文章配置过,如果不会可以先看一下上一篇文章的demo)。
如上图所示,我们新增的字段已经添加进去了。
仔细查看可知,输出的日志信息与预期一致,并且我们日志打印时间也和实际的时间一致。