ELK 日志监控平台(二)- 优化日志格式

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">-->
<!--        &lt;!&ndash;日志文件地址&ndash;&gt;-->
<!--        <file>${LOG_HOME}/demoLog.log</file>-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--            &lt;!&ndash;粒度:天。等价于一天一个文件&ndash;&gt;-->
<!--            <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)。

在这里插入图片描述

如上图所示,我们新增的字段已经添加进去了。

仔细查看可知,输出的日志信息与预期一致,并且我们日志打印时间也和实际的时间一致。

在这里插入图片描述

相关推荐

  1. 关于搭建elk日志平台

    2024-05-25 23:58:45       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-25 23:58:45       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-25 23:58:45       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-25 23:58:45       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-25 23:58:45       20 阅读

热门阅读

  1. [‘column‘]和[:,‘column‘]的区别

    2024-05-25 23:58:45       9 阅读
  2. rust语言一些规则学习

    2024-05-25 23:58:45       9 阅读
  3. 高精度定位平板主要应用在哪些领域

    2024-05-25 23:58:45       12 阅读
  4. 在Mac电脑下怎么部署QAnything?

    2024-05-25 23:58:45       10 阅读
  5. 【Flutter 面试题】 dart是弱引用还是强引用?

    2024-05-25 23:58:45       12 阅读
  6. 2024年5月软考架构题目回忆分享

    2024-05-25 23:58:45       9 阅读
  7. flink 和 clipper搭配使用

    2024-05-25 23:58:45       9 阅读
  8. Flink状态数据结构升级

    2024-05-25 23:58:45       10 阅读
  9. 39、Flink 的窗口剔除器(Evictors)详解

    2024-05-25 23:58:45       9 阅读