通常日志都是基于slf4j+log4j或slf4j+logback来打印。slf4j作为门面,只是提供接口,实际的打印还是使用log4j或logback提供的功能。本文以log4j为例。
1. log4j的基础:
http://www.cnblogs.com/Fskjb/archive/2011/01/29/1947592.html
要点:Log4J中总是存在一个rootLogger,logger可以继承,可以自定义logger名称,这个名称跟Logger.getLogger("name")的name相关。
Logger.getLogger()还是LogFactory.getLog()
Logger来自log4j自己的包。如果用Logger.getLogger,需要一个log4j的jar包,用此方式你只能依log4j:
LogFactory来自common-logging包。如果用LogFactory.getLog,你可以用任何实现了通用日志接口的日志记录器替换log4j,而程序不受影响。apache的common-logging包是通用日志接口,通过这个中间层,你可以随便指定到底用哪个日志系统。增加系统的灵活性。若log4j它不存在, commons-logging 会另行选择其它的日志实现类。 这样保证了程序中不一定要使用log4j这个日志文件了。
http://www.jb51.net/article/41291.htm
2. slf4j的优点及jar包引用可以参考:
http://www.importnew.com/7450.html
要点:
(1) slf4j是独立与具体打印日志框架的,可以与log4j结合,也可以方便切换到logback。
(2) 相比log4j,slf4j可以使用占位符,比如log4j的写法:
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
使用slf4j可以:
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
注意:不能{1},{2},{3}这种形式。
这样会在运行时被某个提供的实际字符串所替换。这不仅降低了你代码中字符串连接次数,而且还节省了新建的String对象。
(3) 省去了isDebugEnabled()、isInfoEnabled()的判断,slf4j自动提供了判断。
3. slf4j打印异常
需要打印带有可变参数的日志同时要打印异常信息,用slf4j不能直接把exception放在参数最后,也就是不能:
logger.error("error info {}#{}",new Object[]{a, b}, e);// e 是exception类型
只能:
logger.error("error info {}#{}",new Object[]{a, b, e});// e 是exception类型
把e放到可变对象数组的最后,需要两个参数的时候,把e当做第三个元素即可。
第一种写法会把e当做普通Object,调用e.toString()方法打印,无法打印出异常的堆栈信息。
注意:关于这一点,资料上说slf4j 1.7.*以上版本可以按照第一种写法,1.7.*以下必须按照第二种写法。但本人测试1.7.*也只能按照第二种写法。
4. 关于如何把
不同级别的日志输出到不同文件里,已经有不少文章描述了,完全可以参考。比如:
http://blog.csdn.net/wangchsh2008/article/details/8812857
http://www.cprogramdevelop.com/4496123/
这里有一点需要解释下,如果自定义了logger,比如:log4j.logger.A.B.C=info,ferror,finfo,fdebug
并且分别对为ferror,finfo,fdebug定义了3个文件。
## error appender
log4j.appender.ferror.Threshold = error
log4j.appender.ferror = A.B.C.common.util.MyDailyRollingFileAppender
log4j.appender.ferror.File = ${log.root}/error.log
log4j.appender.ferror.Append = true
log4j.appender.ferror.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.ferror.layout = org.apache.log4j.PatternLayout
log4j.appender.ferror.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p] %X{requestID} [%c-%L]- %m%n
## info appender
log4j.appender.finfo.Threshold = info
log4j.appender.finfo = A.B.C.common.util.MyDailyRollingFileAppender
log4j.appender.finfo.File = ${log.root}/info.log
log4j.appender.finfo.Append = true
log4j.appender.finfo.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.finfo.layout = org.apache.log4j.PatternLayout
log4j.appender.finfo.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p] %X{requestID} [%c-%L]- %m%n
## debug appender
log4j.appender.fdebug.Threshold = debug
log4j.appender.fdebug = A.B.C.common.util.MyDailyRollingFileAppender
log4j.appender.fdebug.File = ${log.root}/debug.log
log4j.appender.fdebug.Append = true
log4j.appender.fdebug.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.fdebug.layout = org.apache.log4j.PatternLayout
log4j.appender.fdebug.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p] %X{requestID} [%c-%L]- %m%n
###root log
log4j.rootLogger = ${log.level},finfo
## my log
log4j.logger.A.B.C=info,ferror,finfo,fdebug
那最后哪些级别的日志会打出来取决于log4j.logger.A.B.C定义的级别。如上配置则debug日志不会打印。
原因:
log4j会自动调用log4jLoggerAdapter的isDebugEnabled()方法:
public boolean isDebugEnabled() {
return this.logger.isDebugEnabled();
}
public boolean isDebugEnabled() {
return this.repository.isDisabled(10000)?false:Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
}
这里的getEffectiveLevel()就会返回log4j.logger.A.B.C定义的级别info,debug小于这个级别就直接忽略不打了。
如果这里配置成debug级别,则可以验证通过,后面再打印时会调用自己重写的继承DailyRollingFileAppender类实现的public boolean isAsSevereAsThreshold(Priority priority)方法,这个方法的参数priority就是实际打印日志时调用的方法,比如调用logger.debug(“这是日志”);则priority= Level.DEBUG。然后拿这个级别跟分别配置的ferror,finfo,fdebug的Threshold值比,比较的规则在isAsSevereAsThreshold()里自定义。
分享到:
相关推荐
这个配置会将日志输出到控制台和名为`app.log`的文件中,日志级别设置为调试(DEBUG),这意味着所有等级等于或高于DEBUG的日志事件都将被记录。 3. **配置Tomcat**:在`$CATALINA_HOME/lib`目录下添加`log4j-api....
slf4j-log4j12-1.7.x版本是SLF4J针对Log4j 1.2版本的绑定器,它使得应用可以使用SLF4J接口,但实际的日志输出通过Log4j进行。这个桥接器让项目能利用SLF4J的灵活性,同时使用Log4j的成熟实现。 在提供的文件名列表...
SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中常用的日志处理框架。SLF4J提供了一个抽象层,允许开发者在运行时插入所需的日志实现,而Log4j则是一个具体的日志实现,以其强大的功能和灵活性著称。...
Log4j定义了几种日志级别,按照严重性从低到高分别为:trace、debug、info、warn、error、fatal。日志级别之间的关系是包含的,即设置日志级别为info时,info、warn、error、fatal级别的日志都会被记录。在开发过程...
描述中提到的是`slf4j-log4j`,这通常是指SLF4J的Log4j绑定包,它提供了SLF4J到Log4j的桥接,使得SLF4J调用能够被Log4j接收并处理。在项目中,你需要将这两个jar包加入到类路径中,同时配置Log4j的配置文件,以指定...
2. **配置Log4j**:在项目的类路径下创建`log4j.properties`或`log4j.xml`配置文件,指定日志级别、输出目的地等。例如: ```properties # log4j.properties log4j.rootLogger=DEBUG, stdout log4j.appender....
Log4j2 结合 Slf4j 配置...通过配置 Log4j2 的配置文件 log4j2.xml,我们可以定义不同的日志记录机制,例如输出到控制台、文件、数据库等。Slf4j 则提供了统一的日志记录接口,使得我们可以轻松地更换日志记录工具。
在项目中,确保这些jar文件位于类路径下,并且正确配置了log4j配置文件,就可以通过SLF4J接口进行日志记录,而底层的日志输出则由Log4j处理。例如: ```java import org.slf4j.Logger; import org.slf4j....
Log4j提供了丰富的日志级别(DEBUG、INFO、WARN、ERROR、FATAL),并且支持自定义日志格式和输出目的地,如控制台、文件、数据库等。通过配置文件,可以方便地调整日志策略,满足不同环境的需求。 4. JUnit: ...
"Junit+log4j+slf4j"这个组合涉及到的是Java编程领域的三个关键工具:JUnit用于进行单元测试,log4j是经典的日志记录库,而SLF4J(Simple Logging Facade for Java)则是一个日志抽象层。 JUnit是Java领域最广泛...
SLF4J提供了一个抽象层,允许开发人员在不修改代码的情况下切换不同的日志框架,如Log4j、Logback等。而Log4j12则是Apache Log4j的第二个主要版本,它提供了丰富的日志记录功能和性能优化。 SLF4J的核心思想是引入...
SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中常用的日志处理框架。SLF4J提供了一个抽象层,允许开发者在部署时插入所需的日志实现,比如Log4j、Logback等。这样做的好处是提高了代码的可移植性和...
SLF4J提供了一个接口层,允许开发者在不改变代码的情况下切换不同的日志实现,比如Logback或Log4j。Log4j则是Apache组织的一个经典日志记录工具,提供了丰富的日志级别、灵活的日志配置以及多种输出格式。 在这个...
2. **配置文件缺失或错误**:`log4j2.xml`是Log4j2的主要配置文件,定义了日志的级别、输出格式、目标等。检查`log4j2.xml`是否存在于类路径中,且配置是否正确。 3. **Tomcat的类加载器问题**:Tomcat有自己的类...
6. slf4j-log4j12.jar:SLF4J到Log4j的适配器,使得SLF4J的日志请求可以被Log4j处理。 总的来说,"log4j-slf4j+logback1.3.0"的组合提供了一个强大、灵活的日志解决方案,允许开发者使用统一的API进行日志记录,...
此外,还可以通过配置文件(如log4j.properties或log4j.xml)自定义日志输出的位置、格式和文件大小限制,以满足不同的需求。 总结来说,Struts2框架结合SLF4J和Log4j1.5.8,为Java Web应用提供了强大的MVC架构和...
SLF4J的核心概念包括Logger、Level和Marker,它们分别用于定义日志记录器、控制日志级别和标记特定的日志信息。 Log4j则是一个强大的、灵活的日志实现,它提供了丰富的配置选项,可以定制化地控制日志的输出格式、...
SLF4J(Simple Logging Facade for Java)是Java的日志抽象层,它提供了一种标准的接口,允许用户在不修改代码的情况下更换不同的日志框架,如Log4j、Logback等。Log4j2是Log4j的升级版,提供了更优秀的性能和更多的...