`
xiaoxin5230
  • 浏览: 88859 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

调试日志之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>
这个意思是满足结果就写入,不满足结果就拒绝写入
到此日志的快速入门文档就写到这里,如果想需要更高级的功能,那么请查看详细文档。
分享到:
评论

相关推荐

    slf4j+logback

    SLF4J(Simple Logging Facade for Java)和Logback是Java日志处理中的两个重要组件,它们在软件开发中广泛用于记录应用程序的运行时信息。SLF4J是一个日志门面,它提供了一个统一的接口,允许开发人员在运行时插入...

    采用slf4j+logback输出日志

    Logback是SLF4J的一个实现,由著名日志框架Log4j的创始人Ceki Gülcü所创建。Logback被认为是比Log4j更高效、功能更强大的日志处理框架。 本文将详细介绍如何使用SLF4J与Logback来输出应用程序的日志,并提供必要...

    slf4j + logback配置实例

    SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它提供了一个简单的API,允许开发者在不修改代码的情况下切换底层的日志实现。Logback是SLF4J的一个具体实现,由著名Java开源框架Log4j的创始...

    ssm +shiro+slf4j+logback 学习记录

    最后,通过SLF4J和Logback记录应用运行过程中的各类信息,便于调试和监控。 **Ajax(异步JavaScript和XML)** Ajax是一种在不刷新整个页面的情况下更新部分网页的技术。在SSM和Shiro的环境中,Ajax常用于实现无刷新...

    slf4j+logback使用

    SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它提供了一个统一的API,允许开发者选择任何支持的底层日志库,如Logback、Log4j或Java内置的日志系统。Logback是陈雪峰创建的,作为Log4j的...

    slf4j+logback+springmvc+maven小例子

    SLF4J允许开发者在部署时插入所需的日志实现,比如logback、log4j等,这使得项目的可移植性和灵活性大大增强。 Logback是另一个关键组件,它是由log4j的创始人Ceki Gülcü创建的。Logback是目前广泛使用的日志框架...

    Slf4j+logback实现logback测试

    Slf4j(Simple Logging Facade for Java)是一个日志门面,它提供了一个统一的API,允许开发者选择合适的日志框架,如Logback、Log4j等,而无需修改代码。Slf4j的主要目标是为各种日志框架提供一个简单统一的接口,...

    slf4j+logback 日志系统使用

    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和Logback的结合使用,为Java开发者提供了强大且灵活的日志管理工具,有助于提升软件的可维护性和调试效率。通过`slf4j-1.6.1+logback-0.9.24`这个压缩包,你可以得到这两个组件的旧版本,尽管现在有...

    Java-Spring-logging-slf4j-logback:#Spring日志记录slf4j Logback

    SLF4J是一个日志API,它的主要目标是为各种日志框架提供一个简单的抽象层,如Log4j、Logback等。这样,开发者可以在不修改代码的情况下,自由选择日志实现。SLF4J通过接口定义了日志记录方法,而具体的实现则由...

    slf4j+log4j2配置使用

    SLF4J(Simple Logging Facade for Java)是一个Java的日志接口,而Log4j2是一个具体的日志实现框架。Log4j2是Log4j的升级版,提供了更加灵活和强大的日志处理能力,包括异步日志、延迟加载、日志脱敏等功能。接下来...

    slf4j+log4j

    SLF4J(Simple Logging Facade for Java)是一个日志门面,它为各种日志框架提供一个统一的接口,如Logback、Log4j、Java Util Logging等。它的主要目标是使日志库与应用程序解耦,让开发者能够在不修改代码的情况...

    tomcat9 slf4j+log4j2 写日志.zip

    首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback或Log4j。它的主要优点是允许用户在部署时选择适合自己的日志实现,而无需修改代码。SLF4J通过提供一个统一的API,使得更换日志框架变得非常...

    SLF4JTest:这是一个示例程序,可通过SLF4J + Logback输出日志。

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供了一个简单的接口。SLF4J的主要目的是使用户能够在部署时插入所需的日志框架,而无需重新编译代码。...

    slf4j-1.6.1-Blogback-0.9.24等日志包

    SLF4J(Simple Logging Facade for Java)和Logback是Java世界中广泛使用的日志框架,它们在Spring MVC项目中扮演着至关重要的角色。SLF4J是一个接口层,为各种日志实现提供了一个统一的API,允许开发者在不修改代码...

    tomcat-slf4j-logback-parent:Tomcat,SLF4J和Logback集成父级

    总结,"Tomcat-SLF4J-Logback-parent"项目为基于Tomcat的Java应用提供了便利的日志管理方案,通过SLF4J的抽象层和Logback的高效实现,确保了日志系统的灵活性和可扩展性。对于开发者来说,理解和掌握这种集成方式,...

    struts2,(slf4j-log4j12-1.5.8—日志) 建议360压缩解压

    SLF4J 提供了一种统一的API,无论底层的日志框架是Log4j、Java Util Logging (JUL)、Logback还是其他,都可以通过SLF4J进行调用。 Log4j 1.5.8是Apache的一个经典日志工具,它提供了灵活且强大的日志记录功能。SLF4...

Global site tag (gtag.js) - Google Analytics