Spring boot 日志直接推送到elasticsearch上

news2024/9/27 5:43:51

Spring boot 日志直接推送到elasticsearch

      • 前言
        • 核心依赖
        • elasticsearch配置文件
          • 1.url格式如下
          • 2.index索引前缀 "xxx"
          • 3.maxMessageSize参数数据内容最大值,本文未使用(默认值-1全部数据接收)如下
          • 4.BasicAuthentication.java 重写该类用来鉴权 (如果url参数没有使用账号密码,或者账号密码中带有特殊字符的如 #号的)
          • 4.完整配置
        • 使用效果

前言

在分布式系统中定位问题除了时使用日志的链路追踪外,一般还配合一些搜索引擎使用,使用过几种方案后最后跟大家分享下简单实用的方案,Spring boot 日志+elasticsearch

核心依赖

        <!--		logback直接转elasticsearch-->
        <dependency>
            <groupId>com.internetitem</groupId>
            <artifactId>logback-elasticsearch-appender</artifactId>
            <version>1.6</version>
        </dependency>

elasticsearch配置文件

1.url格式如下
<url>http://账号:密码@地址:端口/_bulk</url>
2.index索引前缀 “xxx”
<index>xxx_%date{yyyy-MM-dd}.log</index>
3.maxMessageSize参数数据内容最大值,本文未使用(默认值-1全部数据接收)如下
<maxMessageSize>200</maxMessageSize>
4.BasicAuthentication.java 重写该类用来鉴权 (如果url参数没有使用账号密码,或者账号密码中带有特殊字符的如 #号的)

原类 userInfo = 账号:密码(替换对应字符串)

package com.internetitem.logback.elasticsearch.config;

import com.internetitem.logback.elasticsearch.util.Base64;

import java.net.HttpURLConnection;

public class BasicAuthentication implements Authentication {
    public void addAuth(HttpURLConnection urlConnection, String body) {
        String userInfo = urlConnection.getURL().getUserInfo();
        if (userInfo != null) {
            String basicAuth = "Basic " + Base64.encode(userInfo.getBytes());
            urlConnection.setRequestProperty("Authorization", basicAuth);
        }
    }
}
4.完整配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
    <!-- 自定义参数监听 -->
    <property name="LOG_HOME" value="/app/log" />

    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>


    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${LOG_HOME}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <totalSizeCap>1GB</totalSizeCap>
            <!--日志文件保留天数 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:-} - %thread] %-5level %logger:%L - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 异步输出 -->
    <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACTDEBUGINFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="FILE"/>
    </appender>

    <appender name="ELASTIC" class="com.internetitem.logback.elasticsearch.ElasticsearchAppender">
        <url>http://账号:密码@地址:端口/_bulk</url>
        <index>xxx_%date{yyyy-MM-dd}.log</index>
        <type>类型可选填</type>
        <!--        <loggerName>生成日志名</loggerName> &lt;!&ndash; optional &ndash;&gt;-->
        <errorLoggerName>错误日志名</errorLoggerName> <!-- optional -->
        <connectTimeout>30000</connectTimeout> <!-- optional (in ms, default 30000) -->
        <errorsToStderr>false</errorsToStderr> <!-- optional (default false) -->
        <includeCallerData>false</includeCallerData> <!-- optional (default false) -->
        <logsToStderr>false</logsToStderr> <!-- optional (default false) -->
        <maxQueueSize>104857600</maxQueueSize> <!-- optional (default 104857600) -->
        <maxRetries>3</maxRetries> <!-- optional (default 3) -->
        <readTimeout>30000</readTimeout> <!-- optional (in ms, default 30000) -->
        <sleepTime>250</sleepTime> <!-- optional (in ms, default 250) -->
        <rawJsonMessage>false</rawJsonMessage> <!-- optional (default false) -->
        <includeMdc>false</includeMdc> <!-- optional (default false) -->
        <authentication class="com.internetitem.logback.elasticsearch.config.BasicAuthentication"/> <!-- optional -->
        <properties>
            <property>
                <name>host</name>
                <value>${HOSTNAME}</value>
                <allowEmpty>false</allowEmpty>
            </property>
            <property>
                <name>severity</name>
                <value>%level</value>
            </property>
            <property>
                <name>thread</name>
                <value>%thread</value>
            </property>
            <property>
                <name>stacktrace</name>
                <value>%ex</value>
            </property>
            <property>
                <name>logger</name>
                <value>%logger</value>
            </property>
        </properties>
        <headers>
            <header>
                <name>Content-Type</name>
                <value>application/json</value>
            </header>
        </headers>
    </appender>
    <!-- 异步输出 -->
    <appender name="ASYNC-ELASTIC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACTDEBUGINFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="ELASTIC"/>
    </appender>
    <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
    <!-- <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /> -->
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="INFO" />
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="INFO" />
    <!-- <logger name="org.hibernate.SQL" level="TRACE" /> -->
    <logger name="org.hibernate.SQL" level="INFO" />
    <logger name="org.hibernate.engine.QueryParameters" level="INFO" />
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="INFO" />

    <!-- MyBatis log configure -->
    <logger name="com.apache.ibatis" level="INFO"/>
    <logger name="org.mybatis.spring" level="INFO"/>
    <logger name="java.sql.Connection" level="INFO"/>
    <logger name="java.sql.Statement" level="INFO"/>
    <logger name="java.sql.PreparedStatement" level="INFO"/>

    <!-- 减少部分debug日志 -->
    <logger name="druid.sql" level="INFO"/>
    <logger name="org.apache.shiro" level="INFO"/>
    <logger name="org.mybatis.spring" level="INFO"/>
    <logger name="org.springframework" level="INFO"/>
    <logger name="org.springframework.context" level="INFO"/>
    <logger name="org.springframework.beans" level="INFO"/>
    <logger name="com.baomidou.mybatisplus" level="INFO"/>
    <logger name="org.apache.ibatis.io" level="INFO"/>
    <logger name="org.apache.velocity" level="INFO"/>
    <logger name="org.eclipse.jetty" level="INFO"/>
    <logger name="io.undertow" level="INFO"/>
    <logger name="org.xnio.nio" level="INFO"/>
    <logger name="org.thymeleaf" level="INFO"/>
    <logger name="springfox.documentation" level="ERROR"/>
    <logger name="org.hibernate" level="ERROR"/>
    <logger name="com.netflix.loadbalancer" level="INFO"/>
    <logger name="com.netflix.hystrix" level="INFO"/>
    <logger name="com.netflix.zuul" level="INFO"/>
    <logger name="de.codecentric" level="INFO"/>
    <!-- cache INFO -->
    <logger name="net.sf.ehcache" level="INFO"/>
    <logger name="org.apache.commons" level="INFO" />
    <logger name="org.springframework.cache" level="INFO"/>
    <!-- cloud -->
    <logger name="org.apache.http" level="INFO"/>
    <logger name="com.netflix.discovery" level="INFO"/>
    <logger name="com.netflix.eureka" level="INFO"/>
    <!-- 减少nacos日志 -->
    <logger name="com.alibaba.nacos" level="ERROR"/>

    <!-- 业务日志 -->
    <Logger name="com.cl.frame" level="INFO"/>
    <Logger name="com.cl.framecore.version" level="INFO"/>
    <Logger name="com.cl.frame.shiro.jwt" level="ERROR"/>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="ASYNC-INFO"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ASYNC-ELASTIC"/>
    </root>

</configuration>

使用效果

在这里插入图片描述

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

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

相关文章

详解opencv库函数ellipse()

opencv库函数ellipse()函数可以画扇形&#xff0c;也可以画椭圆。画扇形时只需要将椭圆的长短轴长度设为相同并给定扇形的圆心角即可。 # 参数 1.目标图片 2.椭圆圆心 3.长短轴长度 4.偏转角度 5.圆弧起始角度 6.终止角度 7.颜色 8.是否填充 cv2.ellipse(img_p, (500, 2…

[python] PyMouse、PyKeyboard用python操作鼠标和键盘

1、PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块&#xff0c;非常方便使用。支持的平台及依赖如下&#xff1a; Linux - XlibMac - Quartz, AppKitWindows - pywin32, pyHook 支持python版本&#xff1a;我用的是3.6.7 2、安装 直接源码安装…

越南猫年来袭!2023Lazada年货节热销品趋势

距离2023年春节倒计时23天&#xff01;大家是否对春节假期已经满怀期待了&#xff1f;越南人也和我们一样正期盼着新年到来&#xff0c;越南所有的传统节日都是按照农历来算的&#xff0c;其中春节也是越南重大的节日。春节将至&#xff0c;提前置办年货成了越南人和华人必不可…

MySQL 表的增删改查(进阶篇②)· 联合查询 内连接 外连接 · 自连接 · 子查询 exists · 合并查询 union

接进阶篇①&#xff0c;我们继续学习。 一、联合查询1.1 内连接1.2 外连接1.3 内连接和左右外连接的区别二、自连接三、子查询3.1 单行子查询3.2 多行子查询使用 in 范围匹配多行另一种写法 exists两种写法的区别3.3 在 from 子句中使用子查询四、合并查询unionunion all一、联…

随谈_前端与后端

文章目录一、前言二、前后端分别是什么&#xff1f;2.1. 前端&#xff08;front end&#xff09;2.2. 后端&#xff08;back end&#xff09;一、前言 最近在学习Vue&#xff0c;打算边学边用&#xff0c;开发一个网页系统。 Vue的话&#xff0c;网上介绍很多&#xff0c;简单…

容器安全的三大挑战

容器凭借其经济高效的优势改变了应用程序的交付方式&#xff0c;随着容器的普遍使用&#xff0c;管理应用程序基础设施的 IT 劳动力和资源也显著减少。然而&#xff0c;在保护容器和容器化生态系统时&#xff0c;软件团队遇到了许多障碍。尤其是习惯于更传统的网络安全流程和策…

MYSQL学习之路

MYSQL架构示意图 MYSQL8.0开始移除了查询缓存这个模块&#xff1b; 查询缓存&#xff1a;适合读多写少的任务&#xff1b; 建议&#xff1a;将 have_query_cache 设置为No&#xff0c;在需要使用查询缓存的语句上显式声明&#xff1b; select SQL_CACHE * from test;WAL(Write …

mysql sql优化、查看索引、创建索引

1.索引遵循原则 仅在被频繁检索的字段上创建索引。针对大数据量的表创建索引&#xff0c;而不是针对只有少量数据的表创建索引。通常来说&#xff0c;经常查询的记录数目少于表中总记录数据的 15% 时&#xff0c;可以创建索引。这个比例并不绝对&#xff0c;它与全表扫描速度成…

java:jackson 一:Jackson Annotation

java&#xff1a;jackson 一&#xff1a;Jackson Annotation 1 前言 参考文档地址&#xff1a; https://www.baeldung.com/jacksonhttps://www.baeldung.com/jackson-annotations2 使用 2.1 Jackson Serialization Annotations jackson 序列化注解 2.1.1 JsonAnyGetter T…

产业互联网是以大数据、云计算、AI等为代表的数字技术的出现为标志

事实上&#xff0c;以往&#xff0c;我们所经历的那个互联网玩家频出的年代&#xff0c;其实就是一个以互联网技术为主导的年代。在那样一个年代里&#xff0c;互联网技术几乎是解决一切痛点和难题的万能解药&#xff0c;几乎是破解一切行业痛点和难题的杀手锏。任何一个行业&a…

数据可视化③:大学生就业数据分析

大学生就业是和我们息息相关的话题&#xff0c;每一位大学生都关注着&#xff0c;我们常常在网络上看到有关大学生就业的话题&#xff0c;比如毕业季的一些讨论。在大一的创新创业课中&#xff0c;我们也了解到自己所学的专业和以后如何就业&#xff0c;往哪方面就业。但我们了…

深度学习目标检测_IOU、Precision、Recall、AP、mAP详解

文章目录背景IOU&#xff1a;Intersection Over Unionprecision&#xff08;精度&#xff09;和recall&#xff08;召回率&#xff09;TP、TN 、FP 、FNAP和mAP首先回顾两个概念PR曲线AP(Average Precision&#xff09;mAP(mean Average Precision)背景 目标检测的任务是找出图…

[oeasy]python0035_ 整合shell编程_循环_延迟_清屏

整合shell编程 回忆上次内容 用\r 可以让输出位置回到行首原位刷新时间 如果想要的是大字符效果 需要使用 figlet但同时还希望能刷新这可能吗&#xff1f;&#x1f914; 建立脚本 我们得熟悉一下shell 先新建一个test.sh vi test.sh python3 show_time.py python3 show_time.…

如何通过GB35114国密标准接入到LiveGBS GB28181/GB35114监控平台

1.1 安装LiveGBS GB28181/GB35114视频平台 1.2 获取设备端证书给平台 我们用LiveNVR做为设备端向LiveGBS注册&#xff0c;这里先将LiveNVR的证书导出&#xff0c;并给LiveGBS端。 本地自签名证书是LiveNVR自己给自己签发的证书。如果需要用第三方机构的证书&#xff0c;可点击…

【软件测试】资深测试的总结,有限时间找最有价值bug......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试团队的新同事&a…

Mybatis进阶之自定义TypeHandler

实际应用开发中的难免会有一些需求要自定义一个TypeHandler &#xff0c;比如这样一个需求&#xff1a;前端传来的性别是 男, 女&#xff0c;但是数据库定义的字段却是tinyint 类型&#xff08; 1:男 2:女&#xff09;。此时可以自定义一个年龄的类型处理器&#xff0c;进行转换…

Linux学习笔记——Linux实用操作(一)

04、Linux实用操作 4.1、各类小技巧&#xff08;快捷键&#xff09; 学习目标&#xff1a; 掌握各类实用小技巧 强制停止退出、登出历史命令搜索光标移动 1、Ctrlc强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键Ctrlc 命令输入…

一个基于Vue+SpringBoot的个人博客项目,含数据库文件

blogSpringBoot 项目介绍 完整代码下载地址&#xff1a;一个基于VueSpringBoot的个人博客项目&#xff0c;含数据库文件 该项目是个人博客项目&#xff0c;采用Vue SpringBoot开发。 后台管理页面使用Vue编写&#xff0c;其他页面使用Thymeleaf模板。 项目演示地址&#…

什么是 MySQL 的“回表”?

1. 索引结构 要搞明白这个问题&#xff0c;需要大家首先明白 MySQL 中索引存储的数据结构。这个其实很多小伙伴可能也都听说过&#xff0c;BTree 嘛&#xff01; BTree 是什么&#xff1f;那你得先明白什么是 B-Tree&#xff0c;来看如下一张图&#xff1a; 前面是 B-Tree&am…

不止稳定快速,看华为云CDN如何在国际云服务市场中“分蛋糕”

互联网时代&#xff0c;网络的应用已十分普及&#xff0c;但依然存在下载慢、网络卡顿的现象。如企业业务运行过程中出现的卡顿现象导致数据延时&#xff1b;各校因疫情等原因网课时间长、访问应用人数过多&#xff0c;造成网络卡顿现象严重&#xff0c;无法带来良好的上课体验…