Slf4j+Log4j 应用模式

一、Log4j 的概念、作用及如何使用

Log4j默认把日志信息分为五个等级

debug < info < warn < error < fatal

Log4j的关键之处在于它的继承思想。也就是一个Log可以继承另外一个Log的属性(输出到哪里,日志等级,日志格式等等)

 

下面是一个简单的测试方法:

image2017-2-9%2016%3A1%3A48.png?version=1&modificationDate=1486627461000&api=v2

Log4j是根据Log的名字来判断继承关系的,比如:

名字为“com.XXX.lib”的Log就是“com.XXX.lib.log”的parent父级,Log4j还有一个rootLogger,相当于Java的Object。

上图中的“LogFactory.getLog(Test.class)”这里的“Test.class”事实上传进去的是Test这个类的完整路径(包名+类名),“logTest.Test”。这样如果存在“logTest”这个Log 那么Test这个Log就继承它,否则就继承rootLogger。

 

image2017-2-9%2016%3A19%3A25.png?version=1&modificationDate=1486628370000&api=v2

log4j.rootLogger = info, stdout

配置log4j.rootLogger,因为它是根,需要配置一下,否则别的Log不知道继承什么啊,其他的Log可以配置也可以不配置。等号后面的第一个参数表示日志级别,可以填五个级别中的一种,后面的参数都是让 Log知道输出到哪里,如果你想让日志输出到两个地方就加两个输出参数,比如:log4j.rootLogger=info, stdout, file


这里的info表示,该Log的日志级别为info,所有级别小于info的日志都不会被记录。比如使用这个配置文件的话,上面测试类中的image2017-2-9%2016%3A23%3A58.png?version=1&modificationDate=1486628642000&api=v2 这句话是不起作用的,因为debug的级别小于info。这样就很容易控制什么信息在调试的时候要显示,什么信息在发布的时候要去掉。

 

接着往下看stdout了,这个名字是随便取的,你可以叫它A:

log4j.appender.A=org.apache.log4j.ConsoleAppender,那 么上面的rootLogger的参数stdout也要改成A,其他用到的地方当然也要改。

这里的关键不是名字,而是appender类型,比如这里的 “ConsoleAppender”,输出到 Console控制台。

log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
log4j.appender.stdout.Encoding = utf8

这些都是设置日志格式的!

 

下面是log4j.properties的配置信息

#输出格式
#%m 输出代码中指定的消息
#%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 输出自应用启动到输出该log信息耗费的毫秒数
#%c 输出所属的类目,通常就是所在类的全名
#%t 输出产生该日志事件的线程名
#%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.Java:10)

格式化例子:
log4j.appender.thisProject.file.out.layout.ConversionPattern=log4j-->%d{yyyy MMM dd HH:mm:ss,SSS}%5p{%F\:%L}-%m%n

 

部署:

image2017-2-9%2016%3A39%3A17.png?version=1&modificationDate=1486629562000&api=v2

把log4j的包和commons- logging的包(加在一起才两个)放到classpath下面。然后把配置文件保存为log4j.properties,也放在classpath下面

 

二、Slf4j的概念和作用

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。

实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

就像 JCL 需要底层的日志实现,如 Log4J、java.util.logging、Simple Logger 等来完成具体的信息输出,事实上基本总是 JCL+Log4J 那么一个绝配。SLF4J 的原旨也是能支持多种下层日志框架实现,但最好的日志实现仍然是 Log4J。

Slf4j的优势:

1)在你的开源库或者私有库中使用SLF4J,可以使它独立于任何的日志实现,这就意味着不需要管理多个库和多个日志文件。

2)SLF4J提供了占位日志记录,通过移除对isDebugEnabled(), isInfoEnabled()等等的检查提高了代码的可读性。

3)通过使用日志记录方法,直到你使用到的时候,才会去构造日志信息(字符串),这就同时提高了内存和CPU的使用率。

4)越少的临时字符串,垃圾回收器就意味着越少的工作,这就意味着为你的应用程序提供更好的吞吐量和性能。

 

三、JCL的概念和作用

image2017-2-9%2016%3A50%3A43.png?version=1&modificationDate=1486630248000&api=v2

JCL 只提供 log 接口,具体的实现则在运行时动态寻找。起到一个桥接器作用,就是一个假的日志实现工具,比如当你把 jcl-over-slf4j.jar 放到 CLASS_PATH 时,即使某个组件原本是通过 JCL 输出日志的,现在却会被 jcl-over-slf4j “骗到”SLF4J 里,然后 SLF4J 又会根据绑定器把日志交给具体的日志实现工具。

SLF4J 的比较典型搭配就是把 slf4j-api、JCL 桥接器、java.util.logging(JUL)桥接器、log4j 绑定器、log4j 这5个 jar 放置在 CLASS_PATH 里。

转载于:https://my.oschina.net/u/1411360/blog/1359351

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值