SpringBoot第8讲:SpringBoot添加Logback日志

SpringBoot第8讲:SpringBoot添加Logback日志

本文是SpringBoot第8讲,对SpringBoot添加Logback日志。SpringBoot开发中如何选用日志框架呢? 出于性能等原因,Logback 目前是springboot应用日志的标配; 当然有时候在生产环境中也会考虑和三方中间件采用统一处理方式。

文章目录

  • SpringBoot第8讲:SpringBoot添加Logback日志
    • 1、日志框架的基础
      • 1.1、关于日志框架(日志门面)
      • 1.2、配置时考虑点
    • 2、实现范例
      • 2.1、综合范例
      • 2.2、在配置前可以参考如下文章
      • 2.3、商品中心配置示例
      • 2.4、白龙马配置示例
    • 3、参考文档

1、日志框架的基础

在学习这块时需要一些日志框架的发展和基础,同时了解日志配置时考虑的因素。

1.1、关于日志框架(日志门面)

Java日志库是最能体现Java库在进化中的渊源关系的,在理解时重点理解日志框架本身日志门面,以及比较好的实践等。要关注其历史渊源和设计(比如桥接),而具体在使用时查询接口即可,否则会陷入JUL(Java Util Log), JCL(Commons Logging), Log4j, SLF4J, Logback,Log4j2 傻傻分不清楚的境地。

关于日志框架(日志门面)这篇文章有过详细的介绍。

开发工具篇第十四讲:日志类库详解

1.2、配置时考虑点

在配置日志时需要考虑哪些因素?

  • 支持日志路径,日志level等配置
    • <appender-ref ref="${log.appender.application}"/>
  • 日志控制配置通过application.yml下发
  • 按天生成日志,当天的日志>50MB回滚
  • 最多保存15天日志
  • 生成的日志中Pattern自定义
    • <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [%traceId] %logger{5} - %msg%n</pattern>
  • Pattern中添加用户自定义的MDC字段,比如用户信息(当前日志是由哪个用户的请求产生),request信息。此种方式可以通过AOP切面控制,在MDC中添加requestID,在spring-logback.xml中配置Pattern。
  • 根据不同的运行环境设置Profile - dev,test,product
    • 例如:huxun.gateway.profile=dev
  • 对控制台,Err和全量日志分别配置
  • 对第三方包路径日志控制

2、实现范例

如下两个例子基本包含了上述的考虑点:

2.1、综合范例

  • application.yml
logging:level:root: debugpath: C:/data/logs/springboot-logback-demo
server:port: 8080
spring:application:name: springboot-logback-demo
debug: false
  • Spring-logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 日志根目录--><springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/springboot-logback-demo"/><!-- 日志级别 --><springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/><!--  标识这个"STDOUT" 将会添加到这个logger --><springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/><!-- 日志文件名称--><property name="LOG_PREFIX" value="spring-boot-logback" /><!-- 日志文件编码--><property name="LOG_CHARSET" value="UTF-8" /><!-- 日志文件路径+日期--><property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" /><!--对日志进行格式化--><property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/><!--文件大小,默认10MB--><property name="MAX_FILE_SIZE" value="50MB" /><!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志--><property name="MAX_HISTORY" value="10"/><!--输出到控制台--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- 输出的日志内容格式化--><layout class="ch.qos.logback.classic.PatternLayout"><pattern>${LOG_MSG}</pattern></layout></appender><!--输出到文件--><appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender"></appender><!-- 定义 ALL 日志的输出方式:--><appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"><!--日志文件路径,日志文件名称--><File>${LOG_HOME}/all_${LOG_PREFIX}.log</File><!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 --><FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern><!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志--><MaxHistory>${MAX_HISTORY}</MaxHistory><!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB--><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>${MAX_FILE_SIZE}</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 输出的日志内容格式化--><layout class="ch.qos.logback.classic.PatternLayout"><pattern>${LOG_MSG}</pattern></layout></appender><!-- 定义 ERROR 日志的输出方式:--><appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 下面为配置只输出error级别的日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><OnMismatch>DENY</OnMismatch><OnMatch>ACCEPT</OnMatch></filter><!--日志文件路径,日志文件名称--><File>${LOG_HOME}/err_${LOG_PREFIX}.log</File><!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 --><FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern><!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志--><MaxHistory>${MAX_HISTORY}</MaxHistory><!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB--><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>${MAX_FILE_SIZE}</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 输出的日志内容格式化--><layout class="ch.qos.logback.classic.PatternLayout"><Pattern>${LOG_MSG}</Pattern></layout></appender><!-- additivity 设为false, 则logger内容不附加至root,配置以配置包下的所有类的日志的打印,级别是 ERROR--><logger name="org.springframework"     level="ERROR" /><logger name="org.apache.commons"      level="ERROR" /><logger name="org.apache.zookeeper"    level="ERROR"  /><logger name="com.alibaba.dubbo.monitor" level="ERROR"/><logger name="com.alibaba.dubbo.remoting" level="ERROR" /><!-- ${LOG_ROOT_LEVEL} 日志级别 --><root level="${LOG_ROOT_LEVEL}"><!-- 标识这个"${STDOUT}"将会添加到这个logger --><appender-ref ref="${STDOUT}"/><!-- FILE_ALL 日志输出添加到 logger --><appender-ref ref="FILE_ALL"/><!-- FILE_ERROR 日志输出添加到 logger --><appender-ref ref="FILE_ERROR"/></root></configuration>

Profile 相关的配置可以参考:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><include resource="org/springframework/boot/logging/logback/base.xml" /><!-- roll by day --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">   <fileNamePattern>logs/springboot-logback-demo.%d{yyyy-MM-dd}.log</fileNamePattern>   <maxHistory>30</maxHistory>  </rollingPolicy>   <encoder>   <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>   </encoder>  </appender> <!-- dev --><logger name="org.springframework.web" level="INFO"/><root level="INFO"><appender-ref ref="FILE" /></root><!-- test or production --><springProfile name="test,prod"><logger name="org.springframework.web" level="INFO"/><logger name="com.pdai.springboot" level="INFO"/><root level="INFO"><appender-ref ref="FILE" /></root></springProfile></configuration>

商品中心的做法:

<!--将日志输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date %5level %6relative --- [%15thread] [%-40logger{40}] [%C:%L] : [%X{traceId:-0}||%X{PtxId:-0}]%msg%n</pattern></encoder>
</appender>

%date 2006-10-20 14:06:49,812

%5level 转换说明符 %5level 表示日志记录事件的级别应该左对齐到五个字符的宽度

%6relative 输出从应用程序启动到创建日志事件所经过的毫秒数。

[%15thread] 输出生成日志事件的线程的名称。

%-40logger{40} 日志记录

[%X{traceId:-0}||%X{PtxId:-0}]

  • 在这里插入图片描述

日志的使用

// case 1
@Slf4j
@Component
public class XxxProcessor {log.info("Xxx.getByIds response={}", JsonUtils.toJson(response));
}// case 2
public class XxxUtils {private static final Logger logger = LoggerFactory.getLogger(XxxUtils.class);logger.error("", e);
}

2.2、在配置前可以参考如下文章

logback的使用和logback.xml详解

2.3、商品中心配置示例

  • application.yml
apollo:bootstrap:enabled: truenamespaces: application,dev.common,dev.drds-common
spring:application:name: item-platform-center
application:name: item-platform-center
dubbo:name: item-platform-centerprovider:filter: dubboMonitor
management:health:elasticsearch:enabled: false
# mybatis-plus配置   多数据源不生效,全部移到BaseSourceConfig和OtherSourceConfig
mybatis-plus:# Mapper 所对应的 XML 文件位置#mapper-locations: classpath*:/mapper/**/*Mapper.xml# 实体类根路径#type-aliases-package: cn.gov.zcy.service.domain.dto# 配置超类,如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象#type-aliases-super-type: cn.gov.zcy.service.domain.BaseEntityconfiguration:# 日志打印,需要集成扩展虚竹插件# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 开启驼峰功能# map-underscore-to-camel-case: true# 二级缓存cache-enabled: false# 关闭一级缓存local-cache-scope: statementglobal-config:# banner 取消banner: false# db 配置db-config:# id 生成策略id-type: auto# 加入自己的typehandler#type-handlers-package: cn.gov.zcy.item.infra.db.type.handlers
elasticjobs: []
  • logback-spring.xml

  • <?xml version="1.0" encoding="UTF-8" ?>
    <configuration><property name="APP_NAME" value="item-platform-center"/><property name="level" value="${logLevel:-info}"/><property name="mapperLevel" value="${mapperLogLevel:-info}"/><property name="tag" value="${tags:-default}"/><property name="rLogIp" value="${rLogIp:-127.0.0.1}"/><property name="rLogPort" value="${rLogPort:-00}"/><logger name="org.springframework.web" level="INFO"/><logger name="org.reflections.Reflections" level="ERROR"/><logger name="org.apache.dubbo" level="ERROR"/><logger name="cn.gov.zcy.dubbo.filter" level="ERROR"/><logger name="cn.gov.zcy.spi.framework.aop.SpiExecutionAspect" level="WARN"/><logger name="cn.gov.zcy.spi.framework.SpiProviderManager" level="WARN"/><logger name="cn.gov.zcy.zmq.core.ons" level="WARN"/><logger name="cn.gov.zcy.zmq.util.DefaultZMQTemplate" level="WARN"/><logger name="MySQL" level="WARN"/><logger name="com.zaxxer.hikari.HikariDataSource" level="WARN"/><logger name="cn.gov.zcy.itemplatform.infra.db.mapper" level="${mapperLevel}"/><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date %5level %6relative --- [%15thread] [%-40logger{40}] [%C:%L] : [%X{traceId:-0}||%X{PtxId:-0}] %X{biz} %msg%n</pattern></encoder></appender><root level="${level}"><appender-ref ref="CONSOLE"/></root><logger name="io.terminus.license" level="OFF"/><logger name="io.terminus.pampas.webc.controller" level="OFF"/>
    </configuration>
    

2.4、白龙马配置示例

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><conversionRule conversionWord="traceId" converterClass="com.huxun.agent.finance.util.TraceIdConverter"/><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--><property name="BASE_DIR" value="${log.dir}"/><property name="LOG_PATH" value="${BASE_DIR}/server/logs"/><!-- 控制台输出 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [%traceId] %logger{5} - %msg%n</pattern></encoder></appender><appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/application.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志文件输出的文件名--><FileNamePattern>${LOG_PATH}/application.log.%d{yyyy-MM-dd}.%i</FileNamePattern><!--日志文件保留天数--><MaxHistory>7</MaxHistory><!--日志文件最大的大小--><maxFileSize>1GB</maxFileSize><totalSizeCap>40GB</totalSizeCap><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [%traceId] %logger{5} - %msg%n</pattern><charset>UTF-8</charset></encoder></appender><!-- 日志输出级别 --><root level="INFO"><appender-ref ref="${log.appender.application}"/></root>
</configuration>

3、参考文档

  • Logback官网

  • Logback官网 文档

  • Logback中 Encoder Pattern

<encoder><pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
</encoder>

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

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

相关文章

264. 丑数 II

题目描述&#xff1a; 主要思路&#xff1a; 利用动态规划的思想&#xff0c;记录2 3 5分别乘到了哪里&#xff0c;然后取最小作为新的数字。 class Solution { public:int nthUglyNumber(int n) {int dp[n1];dp[1]1;int p21,p31,p51;for(int i2;i<n;i){int num2 dp[p2]*…

说一说java中的自定义注解之设计及实现

一、需求背景 比如我们需要对系统的部分接口进行token验证&#xff0c;防止对外的接口裸奔。所以&#xff0c;在调用这类接口前&#xff0c;先校验token的合法性&#xff0c;进而得到登录用户的userId/role/authority/tenantId等信息&#xff1b;再进一步对比当前用户是否有权…

【ESP32】Espressif-IDE及ESP-IDF安装

一、下载Espressif-IDE 2.10.0 with ESP-IDF v5.0.2 1.打开ESP-IDF 编程指南 2.点击快速入门–>安装–>手动安装–>Windows Installer–>Windows Installer Download 3.点击下载Espressif-IDE 2.10.0 with ESP-IDF v5.0.2 二、安装Espressif-IDE 2.10.0 wit…

分布式I/O,IT和OT融合少不了它

长期以来信息技术IT和操作运营技术OT是相互隔离的&#xff0c;随着大数据分析和边缘计算业务的对现场级实时数据的采集需求&#xff0c;IT和OT有了逐渐融合的趋势。IT与OT融合&#xff0c;它赋予工厂的管理者监控运行和过程的能力大为增强&#xff0c;甚至可以预测到可能发生的…

TypeScript -- 类

文章目录 TypeScript -- 类TS -- 类的概念创建一个简单的ts类继承 public / private / protected-- 公共/私有/受保护的public -- 公共private -- 私有的protected -- 受保护的 其他特性readonly -- 只读属性静态属性 -- static修饰ts的getter /setter抽象类abstract TypeScrip…

KnowStreaming系列教程第三篇——调度任务模块

前一篇文章KnowStreaming系列教程第二篇——项目整体架构分析_诸葛子房_的博客-CSDN博客 讲述了KS的整体项目目录&#xff0c;这边文章来讲述下KS在调度模块里面对于指标采集和元数据同步 一、调度模块代码主要在km-task里面 public class TaskClusterAddedListener impleme…

mybatisPlus入门篇

文章目录 初窥门径1.1 初识MybatisPlus1.2 MybatisPlus的特性1.3 MybatisPlus的架构模型 入门案例2.1 准备相关开发环境2.2 搭建springboot工程2.3 创建数据库2.4 引入相关依赖2.5 创建实体类2.6 集成MybatisPlus2.7 单元测试2.8 springboot日志优化 初窥门径 1.1 初识Mybatis…

ChatGPT把python 的import和from讲明白了

文章目录 1、import&#xff1a;import关键字用于导入整个模块&#xff0c;您可以使用该模块中的所有对象。语法如下&#xff1a;2、from ... import ...&#xff1a;from ... import ... 语法用于从模块中导入特定的对象&#xff0c;而不是导入整个模块。您可以通过这种方式选…

基于Web的智慧景区GIS三维可视化运营系统

随着人民生活水平的提高和旅游产品的丰富多样&#xff0c;我国人民对于旅游的需求逐渐从“走过场”转变为“品质体验”。 建设背景 随着互联网、大数据、人工智能等新技术在旅游领域的应用&#xff0c;以数字化、网络化、智能化为特征的智慧旅游成为旅游业高质量发展新动能。…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块11

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Django模板语法和请求

1、在django关于模板文件加载顺序 创建的django项目下会有一个seeetings.py的文件 如果在seeetings.py 中加了 os.path.join(BASE_DIR,‘templates’)&#xff0c;如果是pycharm创建的django项目会加上&#xff0c;就会默认先去根目录找templates目录下的html文件&#xff0c…

安全学习DAY06_抓包技术-HTTPHTTPS

抓包技术-HTTP&HTTPS HTTP&HTTPS抓包针对Web&APP&小程序&PC应用等 本节目的&#xff1a; 掌握几种抓包工具证书安装操作掌握几种HTTP&HTTPS抓包工具的使用学会Web&#xff0c;APP&#xff0c;小程序&#xff0c;PC应用等抓包了解本节课抓包是针对哪些…

EAP设备自动化控制系统在设备数采和控制方面的优势

随着科技的不断进步和工业自动化的发展&#xff0c;EAP&#xff08;Equipment Automation Program&#xff09;设备自动化控制系统在各个行业中扮演着越来越重要的角色。作为连接MES&#xff08;Manufacturing Execution System&#xff09;和设备层的沟通桥梁&#xff0c;EAP系…

Chatgpt Web API 创建对话,免费,不计token数量,模仿网页提交对话

Chatgpt API 是收费的&#xff0c;按token使用量计费 Chatgpt Web API 免费的&#xff0c;只要有账号就可以使用。 curl https://chat.openai.com/backend-api/conversation \-H authority: chat.openai.com \-H accept: text/event-stream \-H accept-language: zh-CN,zh;q…

了解Unity编辑器之组件篇Mesh(三)

Mesh&#xff1a;是一种三维模型的表示形式&#xff0c;它由一系列顶点、三角形&#xff08;或其他多边形&#xff09;和相关属性组成。Mesh用于表示物体的外观和形状&#xff0c;它是可见物体的基本组成部分。通过操作Mesh&#xff0c;开发者可以实现各种视觉效果、物理模拟和…

Swagger如何将接口分组?

如果不分组管理端和用户端是混在一起的&#xff0c;不好查看。 在 docket创建的时候&#xff0c;加一行分组代码。 .groupName("用户端接口") 如果你加完之后&#xff0c;重启&#xff0c;报错。 这应该是你访问的网址仍是旧网址。 http://localhost:8080/doc.html#…

MySQL高可用之MHA集群

目录 一、MHA概述 1.1 什么是 MHA 1.2 MHA 的组成 1.3 MHA 的特点 二、MySQL MHA搭建准备 2.1 实验思路 2.2 实验准备 MHA一主两从高可用集群示意图&#xff1a; 三、搭建 MySQL MHA 3.1 配置主从复制 1、四台服务器都关闭防火墙 2、修改 Master、Slave1、Slave2 节…

汇编语言(第4版)实验7 寻址方式在结构化数据访问中的应用

参考答案&#xff1a; ①经分析&#xff0c;完整程序代码如下。 assume cs:codesg data segmentdb 1975,1976,1977,1978,1979,1980,1981,1982,1983db 1984,1985,1986,1987,1988,1989,1990,1991,1992db 1993,1994,1995dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140…

微服务笔记---Nacos集群搭建

微服务笔记---Nacos集群搭建 Nacos集群搭建1.集群结构图2.搭建集群2.1.初始化数据库2.2.下载nacos2.3.配置Nacos2.4.启动2.5.nginx反向代理2.6.优化 Nacos集群搭建 1.集群结构图 官方给出的Nacos集群图&#xff1a; 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理…

Clion开发STM32之W5500系列(DNS服务封装)

概述 在w5500基础库中进行封装&#xff0c;通过域名的方式获取实际的ip地址用于动态获取ntp的ip地址 DNS封装 头文件 /*******************************************************************************Copyright (c) [scl]。保留所有权利。****************************…