logback 集成 logstash

news2025/7/6 8:10:47

logback 集成 logstash

相关环境参考: Java 输出 JSON 日志

1. 添加依赖

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.2</version>
</dependency>

2. 修改logback.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan=true 支持动态更新配置文件,默认1分钟刷新一次,可以通过 scanPeriod="30 seconds" 指定刷新周期 -->
<configuration scan="true">
  <!-- in the absence of the class attribute, assume ch.qos.logback.core.hook.ShutdownHook -->
  <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook">
    <delay>5 seconds</delay>
  </shutdownHook>

  <!-- 控制台输出 -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] - %-5level %logger:%L - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <!-- logstash tcp 服务器地址,可以配置多个地址 -->
    <destination>172.30.225.232:5000</destination>
    <!-- 保持连接 -->
    <keepAliveDuration>5 minutes</keepAliveDuration>
    <!-- 连接超时等待时间 -->
    <connectionTimeout>5 seconds</connectionTimeout>
    <!-- 重连延迟,默认 30s -->
    <reconnectionDelay>30 second</reconnectionDelay>
    <!-- 等待策略,需要测试和监控CPU找到最佳配置 -->
    <!-- 文档: https://github.com/logfellow/logstash-logback-encoder#wait-strategy -->
    <waitStrategyType>sleeping</waitStrategyType>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <customFields>{"host":"${HOSTNAME}", "appname":"cloud-user"}</customFields>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="logstash"/>
    <appender-ref ref="STDOUT"/>
  </root>

</configuration>

3. 配置说明

如果原有配置文件中需要保留一些特殊配置时,需要理解这里的配置才能将配置应用到已有的配置中。

3.1 动态刷新

想要在应用运行时看到修改配置文件后的效果,可以在原有配置添加:

<!-- scan=true 支持动态更新配置文件,默认1分钟刷新一次,可以通过 scanPeriod="30 seconds" 指定刷新周期 -->
<configuration scan="true">

3.2 优雅关机

增加logstash配置后,为了让程序在关闭时能正确关闭相关的资源,建议配置:

<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook">
    <delay>5 seconds</delay>
</shutdownHook>

服务会等待5秒后执行释放资源的相关操作。

3.3 logstash appender

添加下面的配置,各部分说明看下面注释:

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <!-- logstash tcp 服务器地址,可以配置多个地址 -->
    <destination>IP:5000</destination>
    <!-- 保持连接 -->
    <keepAliveDuration>5 minutes</keepAliveDuration>
    <!-- 连接超时等待时间 -->
    <connectionTimeout>5 seconds</connectionTimeout>
    <!-- 重连延迟,默认 30s -->
    <reconnectionDelay>30 second</reconnectionDelay>
    <!-- 等待策略,需要测试和监控CPU找到最佳配置 -->
    <!-- 文档: https://github.com/logfellow/logstash-logback-encoder#wait-strategy -->
    <waitStrategyType>sleeping</waitStrategyType>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <customFields>{"host":"${HOSTNAME}", "appname":"cloud-user"}</customFields>
    </encoder>
</appender>

这里特别说明 <customFields>{"host":"${HOSTNAME}", "appname":"cloud-user"}</customFields>

  • host 会在 json 中添加主机信息,以后有类似 POD 相关信息时,可以参考这里使用环境变量。
  • appname 定义当前的应用名,这里配置死的,后续使用容器或者POD时,也可以通过环境变量进行设置。

除此之外,还可以添加额外的自定义字段。

3.4 应用 appender

将 logstash appender 添加到某个 logger 下面,例如全局的:

<root level="INFO">
    <appender-ref ref="logstash"/>
    <!-- 其他 appender -->
</root>

3.5 总结

到这里可以看到,上面提供的完整配置中,没有介绍常见的 控制台输出,其他都是必要的配置。

配置正常后,就可以将日志以 JSON 形式输出到 logstash 中了,logstash 可以参考下面的配置,提供 tcp 端口的服务:

input {
    tcp {
        port => 5000
        codec => json_lines
    }
}

output {
  elasticsearch {
     hosts => ["elasticsearch:9200"]
     index => "app-%{[appname]}-%{+YYYY.MM.dd}"
  }
  stdout {
  }
}

elasticsearch 插件文档:https://www.elastic.co/guide/en/logstash/8.5/plugins-outputs-elasticsearch.html

上面的配置会为每个 appname 创建对应的索引,在 Kibana 中的 DavaView 可以配置 app* 索引来查看所有应用的日志。

4. 代码中使用

默认情况下,代码中仍然通过 logger.info(...) 方式输出日志即可,日志的内容会作为 message 字段存储。

如果想要额外记录其他信息,全局的信息可以通过 slf4j 的 MDC 机制记录,如下:

//记住用slf4j,不要依赖具体的实现
//import org.slf4j.MDC;
MDC.put("xxx", "xxx");
logger.info(....);
MDC.remove("XXX");

MDC信息和线程绑定,处理不好可能会乱,logstash-logback-encoder 提供了 StructuredArguments,参考文档:

https://github.com/logfellow/logstash-logback-encoder#event-specific-custom-fields

由于这种方式依赖了具体的日志实现,需要做一层封装才适合使用。

5. Kibana 效果

5.1 索引

在这里插入图片描述

5.2 Data Views

在这里插入图片描述

5.3 Discover

在这里插入图片描述

在这里插入图片描述
对应的 JSON:

{
  "_index": "app-cloud-user-2022.11.26",
  "_id": "qbYdsoQBuYtdaHhXAY0t",
  "_version": 1,
  "_score": 0,
  "_source": {
    "message": "hello indexStr=201, 2022-11-26T04:05:55.852Z",
    "@version": "1",
    "appname": "cloud-user",
    "host": "liuzh-pc",
    "level_value": 20000,
    "config": {
      "date": "2022-11-26 12:05:55",
      "uuid": "dd0cedcc-82e4-4783-8bcc-09c32b2fd051"
    },
    "thread_name": "Thread-9",
    "level": "INFO",
    "dateStr": "2022-11-26T04:05:55.852Z",
    "logger_name": "com.example.springbootjsonlog.SpringBootJsonLogApplication",
    "@timestamp": "2022-11-26T04:05:55.852Z",
    "HOSTNAME": "liuzh-pc",
    "indexStr": "201"
  },
  "fields": {
    "config.date": [
      "2022-11-26 12:05:55"
    ],
    "indexStr": [
      "201"
    ],
    "appname.keyword": [
      "cloud-user"
    ],
    "config.date.keyword": [
      "2022-11-26 12:05:55"
    ],
    "appname": [
      "cloud-user"
    ],
    "host": [
      "liuzh-pc"
    ],
    "@version": [
      "1"
    ],
    "logger_name": [
      "com.example.springbootjsonlog.SpringBootJsonLogApplication"
    ],
    "host.keyword": [
      "liuzh-pc"
    ],
    "logger_name.keyword": [
      "com.example.springbootjsonlog.SpringBootJsonLogApplication"
    ],
    "config.uuid.keyword": [
      "dd0cedcc-82e4-4783-8bcc-09c32b2fd051"
    ],
    "thread_name.keyword": [
      "Thread-9"
    ],
    "dateStr": [
      "2022-11-26T04:05:55.852Z"
    ],
    "level": [
      "INFO"
    ],
    "HOSTNAME.keyword": [
      "liuzh-pc"
    ],
    "@version.keyword": [
      "1"
    ],
    "message": [
      "hello indexStr=201, 2022-11-26T04:05:55.852Z"
    ],
    "@timestamp": [
      "2022-11-26T04:05:55.852Z"
    ],
    "HOSTNAME": [
      "liuzh-pc"
    ],
    "level.keyword": [
      "INFO"
    ],
    "level_value": [
      20000
    ],
    "thread_name": [
      "Thread-9"
    ],
    "message.keyword": [
      "hello indexStr=201, 2022-11-26T04:05:55.852Z"
    ],
    "indexStr.keyword": [
      "201"
    ],
    "config.uuid": [
      "dd0cedcc-82e4-4783-8bcc-09c32b2fd051"
    ]
  }
}

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

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

相关文章

TextRank算法实践

TextRank算法实践 PageRank算法思想 TextRank算法的思想主要源于PageRank算法&#xff0c;PageRank算法主要用于给互联网网页排序&#xff0c;根据网页之间的跳转来构造一个初始权重矩阵&#xff08;转移矩阵&#xff09;&#xff0c;默认每个网页质量都是1 使用一个向量v&…

基于多目标粒子群优化算法的冷热电联供型综合能源系统运行优化(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

k8s使用ceph-csi插件的cephfs方式持久化存储

环境说明 操作系统&#xff1a;centos-7.9 x86_64&#xff0c;内核版本3.10.0&#xff0c;所有组件安装均在该操作系统 ceph版本&#xff1a;ceph version 14.2.22 nautilus (stable) kubernetes版本&#xff1a;v1.17.4 ceph-csi版本&#xff1a;v3.0.0 docker版本&#xff1…

【网络安全】红队攻防之基础免杀

引言 本文主要介绍“反射型dll注入”及“柔性加载”技术。 反射型dll注入 为什么需要反射型dll注入 常规的dll注入代码如下&#xff1a; int main(int argc, char *argv[]) { HANDLE processHandle; PVOID remoteBuffer; wchar_t dllPath[] TEXT("C:\\experiments\\…

Go语言学习笔记

1. 普通函数声明/定义 函数声明包括函数名、形式参数列表、返回值列表&#xff08;可省略&#xff09;以及函数体 func 函数名(形式参数列表) (返回值列表){函数体 }2. 接口定义及实现 接口定义&#xff0c;注意和上述函数声明作区分 type 接口名 interface{method1(参数列…

【语音去噪】谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】

⛄一、谱减法维纳滤波卡尔曼滤波语音去噪简介 1 维纳滤波算法 在传统的去噪算法中,维纳滤波因其操作简单、去噪效果好,被公认为一种经典的去噪算法。语音信号在时域的表示为: yi( t) si( t) ni( t) ,其中si( t) 、ni( t) 和yi( t) 分别是第i帧原始语音信号、噪声和被噪声污染…

springboot反射执行private方法@Autowired字段为空

springboot反射执行private方法Autowired字段为空描述错误复现controllerserviceReflectServiceImplReflectCallServiceservice 层切面debug 结果图调用 reflectTest 方法(public反射)调用 reflectTest1方法(private反射)分析参考描述 业务代码写完之后&#xff0c;懒得写mock代…

Python基础(四):Python必需掌握基础注释、变量、输出

文章目录 Python必需掌握基础注释、变量、输出 一、注释 1、作用 2、分类及语法 3、快速体验 4、总结 二、变量 1、作用 2、定义变量 三、输出 1、格式化符号 2、体验 3、转义字符 4、结束符 Python必需掌握基础注释、变量、输出 14天学习训练营导师课程&#xf…

[附源码]计算机毕业设计JAVA汽车租赁系统

[附源码]计算机毕业设计JAVA汽车租赁系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

自动化运维CICD

目录 概述 为什么持续集成和发布可以提高效率 如何实现 1、在linux服务器安装部署代码仓库 2、安装jenkins 使用shell脚本实现CICD 使用pipeline实现CICD 使用Blue Ocean实现CICD 概述 持续集成&#xff08;Continuous Integration&#xff0c;CI)和持续发布&#xff0…

C/C++编译器配置——MinGW下载安装

一. 前言 由于重装Win11系统&#xff0c;所有配置环境需要重装&#xff0c;对于C/C编译器MinGW配置做一个简单记录。 VS code等软件只提供编辑器&#xff0c;不提供编译器&#xff0c;因此windows系统上的C/C编译器需要通过安装MinGW实现。 二. 安装过程 在MinGW官网下载安装…

元宇宙产业委风语筑董事长李晖:到更多城市探索元宇宙“虚实结合”

导语&#xff1a;近期李晖和风语筑团队在深度探索“虚实结合”&#xff0c;布局元宇宙&#xff0c;谋求更多的创新。他受中国移动通信联合会元宇宙产业委员会委托&#xff0c;参与研究编撰《元宇宙十大技术》&#xff0c;并为该书做序《元宇宙&#xff1a;数字技术构建美好生活…

(十)延迟队列

延迟队列1. 延迟队列概念2. 延迟队列使用场景3. 整合Springboot4. TTL队列1. 代码架构图2.MQ组件配置文件类代码3. 消息生产者代码4. 消息消费者代码5. 延时队列优化1. 代码架构图2. 配置文件类代码3. 消息生产者代码6. Rabbitmq插件实现延迟队列1.安装延时队列插件2.代码实现7…

强强联合:OpenFeign 整合 Sentinel

书接前文&#xff1a; 微服务间的远程接口调用&#xff1a;OpenFeign 的使用 当项目中使用了 OpenFeign 后&#xff0c;可以很方便的进行远程服务调用&#xff0c;现在有个问题&#xff0c;假如远程服务出现故障了&#xff0c;调不了远程的接口&#xff0c;这边又着急等着返回…

系统启动其实就2个步骤BIOS和MBR(和之后的init/systemd的关系)

1.让计算机知道系统被放在哪个设备上了&#xff08;BIOS&#xff09; 计算机启动先启动bios&#xff0c;再去读MBR&#xff0c;MBR动了才会启动操作系统 2.让计算机知道哪里的分区是活动分区(MBR)&#xff0c;找出来把系统引导到这里来 这两部类似于早先游戏里的红色警报和星…

springcloud20:springcloudalibaba之Nacos

为什么会出现spring alibaba 整个Netflix项目进入维护模式&#xff08;不会添加新功能&#xff09; springcloud: Nerflix:eureka ribbon feign ruul config springcloud一些小技术和其整合 此时内部出问题 SpringCloud 吸收了springcloud alibaba 此时springcloud带了了什么呢…

【笔试强训】Day 3

&#x1f308;欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x…

python中pytest库用法详解

Pytest 是用于测试 Python 应用的 Python 库。 官方文档&#xff1a;Full pytest documentation — pytest documentation 安装&#xff1a; pip install pytest pytest 测试发现约定规范 如果未指定任何参数&#xff0c;则在testpaths&#xff08;如果已配置&#xff09;或…

智慧水利数字孪生案例分享:数字孪生水利,助力三峡科学防洪防汛

长江是我国第一大河流&#xff0c;长江流域在我国经济发展中&#xff0c;占据举足轻重的地位。与此同时&#xff0c;长江流域频繁的洪涝、气象灾害&#xff0c;严重影响危害着流域内经济社会发展和生态环境&#xff0c;因此长江流域防汛管理被作为我国防洪体系中的关键工程。水…

阿里大咖纯手写的微服务入门笔记,从基础到进阶直接封神

前言 学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的…