一、二者区别
1.区别
log4j( log for java )(4 同 for)
Apache的一个开源项目,可以灵活地记录日志信息,我们可以通过Log4j的配置文件灵活配置日志的记录格式、记录级别、输出格式,而不需要修改已有的日志记录代码。
slf4j:simple log facade for java 简单日志门面
slf4j不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
可以将log4j看成是一个完整的日志库,而slf4j是一个日志库的规范接口。
2.为什么使用slf4j
2.1 日志与项目解耦
如开发人员A用log4j输出日志而开发人员B用logback输出日志,当需要同时管理这A.B两人的项目时,我们就不得不需要添加两个实现同样功能的jar包并且维护两套日子配置。
而slf4j 是一个适配器,我们通过调用slf4j的日志方法统一打印我们的日志,而可以忽略其他日志的具体方法,这样,当我们的系统换了一个日志源后,不需要更改代码
2.2 节省内存
log4j这些传统的日志系统里面并没有占位符的概念,当我们需要打印信息的时候,我们就不得不创建无用String对象来进行输出信息的拼接。
private void log4jTest(){
String errormsg = "something error happen...";
logger.info("错误信息为:"+errormsg);
}
slf4j可以使用占位符,这样日志输出的时候就可以避免无用字符串对象的创建
private void slf4jTest(){
logger.info("错误信息为:{}","something error happen...");
}
参考链接:https://www.jianshu.com/p/7f787e3797a3
二、配置log4j.properties文件
当未配置log4j.properties文件,或者或者该配置文件在项目目录中的位置不对时,会出现以下警告内容:log4j警告:WARN Please initialize the log4j system properly
1.文件的位置
非maven项目:log4j.properties文件放在src根目录下
maven项目:log4j.properties文件必须放在Resource文件下,如下图所示:
2.定义配置文件
2.1 配置根目录
语法:log4j.rootLogger = [ level ] , appenderName, appenderName, …
示例:log4j.rootLogger=debug,console,logfile
说明:设置输出日志的最低级别为debug(优先级从高到低为:error > warn > info > debug,因此这里设置为debug意味着输出以上所有级别的日志),appenderName(日志输出目的地的名字)是自定义的,这里定义了console和logfile(可以同时指定多个输出目的地)。
2.2 配置日志信息输出目的地Appender
语法:
log4j.appender.appenderName = className
log4j.appender.appenderName.Option1 = value1
…
log4j.appender.appenderName.OptionN = valueN
示例:
# 配置CONSOLE输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 配置logfile输出到文件中 文件大小到达指定尺寸的时候产生新的日志文件
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
说明:Log4j提供的appender有以下几种——
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)2.3 配置日志输出格式
语法:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN示例:
# 配置console设置为自定义布局模式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 配置console日志的输出格式 [frame] 2019-08-22 22:52:12,000 %r耗费毫秒数 %p日志的优先级 %t线程名 %C所属类名通常为全类名 %L代码中的行号 %x线程相关联的NDC %m日志 %n换行
log4j.appender.console.layout.ConversionPattern=[frame] %d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n
# 配置logfile为自定义布局模式
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
说明:Log4j提供的layout有以下几种——
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
三、Java代码中使用
1.添加依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.13<
/version>
</dependency>
2.代码实现
private static final Logger logger = LoggerFactory.getLogger(xxx.class);