调试日志之slf4j+logback

日志系统
系统上线后,难免会出现问题,这时候好的调试日志就是开发人员的救命草。在日志系统选型里面我们选择slf4j+logback进行开发。
log4j作者的新作slf4j是commons-logging的替代品,因为可以参数化的语句"my message {}",不用再为了丁点性能写什么 if( logger.isDebugenable()) ....Hibernate、Jetty, Spring3.0等项目已经迁移到了slf4j。
log4j的替代日志是logback,也是log4j的作者写的。Sl4j和logback的区别是,slf4j相当于是接口,而logback是实现。当然slf4j也可以和log4j结合。
首先说一下slf4j吧
Slf4j使用起来很简单。下载slf4j包,然后放入class文件中。
首先我们先实现经典的“hello world”
1.
package test;  
2.
3. import org.slf4j.Logger;
4. import org.slf4j.LoggerFactory;
5. /**
6. * @className:Log.java
7. * @classDescription:
8. * @author:xiayingjie
9. * @createTime:2010-11-18
10. */
11.
12. public class Log {
13.
14.
15. protected static final Logger logger = LoggerFactory.getLogger(Log.class);
16.
17. public static void main(String[] args) {
18. logger.info("Hello world.");
19. }
20.
21. }

在这里我们需要注意的slf4j是支持参数化设置的,比如
(log4j)老版本: logger.info(“hello world”+变量);
(Slf4j)新版本: logger.info(“hello world {}”,变量);
Log4j这样的拼装语句是很影响性能的。
个人经验:
一般在try…catch 的catch中写入 logger.error()信息。信息中要对对象,具体的问题有个描述。

Slf4j里面没有具体的实现,基本上就是接口,主要的实现还是要靠log4j或者logback来实现。下面就讲一下logback日志吧,具体的文档请参考\\192.168.1.201\wap\项目管理\研发\技术资料\ Logback_manual_chs.pdf.

第一步,先建一个logback.xml文件放入src中,系统默认会找到这个文件。
第二步,将如下jar包放入lib中
jcl-over-slf4j-1.6.1.jar
slf4j-api-1.6.1.jar
logback-core-0.9.26.jar
logback-classic-0.9.26.jar
xmlbeans-2.3.0.jar
下面将一个简单logback.xml配置文件贴出来
1.
	<configuration>  
2. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
3.
4. <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
5. <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
6. <expression>logger.contains("springframework")</expression>
7. </evaluator>
8. <OnMismatch>NEUTRAL</OnMismatch>
9. <OnMatch>DENY</OnMatch>
10. </filter>
11.
12. <encoder charset="UTF-8">
13. <pattern>%-4r - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n </pattern>
14. </encoder>
15. </appender>
16.
17. <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
18. <file>unmi_ssh.log</file>
19.
20. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
21. <level>INFO</level>
22. </filter>
23.
24. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
25. <fileNamePattern>unmi_ssh.%d{yyyy-MM-dd}..log.zip</fileNamePattern>
26. <minIndex>1</minIndex>
27. <maxIndex>3</maxIndex>
28. </rollingPolicy>
29.
30. <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
31. <maxFileSize>5MB</maxFileSize>
32. </triggeringPolicy>
33.
34. <encoder>
35. <pattern>%-1relative [%thread] %-5level %logger{0} -- %msg%n</pattern>
36. </encoder>
37. </appender>
38.
39. <root level="DEBUG">
40. <appender-ref ref="stdout" />
41. <appender-ref ref="RollingFile"/>
42. </root>
43. </configuration>


Configuration是logback的根目录 里面包含appender root logger等基本元素。
Appender提供记录的介质,这里可以是控制台,文本文件,邮件,数据库等等,一般的情况下我们是记录到文本文件中。日志文件一般按日滚动,所以一般是选择ch.qos.logback.core.rolling.RollingFileAppender 。

在按日滚动的策略中有两个参数必不可少rollingPolicy滚动策略 triggeringPolicy 滚动触发器
44.
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">           <fileNamePattern>unmi_ssh.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> 
45. <maxHistory>30</maxHistory> //保留30天记录
46. <minIndex>1</minIndex>
47. <maxIndex>3</maxIndex>
48. </rollingPolicy>
49. <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
50. <maxFileSize>5MB</maxFileSize>
51. </triggeringPolicy>

滚动策略:
fileNamePattern :String 必需。定义滚动(归档)记录文件的名字。其值应当包含文件名及“%d”格式转换符。“%d”可以包含一个java.text.SimpleDateFormat 指定的日期时间模式。如果没有指定日期时间模式,则默认为 yyyy-MM-dd。RollingFileAppender(TimeBasedRollingPolicy 之父)的“file”选项可有可无。
maxHistory : int : 控制被保留的归档文件的最大数量,超出数量就删除旧文件。例如,假设每月滚动,且 maxHistory 是 3,则只保留最近 6 个月的归档文件,删除之前的文件。注意当删除旧归档文件时,那些为了归档而创建的目录也会被删除。
这里的滚动测率是按时间来的。%d{yyyy-MM-dd} 其中%d是代表的日期,后面是日期的格式化。
.zip是将日志直接压缩成zip文件。
触发机制:
这里是按照大小来触发的,如果文件大小超过5M则触发滚动策略 对应滚动策略的:
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
%i是代表的这些变量,最小值是1,最大值是3
下面讲解如何输出格式
1.
<encoder charset="UTF-8"> 
2. <pattern>%-4r%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg</pattern>
3. </encoder>


1. %-4r 的意思是右移动4个空格输出从程序启动到创建记录事件的逝去时间,单位毫秒。
2. %d{HH:mm:ss.SSS} 具体日志记录的时间
3. [%thread] 线程
4. %-5level输出记录事件的级别
5. %logger{5} 可以有一个整数型的参数,功能是缩短 logger 名
6. %msg 记录的是logger.info(msg)里面的msg信息

Appender的简介大概就到这里,具体的请参考文本。下面介绍有root节点,root顾名思义就是根节点的意思。
52.
<root level="DEBUG">  
53. <appender-ref ref="stdout" />
54. <appender-ref ref="RollingFile"/>
55. </root>

这里的意思是将stdout和roolingfile的日志级别定义成debug模式。根目录下的所有打印都会监控。Root元素只能有一个。如果需要在不同的包里面打印不同的日志,那么就需要logger节点来完成了。
Logger 是用<logger>元素配置的。<logger>元素有且仅有一个 name 属性、一个可选的
level属性和一个可选的 additivity 属性。
如果我们不想看到com.common里面的debug信息,可以如下设置:
56.
<logger name="com.common" level="INFO" />
57. <root level="DEBUG">
58. <appender-ref ref="stdout" />
59. <appender-ref ref="RollingFile"/>
60. </root>

那么此时的com.common的info日志级别要高于root的debug级别,那么日志级别将会以logger的为准 下面给出一个图
Logger名 分配级别 有效级别
root DEBUG DEBUG
com.common info info
com.common.StringUtil null info
com.common.util debug debug

上面这个图就很好的诠释了logger和root节点在定义级别后所产生的有效级别。

最后讲解一下appender中的过滤器。
61.
62.
  <filter class="ch.qos.logback.core.filter.EvaluatorFilter">  
63. <evaluator>
64. <expression>logger.contains("springframework")</expression>
65. </evaluator>
66. <OnMismatch>NEUTRAL</OnMismatch>
67. <OnMatch>DENY</OnMatch>
68. </filter>

我们这里使用的是求值过滤器EvaluatorFilter,logger.contains("springframework")这里表达式的意思是包含spring框架的日志记录,OnMatch 为deny的意思是匹配到数据后拒绝写入,如果是接受使用“ACCEPT”关键字。
例如:<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
这个意思是满足结果就写入,不满足结果就拒绝写入
到此日志的快速入门文档就写到这里,如果想需要更高级的功能,那么请查看详细文档。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值