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

news2024/7/29 23:41:42

文章目录

  • 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">-->
<!--        &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)。

在这里插入图片描述

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java网络编程之TCP协议核心机制(二)

目录 题外话 正题 滑动窗口机制 如果出现丢包问题怎么办?? 滑动窗口触发条件 流量控制 拥塞控制 小结 题外话 宿舍没有空调的感觉谁懂?!!! 人要蒸发了,八点自动热醒,直接强行学习 正题 我们继续讲解TCP协议核心机制 上篇博客讲完了,建立连接机制,确认应答机制,超时…

Boxy SVG for Mac:打造精致矢量图形的得力助手

在矢量图形设计领域&#xff0c;Boxy SVG for Mac以其出色的性能和丰富的功能&#xff0c;成为了设计师们的得力助手。 Boxy SVG for Mac(矢量图编辑器) v4.32.0免激活版下载 Boxy SVG具备强大的编辑能力&#xff0c;支持节点编辑、路径绘制、颜色填充等多种操作&#xff0c;让…

struct.unpack_from()学习笔记

struct.unpack_from(fmt,b_data,offset) 按照指定的格式fmt&#xff0c;从偏移位置offset&#xff0c;对b_data开始解包&#xff0c;返回数据格式是一个元组(v1,v2…) fmt可以有&#xff1a; _struct.py: The remaining chars indicate types of args and must match exactly;…

实现 YOLO 目标计数 | 含代码示例

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 在YOLO算法的无数应用中&#xff0c;我们想聚焦于一个真实的场景&#xff1a;道路车辆计数。这个用例对于智能城市的交通规划和决策具有重要意义。在这篇文章中&#xff0c;我们将带您一步步实现YOLO目标检测和计数&…

工业路由器在新能源数字化中的应用:重塑能源行业的未来

随着全球对可再生能源和能源效率的追求日益加强&#xff0c;新能源数字化已成为推动行业发展的关键因素。在这一变革的浪潮中&#xff0c;工业路由器以其卓越的性能和独特的功能&#xff0c;成为新能源数字化不可或缺的核心组件。本文将深入探讨工业路由器在新能源数字化中的应…

对话:用言语构建深刻的思想碰撞

对话&#xff1a;用言语构建深刻的思想碰撞 在写书中&#xff0c;对话是一种有力的工具&#xff0c;能与读者进行有效的沟通和交流&#xff0c;引发深思和反思。它不仅是信息传递的方式&#xff0c;更是加深情感、探讨主题和吸引读者参与的桥梁。你应从读者的角度思考&#xf…

【学习AI-相关路程-工具使用-自我学习-jetsoncudapytorch-开发工具尝试-基础样例 (3)】

【学习AI-相关路程-工具使用-自我学习-jetson&cuda&pytorch-开发工具-安装尝试-基础样例 &#xff08;3&#xff09;】 1、前言2、环境说明3、自我总结&#xff08;1&#xff09;了解整体过程阶段 1: 硬件设置阶段 2: 软件准备阶段 3: 数据准备阶段 4: 模型设计和训练阶…

在Spring 当中存在的八大模式

在Spring 当中存在的八大模式 文章目录 在Spring 当中存在的八大模式每博一文案1. 简单工厂模式2. 工厂方法模式3. 单例模式4. 代理模式5. 装饰器模式6. 观察者模式7. 策略模式8. 模板方法模式最后&#xff1a; 每博一文案 我认为 “知世故而不世故” 才是真正意义上的成熟。回…

Python功能强大的构建系统库之buildout使用详解

概要 在软件开发过程中,管理项目依赖和构建环境是一项复杂而重要的任务。Python buildout库是一种强大的构建系统,能够帮助开发者自动化地管理项目的依赖、生成可重复的开发环境,并简化部署过程。本文将详细介绍buildout库,包括其安装方法、主要特性、基本和高级功能,以及…

csdn的insCode怎么用IDE和linux终端

1.进入insCode&#xff0c;选择工作台 找到我的项目&#xff0c;没有项目的话可以新建一个。 选择在IDE中编辑&#xff0c;界面如下&#xff1a; 右边有个终端&#xff0c;点击即可出现linux的xterm终端。

区块链技术和应用

文章目录 前言 一、区块链是什么&#xff1f; 二、区块链核心数据结构 2.1 交易 2.2 区块 三、交易 3.1 交易的生命周期 3.2 节点类型 3.3 分布式系统 3.4 节点数据库 3.5 智能合约 3.6 多个记账节点-去中心化 3.7 双花问题 3.8 共识算法 3.8.1 POW工作量证明 总结 前言 学习长…

算法:树状数组

文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…

Volatile的内存语义

1、volatile的特性 可见性&#xff1a;对一个volatile变量的读&#xff0c;总能够看到任意一个线程对这个volatile变量的写入。 原子性&#xff1a;对任意单个volatile变量的读/写具有原子性&#xff0c;但类似于volatile这种复合操作不具有原子性。 接下来我们用程序验证。…

如何用Java实现SpringCloud Alibaba Sentinel的熔断功能?

在Java中使用Spring Cloud Alibaba Sentinel实现熔断功能的步骤如下&#xff1a; 添加依赖 在项目的pom.xml文件中添加Spring Cloud Alibaba Sentinel的依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud…

强烈推荐 20.7k Star!企业级商城开源项目强烈推荐!基于DDD领域驱动设计模型,助您快速掌握技术奥秘,实现业务快速增长

更多资源请关注纽扣编程微信公众号 1 项目简介 商城是个从零到一的C端商城项目&#xff0c;包含商城核心业务和基础架构两大模块,推出用户、消息、商品、订单、优惠券、支付、网关、购物车等业务模块&#xff0c;通过商城系统中复杂场景&#xff0c;给出对应解决方案。使用 …

Linux_应用篇(08) 信号-基础

本章将讨论信号&#xff0c;虽然信号的基本概念比较简单&#xff0c;但是其所涉及到的细节内容比较多&#xff0c;所以本章篇幅也会相对比较长。 事实上&#xff0c;在很多应用程序当中&#xff0c;都会存在处理异步事件这种需求&#xff0c;而信号提供了一种处理异步事件的方法…

使用VirtualBox+vagrant创建CentOS7虚拟机

1.VirtualBox 1.1.什么是VirtualBox VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发&#xff0c;由Sun Microsystems公司出品的软件&#xff0c;使用Qt编写&#xff0c;在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。 1.2.下载Virtual…

优先级队列(堆)的实现

1.什么是优先级队列 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比如&#x…

Atlas 200I DK A2安装MindSpore Ascend版本

一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本&#xff0c;Atlas 200I DK A2无法安装MindSpore Ascend版本。 也有其他博主测试&#xff0c;也未尝成功&#xff0c;例如&#xff1a;【MindSpore易点通漫游世界】在Atlas 200I DK A2 (CANN6.2.RC2)…

【汽车之家注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…