日志系统
系统上线后,难免会出现问题,这时候好的调试日志就是开发人员的救命草。在日志系统选型里面我们选择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>
这个意思是满足结果就写入,不满足结果就拒绝写入
到此日志的快速入门文档就写到这里,如果想需要更高级的功能,那么请查看详细文档。
分享到:
相关推荐
SLF4J(Simple Logging Facade for Java)和Logback是Java日志处理中的两个重要组件,它们在软件开发中广泛用于记录应用程序的运行时信息。SLF4J是一个日志门面,它提供了一个统一的接口,允许开发人员在运行时插入...
Logback是SLF4J的一个实现,由著名日志框架Log4j的创始人Ceki Gülcü所创建。Logback被认为是比Log4j更高效、功能更强大的日志处理框架。 本文将详细介绍如何使用SLF4J与Logback来输出应用程序的日志,并提供必要...
SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它提供了一个简单的API,允许开发者在不修改代码的情况下切换底层的日志实现。Logback是SLF4J的一个具体实现,由著名Java开源框架Log4j的创始...
最后,通过SLF4J和Logback记录应用运行过程中的各类信息,便于调试和监控。 **Ajax(异步JavaScript和XML)** Ajax是一种在不刷新整个页面的情况下更新部分网页的技术。在SSM和Shiro的环境中,Ajax常用于实现无刷新...
SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它提供了一个统一的API,允许开发者选择任何支持的底层日志库,如Logback、Log4j或Java内置的日志系统。Logback是陈雪峰创建的,作为Log4j的...
SLF4J允许开发者在部署时插入所需的日志实现,比如logback、log4j等,这使得项目的可移植性和灵活性大大增强。 Logback是另一个关键组件,它是由log4j的创始人Ceki Gülcü创建的。Logback是目前广泛使用的日志框架...
Slf4j(Simple Logging Facade for Java)是一个日志门面,它提供了一个统一的API,允许开发者选择合适的日志框架,如Logback、Log4j等,而无需修改代码。Slf4j的主要目标是为各种日志框架提供一个简单统一的接口,...
SLF4J(Simple Logging Facade for Java)和Logback是Java开发中广泛使用的日志处理框架。SLF4J提供了一个抽象层,允许开发者在运行时选择合适的日志实现,而Logback则是SLF4J的一个具体实现,它以其高效、灵活和...
总之,SLF4J+Logback的组合为Java开发者提供了强大且灵活的日志管理能力,无论是对于调试还是长期的日志记录和分析,都是一个值得信赖的选择。通过适当的配置,可以满足不同项目的需求,并且随着项目的演变,配置也...
综上所述,SLF4J和Logback的结合使用,为Java开发者提供了强大且灵活的日志管理工具,有助于提升软件的可维护性和调试效率。通过`slf4j-1.6.1+logback-0.9.24`这个压缩包,你可以得到这两个组件的旧版本,尽管现在有...
SLF4J是一个日志API,它的主要目标是为各种日志框架提供一个简单的抽象层,如Log4j、Logback等。这样,开发者可以在不修改代码的情况下,自由选择日志实现。SLF4J通过接口定义了日志记录方法,而具体的实现则由...
SLF4J(Simple Logging Facade for Java)是一个Java的日志接口,而Log4j2是一个具体的日志实现框架。Log4j2是Log4j的升级版,提供了更加灵活和强大的日志处理能力,包括异步日志、延迟加载、日志脱敏等功能。接下来...
SLF4J(Simple Logging Facade for Java)是一个日志门面,它为各种日志框架提供一个统一的接口,如Logback、Log4j、Java Util Logging等。它的主要目标是使日志库与应用程序解耦,让开发者能够在不修改代码的情况...
首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback或Log4j。它的主要优点是允许用户在部署时选择适合自己的日志实现,而无需修改代码。SLF4J通过提供一个统一的API,使得更换日志框架变得非常...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供了一个简单的接口。SLF4J的主要目的是使用户能够在部署时插入所需的日志框架,而无需重新编译代码。...
SLF4J(Simple Logging Facade for Java)和Logback是Java世界中广泛使用的日志框架,它们在Spring MVC项目中扮演着至关重要的角色。SLF4J是一个接口层,为各种日志实现提供了一个统一的API,允许开发者在不修改代码...
总结,"Tomcat-SLF4J-Logback-parent"项目为基于Tomcat的Java应用提供了便利的日志管理方案,通过SLF4J的抽象层和Logback的高效实现,确保了日志系统的灵活性和可扩展性。对于开发者来说,理解和掌握这种集成方式,...
SLF4J 提供了一种统一的API,无论底层的日志框架是Log4j、Java Util Logging (JUL)、Logback还是其他,都可以通过SLF4J进行调用。 Log4j 1.5.8是Apache的一个经典日志工具,它提供了灵活且强大的日志记录功能。SLF4...