`
足至迹留
  • 浏览: 497151 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

【slf+log4j】基础+不同级别日志分别打到不同文件

阅读更多
通常日志都是基于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()里自定义。
4
3
分享到:
评论

相关推荐

    tomcat9 slf4j+log4j2 写日志.zip

    这个配置会将日志输出到控制台和名为`app.log`的文件中,日志级别设置为调试(DEBUG),这意味着所有等级等于或高于DEBUG的日志事件都将被记录。 3. **配置Tomcat**:在`$CATALINA_HOME/lib`目录下添加`log4j-api....

    log4j + slf4j-api + slf4j-log4j12

    slf4j-log4j12-1.7.x版本是SLF4J针对Log4j 1.2版本的绑定器,它使得应用可以使用SLF4J接口,但实际的日志输出通过Log4j进行。这个桥接器让项目能利用SLF4J的灵活性,同时使用Log4j的成熟实现。 在提供的文件名列表...

    slf4j+log4j

    SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中常用的日志处理框架。SLF4J提供了一个抽象层,允许开发者在运行时插入所需的日志实现,而Log4j则是一个具体的日志实现,以其强大的功能和灵活性著称。...

    slf4j+log4j2配置使用

    Log4j定义了几种日志级别,按照严重性从低到高分别为:trace、debug、info、warn、error、fatal。日志级别之间的关系是包含的,即设置日志级别为info时,info、warn、error、fatal级别的日志都会被记录。在开发过程...

    slf4j1.7.25+ log4j2.8.2 集成jar包

    描述中提到的是`slf4j-log4j`,这通常是指SLF4J的Log4j绑定包,它提供了SLF4J到Log4j的桥接,使得SLF4J调用能够被Log4j接收并处理。在项目中,你需要将这两个jar包加入到类路径中,同时配置Log4j的配置文件,以指定...

    log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码

    2. **配置Log4j**:在项目的类路径下创建`log4j.properties`或`log4j.xml`配置文件,指定日志级别、输出目的地等。例如: ```properties # log4j.properties log4j.rootLogger=DEBUG, stdout log4j.appender....

    Log4j2结合Slf4j配置使用

    Log4j2 结合 Slf4j 配置...通过配置 Log4j2 的配置文件 log4j2.xml,我们可以定义不同的日志记录机制,例如输出到控制台、文件、数据库等。Slf4j 则提供了统一的日志记录接口,使得我们可以轻松地更换日志记录工具。

    slf4j+log4j需要的jar和配置文件

    在项目中,确保这些jar文件位于类路径下,并且正确配置了log4j配置文件,就可以通过SLF4J接口进行日志记录,而底层的日志输出则由Log4j处理。例如: ```java import org.slf4j.Logger; import org.slf4j....

    hibernate+slf4j+log4j+junit包

    Log4j提供了丰富的日志级别(DEBUG、INFO、WARN、ERROR、FATAL),并且支持自定义日志格式和输出目的地,如控制台、文件、数据库等。通过配置文件,可以方便地调整日志策略,满足不同环境的需求。 4. JUnit: ...

    Junit+log4j+slf4j

    "Junit+log4j+slf4j"这个组合涉及到的是Java编程领域的三个关键工具:JUnit用于进行单元测试,log4j是经典的日志记录库,而SLF4J(Simple Logging Facade for Java)则是一个日志抽象层。 JUnit是Java领域最广泛...

    slf4j-log4j12-1.7.7.jar下载

    SLF4J提供了一个抽象层,允许开发人员在不修改代码的情况下切换不同的日志框架,如Log4j、Logback等。而Log4j12则是Apache Log4j的第二个主要版本,它提供了丰富的日志记录功能和性能优化。 SLF4J的核心思想是引入...

    SLF4J+Log4J

    SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中常用的日志处理框架。SLF4J提供了一个抽象层,允许开发者在部署时插入所需的日志实现,比如Log4j、Logback等。这样做的好处是提高了代码的可移植性和...

    slf4j+log4j所需jar包(三个1.6版本)

    SLF4J提供了一个接口层,允许开发者在不改变代码的情况下切换不同的日志实现,比如Logback或Log4j。Log4j则是Apache组织的一个经典日志记录工具,提供了丰富的日志级别、灵活的日志配置以及多种输出格式。 在这个...

    tomcat8 slf4j+log4j2 写日志.zip

    2. **配置文件缺失或错误**:`log4j2.xml`是Log4j2的主要配置文件,定义了日志的级别、输出格式、目标等。检查`log4j2.xml`是否存在于类路径中,且配置是否正确。 3. **Tomcat的类加载器问题**:Tomcat有自己的类...

    日志 log4j-slf4j+logback1.3.0

    6. slf4j-log4j12.jar:SLF4J到Log4j的适配器,使得SLF4J的日志请求可以被Log4j处理。 总的来说,"log4j-slf4j+logback1.3.0"的组合提供了一个强大、灵活的日志解决方案,允许开发者使用统一的API进行日志记录,...

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

    此外,还可以通过配置文件(如log4j.properties或log4j.xml)自定义日志输出的位置、格式和文件大小限制,以满足不同的需求。 总结来说,Struts2框架结合SLF4J和Log4j1.5.8,为Java Web应用提供了强大的MVC架构和...

    日志框架统一输出控制(slf4j+log4j)

    SLF4J的核心概念包括Logger、Level和Marker,它们分别用于定义日志记录器、控制日志级别和标记特定的日志信息。 Log4j则是一个强大的、灵活的日志实现,它提供了丰富的配置选项,可以定制化地控制日志的输出格式、...

    Slf4j+log4j2.docx

    SLF4J(Simple Logging Facade for Java)是Java的日志抽象层,它提供了一种标准的接口,允许用户在不修改代码的情况下更换不同的日志框架,如Log4j、Logback等。Log4j2是Log4j的升级版,提供了更优秀的性能和更多的...

Global site tag (gtag.js) - Google Analytics