log4j+slf4j管理日志项目迁移logback+slf4j

作为一个刚踏入java语言的小学生,最近被安排了一个任务,原有的项目中使用的是log4j日志管理 要转换成logbacak的日志管理。介于之前并未深究log4j和logback日志,所以做起来也很是头疼,不得不查询资料问别人,才勉强完成,所以记录一下从头的步骤,以供别人参考,有不对地方还请大神斧正。

首先提供一下log4j和slf4j以及logback的关系图

第一步:我们项目是log4j+转slf4j管理的,要替换成logback,所以需要删除掉log4j和slf4j-log4j12的所有jar包依赖,项目中用到了maven依赖传递无法直接删除,我在maven的pom文件排除了相关依赖。

<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>

第二步:然后引入相关logback的jar包依赖

<!-- logback日志配置开始 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.7</version>
</dependency>
<!-- logback日志配置结束 -->

第三步:将原有的log4j.xml或者是log4j.properties删除掉,添加进来logback的配置文件logback.xml,格式依照网上的模板只是改变一下相应的输出位置和文件路径以及日志级别等

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- 定义日志文件 输入位置 -->
<property name="log_dir" value="/logs/log" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d %-5p %c{2} - [%m]%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="DEFAULT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${log_dir}/default/default.log.%d{yyyyMMdd}</FileNamePattern>
<!-- 日志生成30天有效 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%d %-5p %c{2} - [%m]%n</pattern>
</encoder>
</appender>

<appender name="BUSINESS-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${log_dir}/business/business.log.%d{yyyyMMdd}</FileNamePattern>
<!-- 日志生成30天有效 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%d %-5p %c{2} - [%m]%n</pattern>
</encoder>
</appender>

<!-- ERROR级别日志 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
<appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只记录ERROR级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志输出位置 -->
<fileNamePattern>${log_dir}/error/error.log.%d{yyyyMMdd}</fileNamePattern>
<!-- 保留 30天数据-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%d %-5p %c{2} - [%m]%n</pattern>
</encoder>
</appender>
<logger name="com.logs.user.log" additivity="false">
<level value="INFO"/>
<appender-ref ref="BUSINESS-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</logger>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="DEFAULT-APPENDER" />
<appender-ref ref="ERROR-APPENDER" />
<appender-ref ref="STDOUT" />
</root>
</configuration>

最后一步:查看代码中引用的依赖和代码是否正确。

我们项目中有的用了slf4j,所以这个不用更改代码,因为logback适配到slf4j的代码完全与log4j一样。

如果是用了log4j管理的,那就要更改代码了。例如我们项目:

import org.log4j.Logger;引用了log4j的依赖

private static final Logger LOGGER = Logger.getLogger(Testcache.class)

更改后的代码:

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

private static final Logger LOGGER = LoggerFactory.getLogger(Testcache.class);

这样就结束了。也可以写一个本地方法来测试一下:

import org.slf4j.LoggerFactory;

import org.slf4j.Logger;

public class Test {

private static Logger logger = (Logger) LoggerFactory.getLogger(Test.class);

public static void main(String[] args) {
logger.debug("debug");
logger.info("info");
logger.error("error");
}
}

执行这个main方法查看日志的输出路径、位置、格式、都正确以后就ok了。

时间: 2024-08-03 05:28:39

log4j+slf4j管理日志项目迁移logback+slf4j的相关文章

JAVAEE——SpringBoot日志篇:日志框架SLF4j、日志配置、日志使用、切换日志框架

Spring Boot 日志篇 1.日志框架(故事引入) 小张:开发一个大型系统: ? 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? ? 2.框架来记录系统的一些运行时信息:日志框架 : zhanglogging.jar: ? 3.高大上的几个功能?异步模式?自动归档?xxxx? zhanglogging-good.jar? ? 4.将以前框架卸下来?换上新的框架,重新修改之前相关的API:zhanglogging-prefect.ja

Log4j,Log4j2,logback,slf4j日志学习

日志学习笔记 Log4j Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程. Log4j有7种不同的log级别,按照等级从低到高依次为:TRACE.DEBUG.INFO.WARN.ERROR.FATAL.OFF.如果配置为OFF级别,表示关闭log. Log4j支持两种格式的配置文件:properties和xml.包含三

Java项目中如何使用log4j和slf4j实现日志打印

什么是log4j? Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 什么是slf4j? SLF4J,即简单日志门面(Simple Logging Facade fo

java日志系列(logback common-loging slf4j)—— log4j

java日志是开发过程中一个绕不过的坎,优雅的日志是开发一个优秀系统必不可少的.java日志组件有很多种,比如经常用到的log4j. 却一直没有对java日志系列进行一个系统的学习与整理.本文将详细整理java日志系列组件. 1.从零开始 日志记录是应用程序运行中必不可少的一部分.具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源. 就像我们在简单代码里加入System.out.println();是一样的.我们需要看到一些输出来让我们看到这个程序正在跑着.当然

用slf4j统一管理日志总结

参考网页:http://www.slf4j.org/ 一.使用slf4j统一管理并配置统一使用log4j日志 使用的jar:(slf4j-api-1.7.5.jar,jcl-over-slf4j-1.7.5.jar,jul-to-slf4j-1.7.5.jar,slf4j-log4j12-1.7.5.jar,log4j-1.2.12.jar) 因为项目中多个框架使用不同的日志或者现在修改以前项目中的日志框架改用另一种日志,所以使用slf4j统一管理日志会比较方便. 1.slf4j是一个接口标准.

从log4j日志无缝迁移至logback

logback对比log4j的有点在此就不赘述了. 由于在项目的原有代码中,大量的日志生成是通过log4j实现的,新的代码希望通过logback的方式生成日志,同时希望将老的代码在不修改的情况下直接将日志生成至logback指定配置中. log4j迁移到logback 此文中介绍了一种迁移方式,但是需要修改代码,此种迁移风险太高. <slf4j官方文档>传统桥接API 一文中介绍了使用log4j-over-slf4j.jar替代log4j.jar,通过桥接的方式将原有的日志生成至logback

log4j+logback+slf4j+commons-logging的关系与调试(转)

背景     由于现在开源框架日益丰富,好多开源框架使用的日志组件不尽相同.存在着在一个项目中,不同的版本,不同的框架共存.导致日志输出异常混乱.虽然也不至于对系统造成致命伤害,但是明显可以看出,架构不够精良,追求极致略有不足.     其中有一些标准通用接口,标准实现,各种桥接器的存在,下面就让笔者树立一下这些框架之间的关系. 从上图中,我们可以看到4部分. 接口:将所有日志实现适配到了一起,用统一的接口调用. 实现:目前主流的日志实现 旧日志到slf4j的适配器:如果使用了slf4j,但是只

log4j+logback+slf4j+commons-logging的关系与调试

背景     由于现在开源框架日益丰富,好多开源框架使用的日志组件不尽相同.存在着在一个项目中,不同的版本,不同的框架共存.导致日志输出异常混乱.虽然也不至于对系统造成致命伤害,但是明显可以看出,架构不够精良,追求极致略有不足.     其中有一些标准通用接口,标准实现,各种桥接器的存在,下面就让笔者树立一下这些框架之间的关系.  从上图中,我们可以看到4部分. 接口:将所有日志实现适配到了一起,用统一的接口调用. 实现:目前主流的日志实现 旧日志到slf4j的适配器:如果使用了slf4j,但是

Java日志使用slf4j 配置log4j后,有日志文件 但日志文件内容为空

SLF4J的全称是Simple Logging Facade for Java,即简单日志门面. SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util.logging, logback和log4j. SLF4J支持{}作为占位符,等价于C语言中的%s,而不必再进行字符串的拼接,效率有显著的提. 1.slf4j使用 引入包 slf4j-api-1.6.2.jar import org.slf4j.Logger; import org.slf4j.Logger