Logback:SpringBoot 2.0 整合 Logback (kafaka es)

1. 规范了日志的打印格式   

2. 增加了彩色日志输出  

3. 支持异步推送kafka  

4. 日志文件压缩功能

我们无需关心 Logback 版本,只需关注 Boot 版本即可,Parent 工程自动集成了 Logback。Springboot 本身就可以打印日志,为什么还需要规范日志?

  • 日志统一,方便查阅管理。

  • 日志归档功能。

  • 日志持久化功能。

  • 分布式日志查看功能(ELK),方便搜索和查阅。

关于 Logback 的介绍就略过了,下面进入代码阶段。本文主要有以下几个功能:

  • 重新规定日志输出格式。

  • 自定义指定包下的日志输出级别。

  • 按模块输出日志。

  • 日志异步推送 Kafka

POM 文件

如果需要将日志持久化到磁盘,则引入如下两个依赖(不需要推送 Kafka 也可以引入)

<properties><logback-kafka-appender.version>0.2.0-RC1</logback-kafka-appender.version><janino.version>2.7.8</janino.version>
</properties>
<!-- 将日志输出到Kafka -->
<dependency><groupId>com.github.danielwegener</groupId><artifactId>logback-kafka-appender</artifactId><version>${logback-kafka-appender.version}</version><scope>runtime</scope>
</dependency><!-- 在xml中使用<if condition>的时候用到的jar包 -->
<dependency><groupId>org.codehaus.janino</groupId><artifactId>janino</artifactId><version>${janino.version}</version>
</dependency>

配置文件

在 项目中resource 文件夹下有三个配置文件

  • logback-defaults.xml

  • logback-pattern.xml

  • logback-spring.xml

logback-spring.xml 

<?xml version="1.0" encoding="UTF-8"?><configuration><include resource="logging/logback-pattern.xml"/><include resource="logging/logback-defaults.xml"/>
</configuration>

 logback-defaults.xml

<?xml version="1.0" encoding="UTF-8"?><included><!-- spring日志 --><property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/><!-- 定义日志文件的输出路径 --><property name="LOG_HOME" value="${LOG_PATH:-/tmp}"/><!--将日志追加到控制台(默认使用LogBack已经实现好的)进入文件,其中<logger>用来设置某一个包或者具体的某一个类的日志打印级别--><include resource="org/springframework/boot/logging/logback/console-appender.xml"/><include resource="logback-pattern.xml"/><!--定义日志文件大小 超过这个大小会压缩归档 --><property name="INFO_MAX_FILE_SIZE" value="100MB"/><property name="ERROR_MAX_FILE_SIZE" value="100MB"/><property name="TRACE_MAX_FILE_SIZE" value="100MB"/><property name="WARN_MAX_FILE_SIZE" value="100MB"/><!--定义日志文件最长保存时间 --><property name="INFO_MAX_HISTORY" value="9"/><property name="ERROR_MAX_HISTORY" value="9"/><property name="TRACE_MAX_HISTORY" value="9"/><property name="WARN_MAX_HISTORY" value="9"/><!--定义归档日志文件最大保存大小,当所有归档日志大小超出定义时,会触发删除 --><property name="INFO_TOTAL_SIZE_CAP" value="5GB"/><property name="ERROR_TOTAL_SIZE_CAP" value="5GB"/><property name="TRACE_TOTAL_SIZE_CAP" value="5GB"/><property name="WARN_TOTAL_SIZE_CAP" value="5GB"/><!-- 按照每天生成日志文件 --><appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 当前Log文件名 --><file>${LOG_HOME}/info.log</file><!-- 压缩备份设置 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/backup/info/info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxHistory>${INFO_MAX_HISTORY}</maxHistory><maxFileSize>${INFO_MAX_FILE_SIZE}</maxFileSize><totalSizeCap>${INFO_TOTAL_SIZE_CAP}</totalSizeCap></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_LOG_PATTERN}</pattern></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter></appender><appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 当前Log文件名 --><file>${LOG_HOME}/warn.log</file><!-- 压缩备份设置 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/backup/warn/warn.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxHistory>${WARN_MAX_HISTORY}</maxHistory><maxFileSize>${WARN_MAX_FILE_SIZE}</maxFileSize><totalSizeCap>${WARN_TOTAL_SIZE_CAP}</totalSizeCap></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_LOG_PATTERN}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 当前Log文件名 --><file>${LOG_HOME}/error.log</file><!-- 压缩备份设置 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/backup/error/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxHistory>${ERROR_MAX_HISTORY}</maxHistory><maxFileSize>${ERROR_MAX_FILE_SIZE}</maxFileSize><totalSizeCap>${ERROR_TOTAL_SIZE_CAP}</totalSizeCap></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_LOG_PATTERN}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- Kafka的appender --><appender name="KAFKA" class="com.github.danielwegener.logback.kafka.KafkaAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_LOG_PATTERN}</pattern></encoder><topic>${kafka_env}applog_${spring_application_name}</topic><keyingStrategy class="com.github.danielwegener.logback.kafka.keying.HostNameKeyingStrategy" /><deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy" /><producerConfig>bootstrap.servers=${kafka_broker}</producerConfig><!-- don't wait for a broker to ack the reception of a batch. --><producerConfig>acks=0</producerConfig><!-- wait up to 1000ms and collect log messages before sending them as a batch --><producerConfig>linger.ms=1000</producerConfig><!-- even if the producer buffer runs full, do not block the application but start to drop messages --><producerConfig>max.block.ms=0</producerConfig><!-- Optional parameter to use a fixed partition --><partition>8</partition></appender><appender name="KAFKA_ASYNC" class="ch.qos.logback.classic.AsyncAppender"><appender-ref ref="KAFKA" /></appender><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="INFO_FILE"/><appender-ref ref="WARN_FILE"/><appender-ref ref="ERROR_FILE"/><if condition='"true".equals(property("kafka_enabled"))'><then><appender-ref ref="KAFKA_ASYNC"/></then></if></root></included>

 注意:

  • 上面的 <partition>8</partition> 指的是将消息发送到哪个分区,如果你主题的分区为 0~7,那么会报错,解决办法是要么去掉这个属性,要么指定有效的分区。

  • HostNameKeyingStrategy 是用来指定 key 的生成策略,我们知道 kafka 是根据 key 来判定将消息发送到哪个分区上的,此种是根据主机名来判定,这样带来的好处是每台服务器生成的日志都是在同一个分区上面,从而保证了时间顺序。但默认的是 NoKeyKeyingStrategy,会随机分配到各个分区上面,这样带来的坏处是,无法保证日志的时间顺序,不推荐这样来记录日志。

logback-pattern.xml 

<?xml version="1.0" encoding="UTF-8"?><included><!-- 日志展示规则,比如彩色日志、异常日志等 --><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" /><!-- 自定义日志展示规则 --><conversionRule conversionWord="ip" converterClass="com.ryan.utils.IPAddressConverter" /><conversionRule conversionWord="module" converterClass="com.ryan.utils.ModuleConverter" /><!-- 上下文属性 --><springProperty scope="context" name="spring_application_name" source="spring.application.name" /><springProperty scope="context" name="server_port" source="server.port" /><!-- Kafka属性配置 --><springProperty scope="context" name="spring_application_name" source="spring.application.name" /><springProperty scope="context" name="kafka_enabled" source="ryan.web.logging.kafka.enabled"/><springProperty scope="context" name="kafka_broker" source="ryan.web.logging.kafka.broker"/><springProperty scope="context" name="kafka_env" source="ryan.web.logging.kafka.env"/><!-- 日志输出的格式如下 --><!-- appID | module | dateTime | level | requestID | traceID | requestIP | userIP | serverIP | serverPort | processID | thread | location | detailInfo--><!-- CONSOLE_LOG_PATTERN属性会在console-appender.xml文件中引用 --><property name="CONSOLE_LOG_PATTERN" value="%clr(${spring_application_name}){cyan}|%clr(%module){blue}|%clr(%d{ISO8601}){faint}|%clr(%p)|%X{requestId}|%X{X-B3-TraceId:-}|%X{requestIp}|%X{userIp}|%ip|${server_port}|${PID}|%clr(%t){faint}|%clr(%.40logger{39}){cyan}.%clr(%method){cyan}:%L|%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/><!-- FILE_LOG_PATTERN属性会在logback-defaults.xml文件中引用 --><property name="FILE_LOG_PATTERN" value="${spring_application_name}|%module|%d{ISO8601}|%p|%X{requestId}|%X{X-B3-TraceId:-}|%X{requestIp}|%X{userIp}|%ip|${server_port}|${PID}|%t|%.40logger{39}.%method:%L|%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/><!--将 org/springframework/boot/logging/logback/defaults.xml 文件下的默认logger写过来--><logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/><logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/><logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/><logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/><logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/><logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/><logger name="org.hibernate.validator.internal.util.Version" level="WARN"/></included>

 自定义获取 moudle

/*** <b>Function: </b> 获取日志模块名称** @program: ModuleConverter * @Package: com.kingbal.king.dmp* @author: songjianlin* @date: 2024/04/17* @version: 1.0* @Copyright: 2024 www.kingbal.com Inc. All rights reserved.*/
public class ModuleConverter extends ClassicConverter {private static final int MAX_LENGTH = 20;@Overridepublic String convert(ILoggingEvent event) {if (event.getLoggerName().length() > MAX_LENGTH) {return "";} else {return event.getLoggerName();}}
}

 自定义获取 ip

/*** <b>Function: </b> 获取ip地支** @program: IPAddressConverter * @Package: com.kingbal.king.dmp* @author: songjianlin* @date: 2024/04/17* @version: 1.0* @Copyright: 2024 www.kingbal.com Inc. All rights reserved.*/
@Slf4j
public class IPAddressConverter extends ClassicConverter {private static String ipAddress;static {try {ipAddress = InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {log.error("fetch localhost host address failed", e);ipAddress = "UNKNOWN";}}@Overridepublic String convert(ILoggingEvent event) {return ipAddress;}
}

 按模块输出

给 @Slf4j 加上 topic。

/*** <b>Function: </b> todo** @program: LogbackController* @Package: com.kingbal.king.dmp* @author: songjianlin* @date: 2024/04/17* @version: 1.0* @Copyright: 2024 www.kingbal.com Inc. All rights reserved.*/
@RestController
@RequestMapping(value = "/portal")
@Slf4j(topic = "LogbackController")
public class LogbackController {@RequestMapping(value = "/gohome")public void m1() {log.info("buddy,we go home~");}}

自定义日志级别

如果想打印 SQL 语句,需要将日志级别设置成 debug 级别。

logging.path = /tmp
logging.level.com.ryan.trading.account.dao = debug 

 推送 Kafka展开目录

ryan.web.logging.kafka.enabled=true
#多个broker用英文逗号分隔
ryan.web.logging.kafka.broker=127.0.0.1:9092
#创建Kafka的topic时使用
ryan.web.logging.kafka.env=test

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

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

相关文章

1 回归:锂电池温度预测top2 代码部分(一) Tabnet

2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 TabNet&#xff1a; 模型也是我在这个比赛一个意外收获&#xff0c;这个模型在比赛之中可用。但是需要GPU资源&#xff0c;否则运行真的是太慢了。后面针对这个模型我会写出如何使用的方法策略。 比赛结束后有与其他两位选手聊天&am…

win2022服务器apache配置https(ssl)真实环境实验(避坑之作)不依赖宝塔小皮等集成环境

本次实验背景&#xff1a; 完全参考官方 https://cloud.tencent.com/document/product/400/4143 文档流程&#xff0c;没有搞定&#xff0c;于是写下避坑之作。 服务器&#xff1a;腾讯云轻量应用服务器 操作系统&#xff1a; Windows Server 2022 DataCenter 64bit CN apache…

李沐45_SSD实现——自学笔记

主体思路&#xff1a; 1.生成一堆锚框 2.根据真实标签为每个锚框打标(类别、偏移、mask) 3.模型为每个锚框做一个预测(类别、偏移) 4.计算上述二者的差异损失&#xff0c;以更新模型weights 先读取一张图像。 它的高度和宽度分别为561和728像素。 %matplotlib inline import …

Photoshop 2024 (ps) v25.6中文 强大的图像处理软件 mac/win

Photoshop 2024 for Mac是一款强大的图像处理软件&#xff0c;专为Mac用户设计。它继承了Adobe Photoshop一贯的优秀功能&#xff0c;并进一步提升了性能和稳定性。 Mac版Photoshop 2024 (ps)v25.6中文激活版下载 win版Photoshop 2024 (ps)v25.6直装版下载 无论是专业的设计师还…

EI Scopus双检索 | 2024年清洁能源与智能电网国际会议(CCESG 2024)

会议简介 Brief Introduction 2024年清洁能源与智能电网国际会议(CCESG 2024) 会议时间&#xff1a;2024年 11月27-29日 召开地点&#xff1a;澳大利亚悉尼 大会官网&#xff1a;CCESG 2024-2024 International Joint Conference on Clean Energy and Smart Grid 由CoreShare科…

m4p转换mp3格式怎么转?3个Mac端应用~

M4P文件格式的诞生伴随着苹果公司引入FairPlay版权管理系统&#xff0c;该系统旨在保护音频的内容。M4P因此而生&#xff0c;成为受到FairPlay系统保护的音频格式&#xff0c;常见于苹果设备的iTunes等平台。 MP3文件格式的多个优点 MP3格式的优点显而易见。首先&#xff0c;其…

k8s之etcd

1.特点&#xff1a; etcd 是云原生架构中重要的基础组件。有如下特点&#xff1a; 简单&#xff1a;安装配置简单&#xff0c;而且提供了 HTTP API 进行交互&#xff0c;使用也很简单键值对存储&#xff1a;将数据存储在分层组织的目录中&#xff0c;如同在标准文件系统中监…

vscode msvc qt环境搭建

自己整了好久都没把环境搞好&#xff0c;后来发现已经有大佬搞好了插件&#xff0c;完全不需要自己整理。 下载如下插件&#xff1a; 第二个qt插件就可以自动帮我们生成工程了。 可惜目前似乎支持win&#xff0c;另外就是debug模式运行后会报qwindowsd.dll插件找不到的错误&a…

【简单讲解下如何用爬虫玩转石墨文档】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

链表OJ - 6(链表分割)

题目描述&#xff08;来源&#xff09; 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 思路 创建两个链表&#xff0c…

ChatGPT:引领未来的语言模型革命?

一、引言 随着人工智能技术的不断发展&#xff0c;Chat GPT作为一种自然语言处理技术&#xff0c;已经逐渐渗透到各个领域&#xff0c;具有广泛的应用前景。本文将从多个角度探讨Chat GPT的应用领域及其未来发展趋势。 ChatGPT的语言处理能力超越了以往任何一款人工智能产品。…

Docker一键快速私有化部署(Ollama+Openwebui) +AI大模型(gemma,llama2,qwen)20240417更新

几行命令教你私有化部署自己的AI大模型&#xff0c;每个人都可以有自己的GTP 第一步&#xff1a;安装Docker(如果已经有了可以直接跳第二步) ####下载安装Docker wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo##…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收&#xff0c;也就是说单片机可以自动适应上位机的波特率设置。…

4.17作业

#include "double_link_list.h" node_p create_double_link_list() //创建双向链表 {node_p H(node_p)malloc(sizeof(node));if(HNULL){printf("空间申请失败\n");return NULL;}H->data0;H->priNULL;H->nextNULL;return H; } node_p create_node…

BUUCTF——[GXYCTF2019]BabyUpload

BUUCTF——[GXYCTF2019]BabyUpload 1.上传嘛&#xff0c;直接丢正常的jpg文件进服务器 2.发现可以正常上传&#xff0c;并且回显出来啦文件上传的路径 /var/www/html/upload/7df22610744ec51e9cb7a8a8eb674374/1111.jpg 3.尝试上传一句话木马 <?php eval($POST[123456]…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

「 网络安全常用术语解读 」漏洞利用交换VEX详解

漏洞利用交换&#xff08;Vulnerability Exploitability eXchange&#xff0c;简称VEX&#xff09;是一个信息安全领域的标准&#xff0c;旨在提供关于软件漏洞及其潜在利用的实时信息。根据美国政府发布的用例(PDF)&#xff0c;由美国政府开发的漏洞利用交换(VEX)使供应商和用…

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化&#xff0c;并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑&#xff0c;上层通过网络与MES系统连接&#xff0c;下层连接显示器展示作业指导书。ESOP控制终…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、小程序、Uniapp、标准Java平台&#xff0c;服务端基于Netty编写。 工…

朗思-我的家园正式上线:朗思科技Agent工具软件--人人拥有“Ai-机器人”

4月16日&#xff0c;朗思科技正式发布"朗思-我的家园"。朗思科技是国内领先的Ai Agent智能自动化工具软件产品及方案的提供商&#xff0c;始终坚持自主研发&#xff0c;全面支持国产信创&#xff0c;不断加快产品创新迭代。基于技术领先性和战略前瞻性&#xff0c;其…