一. JDK 1.4 的Logging
易用性、功能和扩展性很差,可以放弃
日志级别All、FINEST、FINER、FINE、CONFIG、INFO、WARNING、SEVERE、OFF等,级别依次升高。
设置为高级别的情况下,低级别不会输出,比如设置为INFO,则INFO之前的低级别信息将不会输出。
默认有个控制台输出,用于输出INFO级别以上的信息。
二. commons-logging控件
commons-logging控件的作用是统一JDK Logging与Log4j的API。对于不确定日志方式的系统通常使用commons-logging控件,如spring,hibernate,strus等
如果配置Log4j,commons-logging会把输出原封不动的交给log4j。如果没有log4j,commons-loggin会将相应的输出转化为JDK Loggin输出。
也可以显式的配置。
三.SLF4J
简单日记门面(Facade)SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。需要你加入slf4j-jdk14.jar, slf4j-log4j12.jar或logback.jar,将日志调用转发到实际的日志框架。在classpath中有哪个jar包,slf4j就会选择哪个实现。如果错误的同时存在多个jar包,用哪个那就看运气了。
使用起来非常简单只要引入如下依赖:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <!-- log4j 实际调用slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> </dependency> <!-- common-logging 实际调用slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency> <!-- java.util.logging 实际调用slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> </dependency>
有些第三方的工具包,已经直接使用了log4j, common-logging 或 java.util.logging。如果我们最后决定使用log4j做最终输出,则需要放一个jcl-over-slf4j.jar和 jul-to-slf4j.jar来假装成common-logging和java.util.logging的api,将日志请求转发给slf4j,slf4j再转发给log4j,此时还需要保证,classpath里没有正牌的common-logging.jar。 而原本直接使用log4j的就不需要做任何改动。
slf4j的api不需要写isWarnEnable(),是因为原来common-logging的API,早早就进行了一次字符串拼接,如果不需要打印就白白浪费了时间。而slf4j的代码如下,只在真正需要打印的时候才进行拼接。
logger.info("Hello {}", name);
注意如果参数本身的获取就需要消耗大量的时间,就依然需要用isXXEnable()把代码段圈起来。
if(logger.isInfoEnabled()){ logger.info("hello " + userDao.get(id).getName); }
四. Log4j
1. 日志级别:ALL、TRACE(跟踪)、DEBUG(调试)、INFO(信息)、WARNING(警告)、ERROR(错误)、FITAL(致命)、OFF 级别依次升高,级别高的会屏蔽级别低的信息。
2. 日志配置
(1)一般配置信息都写在配置文件log4j.properties。启动时会加载classpath下log4j.properties初始化Log4j的输出级别、输出位置、输出信息、输出格式等内容,如果文件不存在,Log4j会打印如下信息:
log4j:WARN No appenders could be found for logger (com.shaogq.log.Log4jTest).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
(2)如果不使用log4j.properties,可用PropertyConfigurator指定配置文件路径
PropertyConfigurator.configure("conf/common/log4j.properties");
(3)也可以使用Log4j.xml来配置(没见过这么用的)
(4)Spring中使用log4j
1)在web.xml中添加上下文初始化参数
<context-param> <param-name>webAppRootKey</param-name> <param-value>path</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param>
2)添加日志监听器
<listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
3)添加log4j.properties文件
获取日志文件输入路径${path}/WEB-INF
3.Log4j的执行效率
(1)Log4j内部做了大量的优化、缓存工作,使输出时对服务器的压力、消耗的时间、资源等都达到最小。
(2)Log4j只是在初始化时打开文件,并保持对文件的写控制,直到系统结束才关闭文件,减少I/O次数。
(3)当输出级别低于设定级别时,比如输出级别为Error而使用debug方法时,会直接返回。
4.优化日志代码
即使当前方法级别低于输出级别,仍会对当前方法进行调用并判断。
方法统一为 isXXXEnable() 或 isEnableFor(Priority.XXX)
if(log.isDebugEnabled()){ log.debug("..."); }
或
if(log.isEnabledFor(org.apache.log4j.Priority.WARN)){ log.warn("..."); }
5.日志记录器Logger
public static Logger log = Logger.getLogger(Log4jTtest.class);
(1)Logger.getLogger()方法的参数为Logger的名字
(2)Logger为单例模式,即相同名字的Logger只会有一个实例,如果构建同名Logger,Log4j会返回之前的Logger实例。
(3)命名规则一般以类名为Logger的名称。大小写敏感,用点分开,具有继承关系,log4j.properties通过名称来配置Logger的属性
(4)Log4j中有一个根记录器rootLogger,是所有Logger的父记录器
6.Logger的配置
在log4j.properties配置中,log4j.logger后面配置的是Logger,log4j.appender后面配置的是Appender
e.g.配置该Logger为DEBUG级别,输出地为A1
log4j.logger.com.logtest.Log4jTest=DEBUG,A1
(1)如果某个Logger没有配置,则使用它的父亲配置,直到找到为止,一般情况下,只需配置根记录器rootLogger即可,所有的Logger都会沿用rootLogger的配置。
(2)Logger支持多个Appender,用逗号将多个Appender名字隔开即可。
7.rootLogger的配置
(1)根记录器rootLogger直接用log4j.rootLogger配置,rootLogger是所有记录器的父亲,任何记录器都继承rootLogger的配置。
e.g.配置rootLogger为ERROR级别,输出地为A1
log4j.rootLogger=ERROR,A1
(2)如果要对某个Logger进行特殊输出,只需要再配置一下该Logger,覆盖父亲的配置即可,覆盖时,可以只配置级别、输出地,也可两者都配置。
e.g.配置该logger为DEBUG级别,输出地继承rootLogger配置
log4j.logger.com.logtest.Log4jConfigTest=DEBUG
8.类别category配置
(1)Logger还有类别(Category)的概念,通过设置类别来配置类别下得所有Logger;
(2)category类似于java中的Package,效果跟Logger的名字等价。
e.g.作用于类别com.logtest下得所有Logger
log4j.category.com.logtest=DEBUG
9.输出地Appender
Appender表示日志输出到什么地方,常用的输出地有控制台、文件、数据库、远程服务器等。
Log4j中内置了常用的输出地,一般情况下配置一下即可使用。所有的Appender都实现自org.apache.log4j.Appender接口,在Log4j.properties中,Appender都使用log4j.appender.*配置。
(1)输出到控制台
控制台输出实现类为org.apache.log4j.ConsoleAppender。
e.g.输出到控制台配置
#根记录器,ERROR,输出到A1 log4j.rootLogger=ERROR,A! #设置com.logtest包下的记录器为DEBUG级别 log4j.category.com.logtest=DEBUG #控制台输出 log4j.appender.A1=org.apache.log4j.ConsoleAppender #DEBUG以上级别输出 #log4j.appender.A1.Threshold=DEBUG #编码方式 #log4j.appender.A1.Encoding=UTF-8 #是否立即输出 #log4j.appender.A1.ImmediateFlush=true #使用System.err输出 #log4j.appender.A1.Target=System.err #输出格式,表达式配置 log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%C]-[%p] %m%n
1)控制台输出需要配置layout属性,最常用的是正则表达式格式。
2)控制台输出的信息一般是TRACE、DEBUG或INFO级的,只在开发、调试时才启用。
3)被注释掉的属性都是可选属性,Encoding设置编码方式,ImmediateFlush设置是否缓存,Target设置输出到System.out还是System.err。
4)Threshold用来设置该Appender的级别,只对本Appender生效。所有的Appender都可以通过设置Threshold来设置本Appender的启用级别。
(2)输出到文件
文件输出(FileAppender)把日志输出到指定文件。文件输出的实现类org.apache.log4j.FileAppender,配置时需要用File指定文件名称。可以使用相对路径,也可以使用绝对路径。
e.g.输出到文件
log4j.rootLogger=ERROR, f,stdout log4j.logger.com.logtest.Log4jConfigTest=debug #输出到文件 log4j.appender.f=org.apache.log4j.FileAppender #文件位置 log4j.appender.f.File=../log/tomcat.log #追加文件内容 log4j.appender.f.Append=true #输出格式的表达式 log4j.appender.f.layout=org.apache.log4j.PatternLayout log4j.appender.f.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%C]-[%p] %m%n
1)可选参数Append配置是否在原文件内容上追加日志。如果为false,Logger初始化时会清掉文件内容,也就是所每次重启程序,原来的日志会丢失。如果为true,日志文件文件会越来越大。
2)web下文件位置说明,tomcat.log输出到tomcat/bin目录下;/tomcat.log输出到根目录下;../tomcat.log输出到tomcat目录下;推荐输出地址../logs/XXX.log
(3)输出到按大小滚动文件
按大小滚动文件输出(RollingFileAppender)把日志输出到指定的文件,文件达到指定的大小时,会自动更名。
按尺寸滚动文件输出类为org.apache.log4j.RollingFileAppender,需配置文件名称、文件的最大尺寸。
e.g.输出到按大小滚动文件
#DEBUG级别,两个输出,文件与滚动文件 log4j.logger.com.logtest.Log4jConfigTest=DEBUG,f,rolling_file #输出到文件 log4j.appender.f=org.apache.log4j.FileAppender log4j.appender.f.File=../log/tomcat.log log4j.appender.f.Append=true log4j.appender.f.layout=org.apache.log4j.PatternLayout log4j.appender.f.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%C]-[%p] %m%n #输出到滚动文件 log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender #DEBUG以上级别输出 log4j.appender.rolling_file.Threshold=DEBUG #滚动文件位置 log4j.appender.rolling_file.File=../log/rolling.log #追加方式 log4j.appender.rolling_file.Append=true #文件达到10K就自动更名 log4j.appender.rolling_file.MaxBackupIndex=100 log4j.appender.f.layout=org.apache.log4j.PatternLayout log4j.appender.f.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%C]-[%p] %m%n
配置的滚动文件名为rolling.log,文件最大为10K,当rolling.log达到10K时,就会自动更名为rolling.log1、rolling.log2 ......直到rolling.log100。
(4)输出到按日期滚动文件
输出日期滚动文件输出类为org.apache.log4j.DailyRollingFileAppender
e.g.输出到按日期滚动文件
log4j.logger.com.logtest.Log4jConfigTest=DEBUG,daily_rolling #滚动文件 log4j.appender.daily_rolling=org.apache.log4j.DailyRollingFileAppender #滚动文件位置 log4j.appender.daily_rolling.File=../log/daily_rolling.log #滚动日期格式 log4j.appender.daily_rolling.DatePattern=.yyyy-MM-dd #输出格式表达式 log4j.appender.f.layout=org.apache.log4j.PatternLayout log4j.appender.f.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%C]-[%p] %m%n
日志文件名为daily_rolling.log,日期格式为yyyy-MM-dd,进入新的一天后文件会被自动更名,格式为daily_rolling.log.2012-6-18
(5)输出到JDBC数据库
数据库输出(JDBCAppender)通过JDBC连接把日志输出到数据库中,输出类为org.apache.log4j.JDBCAppender
配置:JDBC驱动、连接字符串、用户名、密码、SQL语句;
注意:JDBCAppender需要相应的数据库驱动。先创建数据库,并建立数据库日志表。
e.g.输出到MySql数据库
#init.sql CREATE DATABASE log4j CHARACTER SET utf8; USE log4j; CREATE TABLE tb_log{ id INT AUTO_INCREMENT, date VARCHAR(255), priority VARCHAR(255), message TEXT, classname VARCHAR(255), PRIMARY KEY(id) };
#log4j.properties
log4j.logger.com.logtest.Log4jConfigTest=DEBUG,DATABASE #输出到数据库 log4j.appender.DATABASE=org.apache.log4j.JDBCAppender #ERROR以上输出 log4j.appender.DATABASE.Threshold=ERROR #数据库连接URL log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/log4j #数据库驱动 log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver #用户名 log4j.appender.DATABASE.user=root #密码 log4j.appender.DATABASE.password=12345678 #执行SQL的语句,列内容为表达式 log4j.appender.DATABASE.sql=INSERT INTO tb_log(date , priority, message, classname) VALUES('%d', '%p', '%m', '%c') #Oracle的例子 #log4j.appender.JDBC.sql=INSERT INTO oracle_log4j (id, type, username, user_id, create_date, thread, priority , category, message) values(rz_log4j_seq.nextval ,'{m}' ,'{m}',{m},to_date('%d{yyyy-MM-dd HH:mm:ss}' ,'yyyy-MM-dd hh24:mi:ss'), '%t', '%-5p', '%c', '{m}') && %m
(6)输出到SOCKET套接字
套接字输出(SocketAppender)将日志通过网络TCP协议发送给远程服务器,SocketAppender会与远程服务器建立Socket连接,
将日志信息封装为LoggingEvent对象,串行化(Serialize)后发送给对方,输出类为org.apache.log4j.net.SocketAppender
(7)输出到SMTP邮件
邮件输出(SMTPAppender)将日志以邮件的形式发送出去,输出类为org.apache.log4j.net.SMTPAppender
10.日志格式化器Layout
(1)PatternLayout布局
Log4j的常用参数
参数 | 描述 | 示例 |
c | 输出Logger所在的类别,允许%c{数字}输出部分名称(从右往左数) |
%c输出a.b.clazz %c{1}输出clazz %c{2}输出b.clazz %c{3}输出a.b.clazz |
C | 输出Logger所在类的名称,有时候Logger的名称不同于类名,允许%C{数字} |
%C输出a.b.clazz %C{1}输出clazz %C{2}输出b.clazz %C{3}输出a.b.clazz |
d | 输出日期,允许使用 %d{yyyy-MM-dd HH-mm-ss} 格式化日期,支持log4j自己的日期格式,ABSOLUTE、DATE、ISO8601等 |
%d 输出2012-6-18 16:03:49,353 %d{yyyy-MM-dd} 输出2012-6-18 %d{ABSOLUTE} 输出16:03:49,353 %d{DATE} 输出 18 六月 2012 16:03:49,353 |
F | 输出所在类文件名称 | %F 输出 Log4jConfigTest.java |
l | 输出语句所在行数,包括 类名、方法名、文件名、行数 | %l 输出 com.logtest.Log4jConfigTest(Log4jConfigTest.java:34) |
L | 只输出语句所在行数 | %L 输出 34 |
m | 输出日志 | 输出日志,即log.info("")、log.debug("")参数 |
M | 输出方法名 | %M 输出Test |
n | 换行,win下\r\n,linux下\n | 换行 |
p | 输出日志级别(priority) | DEBUG、INFO、ERROR、FITAL等 |
r | 输出程序启动到输出时间间隔 | %r 输出3000 |
t | 输出当前线程的名称 | %t 输出main、Thread-0、Thread-1等 |
% | %%用来输出百分号 |
Log4j允许设置输出内容的长度等,不够长会用空格补齐,
设置方法是在%与参数符号间添加数字,负数表示左对齐,数字表示最小宽度,不足时用空格补齐。
可以设置最大宽度,如果超出则截取,方法是用小数点+数字设置,例如 %.30p
长度调整
格式 | 对齐方式 | 最小宽度 | 最大宽度 | 描述 | 示例 |
[%10p] | 右对齐 | 10 | 正数右对齐,最小宽度 | [ ERROR] | |
[%-10p] | 左对齐 | 10 | 负数左对齐,最小宽度 | [ERROR ] | |
[%.4p] | 4 | 最大宽度 | [RROR] | ||
[%10.20p] | 右对齐 | 10 | 20 | 正数右对齐,最大最小宽度 | [ ERROR] |
[%-10.20p] | 左对齐 | 10 | 20 | 正数右对齐,最大最小宽度 | [ ERROR] |
(2)HTMLLayout布局
HTMLLayout将日志格式转化为HTML代码,输出到文件后,可以直接用浏览器浏览
使用HTMLLayout时,文件后缀一般为.html
log4j.rootLogger=DEBUG,f log4j.appender.f=org.apache.log4j.FileAppender log4j.appender.f.File=../log/log.html log4j.appender.f.Append=false #输出格式的表达式 log4j.appender.f.layout=org.apache.log4j.HTMLLayout
(3)XMLLayout布局
XMLLayout把日志内容格式化为XML文件
log4j.rootLogger=DEBUG,f log4j.appender.f=org.apache.log4j.FileAppender log4j.appender.f.File=../log/log.log log4j.appender.f.Append=false #输出格式的表达式 log4j.appender.f.layout=org.apache.log4j.XMLLayout
注意:XMLLayout生成的并不是完整的XML文件,而只是XML文件中的一部分,因此无法直接打开、解析。这个片段包括系列的<log4j:event>标签
五.LOGBack
Logback是由log4j创始人设计的又一个开源日记组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。
一份可滚动结果集的配置文件
logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <jmxConfigurator /> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <Encoding>UTF-8</Encoding> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>../logs/projectname.%d{yyyy-MM-dd}[%i].log</FileNamePattern> <MaxHistory>10</MaxHistory> <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <MaxFileSize>5MB</MaxFileSize> </TimeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </layout> </appender> <!--log4jdbc --> <logger name="jdbc.sqltiming" level="INFO"/> <logger name="com.projectname" level="INFO" /> <root level="WARN"> <appender-ref ref="console" /> <appender-ref ref="rollingFile" /> </root> </configuration>
六.关系
Slf4j和Commons-Logging都是简单日记门面(Facade),但SLF4J已经成为Logger的事实标准API。
java.util.logging, log4j ,logback,log4j2 一个比一个强。其中logback是log4j作者觉得log4j已经太烂不想再改了,重新写的一个实现。Log4j本来一统江湖好好的,后来被人说方法上太多同步修饰符,在高并发下性能太烂。Netflix的blitz4j就重新实现了一次log4j项目,去掉了大量的同步修饰符,不过其负责人自己说,新项目还是建议直接用logback,所以SpringSide就用了logback。
不过,后来apache社区又说,slf4j和logback都是log4j作者开的qos.ch公司的产品,日志是件很重要的事情,不应该操控在一家公司手里。所以又以纯社区驱动搞了log4j2,参考了logback,也做了一些自己的改动。不过现在还是漫长的beta版。
相关推荐
logback-slf4j是Java领域中一种常用的日志记录解决方案,它通过结合slf4j(Simple Logging Facade for Java)来提供了异步日志输出的功能,能够将日志输出到不同的文件中。下面是logback-slf4j日志配置文件的详细...
SLF4J的主要目的是为各种日志框架,如log4j、java.util.logging、Logback等,提供一个简单且一致的接口,使得开发者能够在不修改代码的情况下切换日志系统。 标题中的"slf4j-api-1.7.7"指的是SLF4J API的1.7.7版本...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个API,允许开发者选择自己偏好的日志框架,如Log4j、Java Util Logging、Logback等。SLF4J的主要目的是为了简化日志处理,使得在不同...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供一个简单的接口,使得开发者能够在不改变代码的情况下更换日志实现。这个接口使得应用程序的代码与...
SLF4J的主要目的是为各种日志框架,如log4j、logback等,提供一个统一的接口,使得应用程序可以独立于具体的日志实现进行开发,提高了代码的可移植性和灵活性。 标题中的"slf4j-log4j12-1.7.12.jar"是SLF4J的一个...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个API,使得开发者能够在运行时绑定不同的日志实现。在本案例中,我们讨论的是SLF4J API的1.6.1版本,以及两个与之配合使用的日志实现...
本文将深入探讨“日志4j(Log4j)、SLF4J(Simple Logging Facade for Java)和logback 1.3.0”这三者之间的关系以及它们在Java应用中的作用。 首先,Log4j是Apache软件基金会开发的一个流行的日志记录框架,它允许...
SLF4J是一个抽象层,为各种日志框架提供了统一的API,如Logback、Log4j等。它的主要优点在于可以让你在不修改代码的情况下更换底层的日志框架,只需改变类路径上的绑定即可。SLF4J提供了丰富的日志级别,如DEBUG、...
SLF4J(Simple Logging Facade for Java)是Java中一个重要的日志抽象层,它为各种日志框架,如Log4j、java.util.logging、Logback等提供了一个统一的接口。通过SLF4J,开发者可以在不修改代码的情况下更换底层的...
Logback分为三个组件:ch.qos.logback.core(核心库),ch.qos.logback.classic(提供Log4j兼容API),以及ch.qos.logback-access(处理Servlet容器的日志访问)。Logback还包括了强大的自定义布局和过滤器功能,...
`log4j`、`SLF4J`(Simple Logging Facade for Java)以及`SLF4J-Log4j`适配器是Java日志框架中的关键组件,它们在本篇中将被详细探讨。 首先,我们来了解`log4j-1.2.16.jar`。`log4j`是由Apache软件基金会开发的一...
commons-logging-1.2.jar、log4j-1.2.17.jar、logback-classic-1.1.2.jar、logback-core-1.1.2.jar、slf4j-api-1.7.12.jar、slf4j-jcl-1.7.12.jar、slf4j-simple-1.7.12.jar
SLF4J(Simple Logging Facade for Java)是Java中一个重要的日志接口框架,它为各种日志实现提供了一个抽象层,使得开发者能够在运行时动态地选择具体使用的日志实现,例如Log4j、Java Util Logging (JUL)、Logback...
SLF4J (Simple Logging Facade for Java) 是一个用于日志记录的接口层,它为各种日志框架,如Logback、Log4j、Java Util Logging等提供了一个统一的API。SLF4J的主要目的是使得应用程序可以在部署时选择任何支持的...
SLF4J(Simple Logging Facade for Java)是一个用于各种日志框架的简单抽象,例如java.util.logging、Logback和Apache Log4j。它为所有这些日志库提供了一个统一的API,允许最终用户在部署时插入所需的日志库。SLF4...
SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中常见的日志处理框架。SLF4J提供了一个抽象层,允许开发者在运行时选择合适的日志实现,比如Log4j、Logback等。这个"slf4j-log4j12.jar"文件就是SLF4J与...
SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中常见的日志处理框架。SLF4J提供了一个抽象层,允许开发者在运行时插入所需的日志实现,比如Log4j、Java内置的日志系统等。SLF4J-log4j12桥接库则是连接...
在实际应用中,开发者通常会将`slf4j-api.jar`与具体的日志实现库(如log4j.jar或logback-classic.jar)一起使用,而不是使用NOP实现。不过,在某些场景下,如快速搭建测试环境、打包发布时不希望包含日志实现,或者...
SLF4J(Simple Logging Facade for Java)与Log4j12的结合是Java日志处理中的一个常见组合。SLF4J提供了一个抽象层,允许开发人员在不修改代码的情况下切换不同的日志框架,如Log4j、Logback等。而Log4j12则是Apache...
2. **选择绑定**: 开发者可以通过在类路径中包含特定的日志实现JAR来选择使用哪个日志系统,例如logback-classic.jar会选择logback作为SLF4J的实现。 总之,SLF4J提供了一种灵活的日志抽象层,允许开发者在不影响...