一、日志框架
1.1、选择SLF4J而不是Log4j
我建议直接选择SLF4J而不是Log4j,commons logging,logback或java.util.logging
1、在开源库或内部库中使用SLF4J,将使其独立于任何特定的日志记录实现,这意味着无需为多个库管理多个日志记录配置,您的客户端将会很需要这一点。
2、SLF4J提供了基于占位符的日志记录,通过删除检查(isDebugEnabled(),isInfoEnabled()等)来提高代码的可读性。
3、另外,临时字符串数量越少意味着垃圾收集器的工作量就越少,这意味着应用程序的吞吐量和性能会更好。
这些优势只是冰山一角,当您开始使用SL4J深入了解它时,您将看到更多的优点。 我强烈建议,Java中的任何新代码开发都应该使用SLF4J来记录日志。
1.2、log4j、logback、log4j2关系
日志的具体实现,其中log4j和logback是基于SLF4J接口规范进行实现的。
1.3、注意点
SLF4J、log4j、logback是一家公司出的。先有的log4j,后来发现性能有问题,在log4j上改造又太麻烦,所以直接重新开发个logback,但是为了规范和以后维护升级,就出了一个规范SLF4J。而log4j2其实只是Apache出的一套日志框架,也很完美。
1.5 logback取代log4j的理由
(1)更快的实现:Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。
(2)非常充分的测试:Logback经过了几年,数不清小时的测试。Logback的测试完全不同级别的。
(3)Logback-classic非常自然实现了SLF4j:Logback-classic实现了SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了slf4j , 所 以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。
(4)非常充分的文档官方网站有两百多页的文档。
(5)自动重新加载配置文件,当配置文件修改了,Logback-classic能自动重新加载配置文件。扫描过程快且安全,它并不需要另外创建一个扫描线程。这个技术充分保证了应用程序能跑得很欢在JEE环境里面。
(6)Lilith是log事件的观察者,和log4j的chainsaw类似。而lilith还能处理大数量的log数据 。
(7)谨慎的模式和非常友好的恢复,在谨慎模式下,多个FileAppender实例跑在多个JVM下,能 够安全地写道同一个日志文件。RollingFileAppender会有些限制。Logback的FileAppender和它的子类包括 RollingFileAppender能够非常友好地从I/O异常中恢复。
(8)配置文件可以处理不同的情况,开发人员经常需要判断不同的Logback配置文件在不同的环境下(开发,测试,生产)。而这些配置文件仅仅只有一些很小的不同,可以通过,和来实现,这样一个配置文件就可以适应多个环境。
(9)Filters(过滤器)有些时候,需要诊断一个问题,需要打出日志。在log4j,只有降低日志级别,不过这样会打出大量的日志,会影响应用性能。在Logback,你可以继续 保持那个日志级别而除掉某种特殊情况,如alice这个用户登录,她的日志将打在DEBUG级别而其他用户可以继续打在WARN级别。要实现这个功能只需加4行XML配置。可以参考MDCFIlter 。
(10)SiftingAppender(一个非常多功能的Appender):它可以用来分割日志文件根据任何一个给定的运行参数。如,SiftingAppender能够区别日志事件跟进用户的Session,然后每个用户会有一个日志文件。
(11)自动压缩已经打出来的log:RollingFileAppender在产生新文件的时候,会自动压缩已经打出来的日志文件。压缩是个异步过程,所以甚至对于大的日志文件,在压缩过程中应用不会受任何影响。
(12)堆栈树带有包版本:Logback在打出堆栈树日志时,会带上包的数据。
(13)自动去除旧的日志文件:通过设置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory属性,你可以控制已经产生日志文件的最大数量。如果设置maxHistory 12,那那些log文件超过12个月的都会被自动移除。
二、Commons Logging简介
common-logging是apache提供的一个通用的日志接口,
在common-logging中,有一个Simple logger的简单实现,但是它功能很弱,所以使用common-logging,通常都是配合着log4j来使用;
Commons Logging定义了一个自己的接口 org.apache.commons.logging.Log,以屏蔽不同日志框架的API差异,这里用到了Adapter Pattern(适配器模式)。
三、SLF4J简介
3.1 slf4j是什么
SLF4J(Simple Logging Facade For Java);
是日志的门面,什么叫门面?就是日志的抽象层?再说详细点:就是一个接口规范,类似于JDBC那种,只提供一个门面,谁想要具体的,你们自己各大厂商去实现。比如目前的实现者:logback。
3.2 slf4j说明
Simple Logging Facade for Java(SLF4J)用作各种日志框架(例如java.util.logging,logback,log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志框架。
要切换日志框架,只需替换类路径上的slf4j绑定。 例如,要从java.util.logging切换到log4j,只需将slf4j-jdk14-1.8.0-beta2.jar替换为slf4j-log4j12-1.8.0-beta2.jar
SLF4J不依赖于任何特殊的类装载机制。 实际上,每个SLF4J绑定在编译时都是硬连线的,以使用一个且只有一个特定的日志记录框架。 例如,slf4j-log4j12-1.8.0-beta2.jar绑定在编译时绑定以使用log4j。 在您的代码中,除了slf4j-api-1.8.0-beta2.jar之外,您只需将您选择的一个且只有一个绑定放到相应的类路径位置。 不要在类路径上放置多个绑定。
3.3 slf4j官网
3.4 slf4j关系图
3.5 sl4j集成
因此,slf4j就是众多日志接口的集合,他不负责具体的日志实现,只在编译时负责寻找合适的日志系统进行绑定。具体有哪些接口,全部都定义在slf4j-api中。查看slf4j-api源码就可以发现,里面除了public final class LoggerFactory类之外,都是接口定义。因此,slf4j-api本质就是一个接口定义。
总之,Slf4j更好的兼容了各种具体日志实现的框架,如图:
四、log4j简介
4.1 Log4j是什么
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
4.2配置根Logger
Logger负责处理日志记录的大部分操作。
其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中, level 是日志记录的优先级,分为 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 ALL 或者自定义的级别。 Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR 、 WARN 、 INFO 、 DEBUG 。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了 INFO 级别,只有等于及高于这个级别的才进行处理,则应用程序中所有 DEBUG 级别的日志信息将不被打印出来。 ALL: 打印所有的日志, OFF :关闭所有的日志输出。 appenderName 就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
4.3 Appender
配置日志信息输出目的地Appender负责控制日志记录操作的输出。
其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.optionN = valueN
其中,Log4j提供的 appender 有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过 log4j.appender.R.MaxFileSize=100KB 设置文件大小,还可通过 log4j.appender.R.MaxBackupIndex=1 设置为保存一个备份文件。
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
例:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
定义一个名为stdout的输出目的地, ConsoleAppender 为控制台。
4.4 Layout
其中,Log4j提供的 layout 有以下几种:
org.apache.log4j.HTMLLayout(以 HTML 表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
4.5格式化日志信息
Log4j可以指定不同的日志信息打印格式,打印参数如下:
%m输出代码中指定的消息
%p输出优先级,即 DEBUG , INFO , WARN , ERROR , FATAL
%r输出自应用启动到输出该 log 信息耗费的毫秒数
%c输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名
%n输出一个回车换行符, Windows 平台为 “rn” , Unix 平台为 “n”
%d输出日志时间点的日期或时间,默认格式为 ISO8601 ,也可以在其后指定格式,比如: %d{yyyy MMM dd HH:mm:ss,SSS} ,输出类似: 2014-10-08 11:34:27.501
%l输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
4.6示例
一段简单的log4j配置备用:
### set log levels ###log4j.rootLogger = debug,stdout,D,E###输出到控制台 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n###输出到日志文件 ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = logs/log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = INFOlog4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%nlog4j.appender.D.DatePattern = '.'yyyy-MM-dd###保存异常信息到单独文件 ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File = logs/error.loglog4j.appender.E.Append = truelog4j.appender.E.Threshold = ERRORlog4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.DatePattern = '.'yyyy-MM-dd-HH-mmlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ]
五、logback简介
5.1 logback模块
Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面下个模块:
(1)logback-core:其它两个模块的基础模块
(2)logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
(3)logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
5.2 logback中三个重要概念
Logger:日志记录器,把它关联到应用对应的context上后,主要用于存放日志对象,定义日志类型,级别。
Appender: 指定日志输出的目的地,目的地可以是控制台,文件,或者数据库等
Layout:负责把事件转换成字符串,格式化日志信息的输出
5.3 logback配置优先级顺序
(1)logback首先在classpath寻找logback.groovy文件,
(2)如果没找到,继续寻找logback-test.xml文件
(3)如果没找到,继续寻找logback.xml文件
(4)如果仍然没找到,则使用默认配置(打印到控制台