⽇志组件slf4j介绍及配置详解
1 基本介绍
每⼀个Java程序员都知道⽇志对于任何⼀个Java应⽤程序尤其是服务端程序是⾄关重要的,⽽很多程序员也已经熟悉各种不同的⽇志库,如java.util.logging、Apache log4j、logback。但如果你还不知道SLF4J(Simple logging facade for Java)的话,那么是时候在你的项⽬中学习使⽤SLF4J了。
SLF4J不同于其他⽇志类库,与其它⽇志类库有很⼤的不同。SLF4J(Simple logging Facade for Java)不是⼀个真正的⽇志实现,⽽是⼀个抽象层( abstraction layer),它允许你在后台使⽤任意⼀个⽇志类库。如果是在编写供内外部都可以使⽤的API或者通⽤类库,那么你真不会希望使⽤你类库的客户端必须使⽤你选择的⽇志类库。
如果⼀个项⽬已经使⽤了log4j,⽽你加载了⼀个类库,⽐⽅说 Apache Active MQ——它依赖于于另外⼀个⽇志类库logback,那么你就需要把它也加载进去。但如果Apache Active MQ使⽤了SLF4J,你可以继续使⽤你的⽇志类库⽽⽆需忍受加载和维护⼀个新的⽇志框架的痛苦。
log4j与log4j2
总的来说,SLF4J使你的代码独⽴于任意⼀个特定的⽇志API,这是对于API开发者的很好的思想。虽然抽象⽇志类库的思想已经不是新鲜的事物,⽽且Apache commons logging也已经在使⽤这种思想了,但SLF
4J正迅速成为Java世界的⽇志标准。让我们再看⼏个使⽤SLF4J⽽不是log4j、logback或者java.util.logging的理由。
2 SLF4J对⽐Log4J,logback和java.util.Logging的优势
正如我之前说的,在你的代码中使⽤SLF4J写⽇志语句的主要出发点是使得你的程序独⽴于任何特定的⽇志类库,依赖于特定类库可能需要使⽤不同于你已有的配置,并且导致更多维护的⿇烦。除此之外,还有⼀个SLF4J API的特性是使得我坚持使⽤SLF4J⽽抛弃我长期间钟爱的Log4j的理由,是被称为占位符(place holder),在代码中表⽰为“{}”的特性。占位符是⼀个⾮常类似于在String的format()⽅法中的%s,因为它会在运⾏时被某个提供的实际字符串所替换。这不仅降低了你代码中字符串连接次数,⽽且还节省了新建的String对象。通过使⽤
SLF4J,你可以在运⾏时延迟字符串的建⽴,这意味着只有需要的String对象才被建⽴。⽽如果你已经使⽤log4j,那么你已经对于在if条件中使⽤debug语句这种变通⽅案⼗分熟悉了,但SLF4J的占位符就⽐这个好⽤得多。
这是你在Log4j中使⽤的⽅案,但这并不有趣,⽽且降低了代码可读性,因为它增加了不必要的繁琐重复代码(boiler-plate code):
另⼀⽅⾯,如果你使⽤SLF4J的话,你可以得到更简洁格式的结果,就像以下展⽰的⼀样:
在SLF4J,我们不需要字符串连接⽽且不会导致暂时不需要的字符串消耗。取⽽代之,我们在⼀个以占位符和参数传递实际值构成的模板格式下写⽇志信息。你可能会在想万⼀我有很多个参数怎么办?嗯,那么你可以选择使⽤变量参数版本的⽇志⽅法或者以Object数组传递。这是⼀个相当⽅便和⾼效⽅法的打⽇志⽅法。记住,在⽣产最终⽇志信息字符串之前,这个⽅法会检查⼀个特定的⽇志级别是不是打开了,这不仅降低了内存消耗⽽且预先降低了CPU去处理字符串连接命令的时间。这⾥是使⽤SLF4J⽇志⽅法的代码,来⾃于slf4j-log4j12-1.6.1.jar 中的Log4j的适配器类Log4jLoggerAdapter。
同时,我们应该知道打⽇志是对应⽤程序性能有着很⼤影响,在⽣产环节上我们建议只进⾏必要的⽇志记录。
3 使⽤配置
3.1 maven依赖
3.2 ⽇志系统配置
假设现有如下程序:
可以使⽤以下两种⽅式对⽇志系统的输出格式、记录级别、输出⽅式等进⾏配置。
3.2.1 properties⽂件⽅式
log4j.properties:
输出结果为:
3.2.2 xml⽂件⽅式
⾸先pom中添加如下依赖:
输出结果为:
3.3 ⽇志系统配置说明
3.3.1 输出级别的种类
3.3.2 配置⽇志信息输出⽬的地
3.3.3 配置⽇志信息的格式
3.3.4 ConsoleAppender选项
3.3.5 FileAppender 选项
3.3.6 RollingFileAppender 选项
3.3.7 ⽇志信息格式中⼏个符号所代表的含义⼀个⽰例配置⽂件
过滤器

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。