当前位置: 首页 > news >正文

日志迁移到 logback

目标

本次迁移的目标就是用 slf4j+logback 的日志框架来取代目前的 slf4j+log4j

如何迁移

基于 slf4j 的无痛迁移

项目本身是采用的 slf4j+log4j 日志架构,所以迁移到 logback 基本无痛
修改依赖
原本是 slf4j+log4,依赖如下

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

迁移到 slf4j+logback,依赖如下

 <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.28</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency>

修改日志配置
logback 的配置文件为 logback.xml,替换掉 log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="false"><property name="log.path" value="/data/dev/" /><property name="app.name" value="dev-api" /><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date{HH:mm:ss.SSS} [%-5level] [%logger:%L] %mdc{sid:--} - %msg%n</pattern><charset>UTF-8</charset></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter></appender><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/${app.name}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/${app.name}.log.%d{yyyy-MM-dd}</fileNamePattern></rollingPolicy><encoder><!-- %L not support when use async appender --><pattern>%date{HH:mm:ss.SSS} [%-5level] [%logger] %mdc{sid:--} - %msg%n</pattern><charset>UTF-8</charset></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter></appender><appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender"><discardingThreshold>0</discardingThreshold><!-- One and only one appender may be attached to AsyncAppender --><appender-ref ref="FILE" /></appender><!-- note: in production environment set INFO level --><logger name="zy.dev"><level value="INFO" /></logger><root level="ERROR"><appender-ref ref="ASYNC_FILE" /><appender-ref ref="CONSOLE" /></root></configuration>

web 项目初始化日志
增加如下依赖

<dependency><groupId>org.logback-extensions</groupId><artifactId>logback-ext-spring</artifactId><version>0.1.5</version>
</dependency>

在 web.xml 里增加如下监听器

	<context-param><param-name>logbackConfigLocation</param-name><param-value>classpath:config/logback.xml</param-value></context-param><listener><listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class></listener>	

从 log4j 迁移

项目里依赖了其他一些库,可以用 maven 命令 mvn dependency:tree 来查看下,都有哪些库还用到了 log4j,如果这些库也是 slf4j+log4j 的架构那就万事大吉,但也有的库直接用的 log4j,这样就麻烦了
根据 slf4j 的文档,使用 log4j 桥接器 log4j-over-slf4j 来替换 log4j 依赖:即在所有依赖到 log4j 的库上排除 log4j 的依赖,并添加 log4j-over-slf4j 依赖,如下

<dependency><groupId>com.meizu.framework</groupId><artifactId>framework-service</artifactId><version>2.0.0-RC01</version><scope>compile</scope><exclusions><exclusion><artifactId>log4j</artifactId><groupId>log4j</groupId></exclusion>
</dependency><dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>1.7.28</version>
</dependency>

其他日志框架(jul/jcl/log4j2/…)

和 log4j 类似,slf4j 还为其他日志框架提供了 xxx-over-slf4j 桥接器,比如 jcl-over-slf4j,如果用到了对应的日志框架,只需要在依赖里排除该日志框架依赖,并添加对应的桥接器即可
这里要特别提一下 jul(java.util.logging),由于这个日志框架内置在 jdk 内,无法通过置换依赖的方式来桥接,所以需要项目自己调用一下桥接器的方法,在项目初始化时执行如下代码即可

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();

也许是因为这个原因,jul 的桥接器名字是 jul-to-slf4j 而不是 jul-over-sl4fj

http://www.lryc.cn/news/70144.html

相关文章:

  • 开源字节 CRM 系统
  • 七、Spring Cloud Alibaba-Sentinel
  • 机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化
  • 【MySQL】MySQL基础知识详解
  • RabbitMQ日常使用小结
  • ​​​​​​​博物馆文物馆藏环境空气质量无线监控系统方案
  • 测试理论----Bug的严重程度(Severity)和优先级(Priority)的分类
  • 斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名
  • 00后卷王,把我们这些老油条卷的辞职信都写好了........
  • JavaEE(系列12) -- 常见锁策略
  • 前端nginx接口跨域
  • 【国产虚拟仪器】基于 ZYNQ 的电能质量系统高速数据采集系统设计
  • Java前缀和算法
  • pico 的两个双核相关函数的延时问题
  • Doxygen源码分析: QCString类依赖的qstr系列C函数浅析
  • 华为OD机试之一种字符串压缩表示的解压(Java源码)
  • Microsoft Project Online部署方案
  • 飞浆AI studio人工智能课程学习(3)-在具体场景下优化Prompt
  • 企业工程行业管理系统源码-专业的工程管理软件-提供一站式服务
  • Ehcache 整合Spring 使用页面、对象缓存
  • Spring Cloud中的服务路由与负载均衡
  • rails routes的使用
  • Linux基础内容(21)—— 进程消息队列和信号量
  • STM32实现基于RS485的简单的Modbus协议
  • springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】
  • zabbix监控之javasnmp自定义监控
  • Inertial Explorer处理pospac数据总结
  • tps和qps的区别是什么?怎么理解
  • 【Java系列】深入解析枚举类型
  • 网络原理(五):IP 协议