- 浏览: 331375 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (212)
- spring (21)
- design pattern(java) (12)
- linux-shell (28)
- java-thread (20)
- java-collection (6)
- java-reflect (9)
- mysql (11)
- java-io (7)
- java-util&lang&io (3)
- algorithm (3)
- interview (2)
- tools-eclipse (2)
- tools-maven (1)
- web-script (1)
- java组建 (13)
- 博客收藏 (1)
- 架构设计与实践 (10)
- active-mq (6)
- java-jvm&性能&原理 (27)
- tomcat (2)
- flume (1)
- serialization (2)
- git (1)
- cache&redis (8)
- guava (1)
- zookeeper (3)
- socket&tcp&udp&http (6)
- test (1)
最新评论
-
bbls:
有用有用有用
java-jvm-jstack-(监视器和锁的概念) -
王新春:
小侠有点帅哦 写道此流怎么关闭新春这个实现 可以不关闭的,哈哈 ...
源码剖析之java.io.ByteArrayOutputStream -
小侠有点帅哦:
此流怎么关闭新春
源码剖析之java.io.ByteArrayOutputStream -
cumt168:
写的很好为什么初始化参数,年轻代-Xmn10M def new ...
jvm之内存申请过程分析 -
ronin47:
应该是跟共享域名思路差不多,根据cookie的key作判断
跨域:一种通过服务端解决跨域的实现
在几乎所有的业务系统中,日志是必不可少的组建,尤其是复杂的业务系统。
java业界有多种优秀log工具可供选择,log4j 和 logback 更是其中翘楚,本文要讲解的是log4j,即使logback更优秀,但是很多老的生产环境的系统,依然在使用log4j~
日志的目标:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
注意:即使有再好的log工具,也未必能真正的利用好,这更要看使用者对业务场景的熟悉,以记录有效的数据,曾看到在一些项目中,log随意打印了很多无效的数据,或者数据打印不是业务分析的全部数据,这样log打印几乎是没用。
简单说明:通常我们都提供一个名为 log4j.properties的文件,在第一次调用到Log4J时,Log4J会在类路径(../web-inf/class/当然也可以放到其它任何目录,只要该目录被包含到类路径中即可)中定位这个文件,并读入这个文件完成的配置。这个配置文件告诉Log4J以什么样的格式、把什么样的信息、输出到什么地方。
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
Log4J的几个基本核心概念
1、LEVEL日志输出级别:
FATAL 0
ERROR 3
WARN 4
INFO 6
DEBUG 7
2、Appender
Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
org.apache.log4j.FileAppender(文件)
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小时
6)'.'yyyy-MM-dd-HH-mm: 每分钟
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3、Layout
日志输出格式,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
4、ConversionPattern
-X号: X信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
eg:log4j.appender.infoFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n
5、配置根rootLogger
其语法为:log4j.rootLogger = [ level ] , appenderName, appenderName, …
eg: log4j.rootLogger = INFO,debugFile,infoFile,errorFile,stdout
注意:INFO 此处的配置 为INFO ,即使其他 appender的Threshold的级别为DEBUG,也不会输出。
6、Threshold 自定义输出的日志级别
此处配置的输出级别,一定要高于 根Logger 的配置的日志级别,否则无意义。当让除非你使用第七条规定,重新设定了log的输出级别
7、设置 特定包的级别和目的地
设置com.qunar.log4j包的级别为ERROR级别
log4j.logger.com.qunar.log4j=ERROR
特别注意:此处包级别的设置会覆盖rootLogger的级别设置
设置com.qunar.logback包的输出 到logback Appender
log4j.logger.com.qunar.logback=DEBUG,logback
8、MDC 和 NDC
NDC和MDC是log4j用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。
NDC采用了一个类似栈的机制来push存储上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC,储存客户端地址等等信息。相关的信息使用NDC.push(message);
在log的时候将信息输出。在相应的PatternLayout中使用”%x”来输出存储的上下文信息
MDC:
MDC内部使用了类似map的机制来存储信息,相对应的方法,MDC.put(key,value);在配置PatternLayout的时候使用:%X{key}来输出对应的value
输出:
07-20 12:00:19.270 ERROR [LogDependencyApi.java:17][www.qunar.com]ndc info 1 ndc info 3 hello xinchun.wang login in~
案例:
8、maven 配置:
java业界有多种优秀log工具可供选择,log4j 和 logback 更是其中翘楚,本文要讲解的是log4j,即使logback更优秀,但是很多老的生产环境的系统,依然在使用log4j~
日志的目标:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
注意:即使有再好的log工具,也未必能真正的利用好,这更要看使用者对业务场景的熟悉,以记录有效的数据,曾看到在一些项目中,log随意打印了很多无效的数据,或者数据打印不是业务分析的全部数据,这样log打印几乎是没用。
简单说明:通常我们都提供一个名为 log4j.properties的文件,在第一次调用到Log4J时,Log4J会在类路径(../web-inf/class/当然也可以放到其它任何目录,只要该目录被包含到类路径中即可)中定位这个文件,并读入这个文件完成的配置。这个配置文件告诉Log4J以什么样的格式、把什么样的信息、输出到什么地方。
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
Log4J的几个基本核心概念
1、LEVEL日志输出级别:
FATAL 0
ERROR 3
WARN 4
INFO 6
DEBUG 7
2、Appender
Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
org.apache.log4j.FileAppender(文件)
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小时
6)'.'yyyy-MM-dd-HH-mm: 每分钟
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3、Layout
日志输出格式,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
4、ConversionPattern
-X号: X信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
eg:log4j.appender.infoFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n
5、配置根rootLogger
其语法为:log4j.rootLogger = [ level ] , appenderName, appenderName, …
eg: log4j.rootLogger = INFO,debugFile,infoFile,errorFile,stdout
注意:INFO 此处的配置 为INFO ,即使其他 appender的Threshold的级别为DEBUG,也不会输出。
6、Threshold 自定义输出的日志级别
此处配置的输出级别,一定要高于 根Logger 的配置的日志级别,否则无意义。当让除非你使用第七条规定,重新设定了log的输出级别
7、设置 特定包的级别和目的地
设置com.qunar.log4j包的级别为ERROR级别
log4j.logger.com.qunar.log4j=ERROR
特别注意:此处包级别的设置会覆盖rootLogger的级别设置
设置com.qunar.logback包的输出 到logback Appender
log4j.logger.com.qunar.logback=DEBUG,logback
8、MDC 和 NDC
NDC和MDC是log4j用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。
NDC采用了一个类似栈的机制来push存储上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC,储存客户端地址等等信息。相关的信息使用NDC.push(message);
在log的时候将信息输出。在相应的PatternLayout中使用”%x”来输出存储的上下文信息
MDC:
MDC内部使用了类似map的机制来存储信息,相对应的方法,MDC.put(key,value);在配置PatternLayout的时候使用:%X{key}来输出对应的value
MDC.put("domain", "www.qunar.com"); LogDependencyApi.printLog("xinchun.wang login in~");
log4j.appender.logApi.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L][%X{domain}]%x %m%n
输出:
07-20 12:00:19.270 ERROR [LogDependencyApi.java:17][www.qunar.com]ndc info 1 ndc info 3 hello xinchun.wang login in~
案例:
log4j.rootLogger = INFO,debugFile,infoFile,errorFile,stdout #注意:INFO 此处的配置 为INFO ,即使其他 appender的Threshold的级别为DEBUG,也不会输出。 #rootLogger 拥有第一优先级 #此处包级别的设置会覆盖rootLogger的级别设置 #log4j.logger.com.qunar.log4j=DEBUG #此处的配置,一般适用于引用的jar包,或者特定功能的逻辑,输出到某一个文件内 #log4j.logger.com.qunar.logback=DEBUG,logback log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c:%L %p - %m%n log4j.appender.debugFile = org.apache.log4j.DailyRollingFileAppender log4j.appender.debugFile.Threshold= DEBUG log4j.appender.debugFile.Append = true log4j.appender.debugFile.File =${catalina.base}/logs/debugFile.log log4j.appender.debugFile.encoding = UTF-8 log4j.appender.debugFile.layout = org.apache.log4j.PatternLayout log4j.appender.debugFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n log4j.appender.infoFile = org.apache.log4j.DailyRollingFileAppender log4j.appender.infoFile.Threshold= INFO log4j.appender.infoFile.Append = true log4j.appender.infoFile.File =${catalina.base}/logs/infoFile.log log4j.appender.infoFile.encoding = UTF-8 log4j.appender.infoFile.layout = org.apache.log4j.PatternLayout log4j.appender.infoFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n log4j.appender.errorFile = org.apache.log4j.DailyRollingFileAppender log4j.appender.errorFile.Threshold= ERROR log4j.appender.errorFile.Append = true log4j.appender.errorFile.File =${catalina.base}/logs/errorFile.log log4j.appender.errorFile.encoding = UTF-8 log4j.appender.errorFile.layout = org.apache.log4j.PatternLayout log4j.appender.errorFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n log4j.appender.logback = org.apache.log4j.DailyRollingFileAppender log4j.appender.logback.Threshold= DEBUG log4j.appender.logback.Append = true log4j.appender.logback.File =${catalina.base}/logs/logback.log log4j.appender.logback.encoding = UTF-8 log4j.appender.logback.layout = org.apache.log4j.PatternLayout log4j.appender.logback.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n
8、maven 配置:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.4</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
发表评论
-
guava-cache-本地缓存(收藏)
2017-05-22 20:00 2794范例 -
jackson-filter特性
2016-07-12 17:20 3907jackson提供动态序列化的输出json static ... -
json-jackson多子类继承的反序列化
2015-03-24 20:31 10951相关文章: http://wangxinchun.iteye. ... -
HttpAsyncClient
2014-12-16 18:31 3367参考: http://wangxinchun.iteye.co ... -
Httpclient再续
2014-11-16 12:55 2356参考: http://wangxinchun.iteye.co ... -
hibernate-validator
2014-11-13 18:08 2640在web工程中,对于用户 ... -
HttpClient
2014-10-13 18:16 2009参考: http://wangxinchun.iteye.co ... -
slf4j-logback-filter-MDC进阶
2014-08-13 11:44 6324Have lots of ideas and throw ... -
slf4j-logback-Appender进阶
2014-08-08 11:17 7134logback 进阶 基础篇请参考http://wangxin ... -
slf4j-logback
2014-07-22 00:33 3057上一篇文章讲了log4j的 ... -
java-json
2014-04-26 17:45 2277相关文章: http://dreamhead.blogbus. ... -
基于注解的参数校验框架
2013-12-07 21:54 3562近期由于工作的需要,写了一个简易的参数校验框架,虽然市场上有c ...
相关推荐
赠送jar包:slf4j-log4j12-1.7.25.jar; 赠送原API文档:slf4j-log4j12-1.7.25-javadoc.jar; 赠送源代码:slf4j-log4j12-1.7.25-sources.jar; 赠送Maven依赖信息文件:slf4j-log4j12-1.7.25.pom; 包含翻译后的API...
赠送jar包:slf4j-log4j12-1.6.1.jar; 赠送原API文档:slf4j-log4j12-1.6.1-javadoc.jar; 赠送源代码:slf4j-log4j12-1.6.1-sources.jar; 赠送Maven依赖信息文件:slf4j-log4j12-1.6.1.pom; 包含翻译后的API文档...
赠送jar包:slf4j-log4j12-1.7.21.jar; 赠送原API文档:slf4j-log4j12-1.7.21-javadoc.jar; 赠送源代码:slf4j-log4j12-1.7.21-sources.jar; 赠送Maven依赖信息文件:slf4j-log4j12-1.7.21.pom; 包含翻译后的API...
slf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4...
log4j-1.2.17; slf4j-api-1.7.12; slf4j-log4j12-1.7.12; slf4j-api-1.7.25; slf4j-log4j12-1.7.25;
log4j-1.2.16.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar资源包
压缩包包含slf4j-log4j12-1.7.12.jar和slf4j-api-1.7.12.jar
slf4j-log4j12-1.6.1.jar slf4j-log4j
slf4j-log4j12-1.7.7.jarslf4j-log4j12-1.7.7.jarslf4j-log4j12-1.7.7.jarslf4j-log4j12-1.7.7.jar
slf4j-log4j12-1.6.1.jar+slf4j-api-1.6.1.jar整合SSH、MVC的时候会用得上的工具包
slf4j-log4j12-1.6.1.jar和 slf4j-api-1.6.1.jar, 使用定时器时,quartz-all-1.8.5.jar和log4j包产生冲突,所需的jar
slf4j-log4j12-1.7.33.jar
赠送jar包:slf4j-log4j12-1.7.16.jar; 赠送原API文档:slf4j-log4j12-1.7.16-javadoc.jar; 赠送源代码:slf4j-log4j12-1.7.16-sources.jar; 赠送Maven依赖信息文件:slf4j-log4j12-1.7.16.pom; 包含翻译后的API...
赠送jar包:slf4j-log4j12-1.6.6.jar; 赠送原API文档:slf4j-log4j12-1.6.6-javadoc.jar; 赠送源代码:slf4j-log4j12-1.6.6-sources.jar; 赠送Maven依赖信息文件:slf4j-log4j12-1.6.6.pom; 包含翻译后的API文档...
赠送jar包:slf4j-log4j12-1.7.12.jar; 赠送原API文档:slf4j-log4j12-1.7.12-javadoc.jar; 赠送源代码:slf4j-log4j12-1.7.12-sources.jar; 包含翻译后的API文档:slf4j-log4j12-1.7.12-javadoc-API文档-中文...
赠送jar包:log4j-slf4j-impl-2.12.1.jar; 赠送原API文档:log4j-slf4j-impl-2.12.1-javadoc.jar; 赠送源代码:log4j-slf4j-impl-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-slf4j-impl-2.12.1.pom; ...
slf4j-log4j12-1.7.5.jar。
赠送jar包:slf4j-log4j12-1.7.16.jar; 赠送原API文档:slf4j-log4j12-1.7.16-javadoc.jar; 赠送源代码:slf4j-log4j12-1.7.16-sources.jar; 赠送Maven依赖信息文件:slf4j-log4j12-1.7.16.pom; 包含翻译后的API...
该压缩包中包含以下内容: 1、jcl-over-slf4j-1.7.21.jar 2、jcl-over-slf4j-1.7.21-sources.jar 3、jul-to-slf4j-1.7.21.jar 4、jul-to-slf4j-1.7.21-sources.jar 5、log4j-over-slf4j-1.7.21.jar 6、log4j-over-...
slf4j-log4j12-1.7.7.jar