Java日志详解 一 Log4j

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/paditang/article/details/78871164

引言

​ 日志作为项目中最基本的一部分,其重要性不言而喻。当项目运行在服务器上,不通过日志来反馈其运行状态的话,我们无从得知在运行期间运行状况如何。异常的发生后,如果没有日志将不知道如何解决。

​ 那么重要性就提到这儿,接下来介绍Log4jLogback两种常用的日志框架和配置详细,希望会为笔者以及读者有一定帮助。在日常配置中有据可依而不是重复的复制粘贴。

正文

简介

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

以上来源于百度百科,相信这些内容可能大家都有所了解,那么就直接进入简易的配置环节。

Log4j配置步骤

  1. 添加log4j的jar包到项目中

  2. 在classpath中添加log4j.properties

  3. 配置文件详情

    log4j.rootLogger=INFO, CONSOLE,FILE
    
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.Threshold=INFO
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=[%p] %m%n
    
    
    log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.FILE.Threshold=WARN
    log4j.appender.FILE.Append=true
    log4j.appender.FILE.File=D:/test/log/test/demo.log
    log4j.appender.FILE.DatePattern='.'yyyy-MM-dd'.log'
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILE.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n
  4. 测试代码

    public class Log4jDemo {
    
    private static final Logger log = Logger.getLogger(Log4jDemo.class);
    
    public static void main(String[] args){
        log.debug("debug msg");
        log.info("info msg");
        log.warn("warn msg");
        log.error("error msg");
        log.fatal("fatal msg");
    }
    }
    // 控制台输出
      [INFO] info msg
      [WARN] warn msg
      [ERROR] error msg
      [FATAL] fatal msg
      // 文件输出
      2017-12-22 09:30:48,168 [main] WARN  com.paditang.demo.Log4jDemo  - warn msg
      2017-12-22 09:30:48,168 [main] ERROR com.paditang.demo.Log4jDemo  - error msg
      2017-12-22 09:30:48,168 [main] FATAL com.paditang.demo.Log4jDemo  - fatal msg

配置详解

​ 看完以上配置和测试代码,接下来详细介绍配置的细节,以帮助理解配置的原因以及输出的结果。

​ Log4j配置主要分为三大组件:rootLogger,appender,Layout。这三个组件决定了日志格式和输出形式。

  1. rootLogger:

    首先是一个细节,有关使用rootLogger和rootCategory的问题:

    This observation had previously led us to choose category as the central concept of the package. However, since log4j version 1.2, Logger class has replaced the Category class. For those familiar with earlier versions of log4j, the Logger class can be considered as a mere alias to the Category class.

    以上文字来源于Log4j官网,大致意思就是从1.2版本后使用rootLogger替代了rootCategory,但是这两种表达方式都支持。所以不用疑惑于到底使用哪一种了。

    
    # [LEVEL],appenderName1,appenderName2
    
    log4j.rootLogger=INFO, CONSOLE,FILE

    首先要介绍Log4j中的日志记录级别LEVEL: FATAL > ERROR > WARN > INFO > DEBUG

    而以上LEVEL填入的日志级别 INFO,代表全局INFO以下的日志将不会显示记录。

    后面填写的appenderName将是要配置的输出名称,在后面部分继续配置。

  2. appender:

    Log4j允许日志打印到多种日志目的地下,而这在Log4j中被称为appender。目前,appender可以提供控制台输出,文件输出,GUI组件,套接口服务器、NT的事件记录器、UNIX Syslog守护进程。而我们常用的主要有如下几种:

    • org.apache.log4j.ConsoleAppender(控制台输出)
    • org.apache.log4j.FileAppender(文件输出)
    • org.apache.log4j.DailyRollingFileAppender(周期产生一个日志文件)
    • org.apache.log4j.WriterAppender(以流的形式输入日志)

    以上述两种配置为例:

    控制台输出

    
    # appender类型
    
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    
    # appender的日志输出阀值,低于INFO级别均不输出
    
    log4j.appender.CONSOLE.Threshold=INFO
    
    # 输出格式均是同一类,下文介绍
    
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=[%p] %m%n

    周期生成日志文件输出

    
    # 日志appender类型
    
    log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
    
    # 日志输出阀值
    
    log4j.appender.FILE.Threshold=WARN
    
    # 新日志添加或是覆盖,如果为true则是添加的文末,false为覆盖旧文件
    
    log4j.appender.FILE.Append=true
    
    # 指定输出路径,linux系统可以使用环境变量${path}表达,window环境不可以。可以使用系统变量代替
    
    log4j.appender.FILE.File=D:/test/log/test/demo.log
    
    # 表示每日生成一个日志
    
    
    # 其他格式
    
    
    # '.'yyyy-MM:每月
    
    
    # '.'yyyy-ww:每周
    
    
    # '.'yyyy-MM-dd:每天
    
    
    # '.'yyyy-MM-dd-a:每天两次
    
    
    # '.'yyyy-MM-dd-HH:每小时
    
    
    # '.'yyyy-MM-dd-HH-mm:每分钟
    
    log4j.appender.FILE.DatePattern='.'yyyy-MM-dd'.log'
  3. Layout:

    Layout关于配置日志的输出格式,常用布局如下:

    • org.apache.log4j.HTMLLayout(以HTML表格形式布局)
    • org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
    • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

    常用主要以PatternLayout为主,接下来是配置的格式说明:

    %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
    %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
    %r:输出自应用程序启动到输出该log信息耗费的毫秒数。
    %t:输出产生该日志事件的线程名。
    %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
    %c:输出日志信息所属的类目,通常就是所在类的全名。
    %M:输出产生日志信息的方法名。
    %F:输出日志消息产生时所在的文件名称。
    %L::输出代码中的行号。
    %m::输出代码中指定的具体日志信息。
    %n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。
    %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    %%:输出一个"%"字符。

上文三大组件是配置时常用的模块,常规使用条件下全局的日志输出都可以控制。但是如果需要定制化配置某个类或者某个功能的独立输出,那么就需要用到以下的配置:

log4j.logger.com.paditang.demo.Log4jSpecialDemo=ERROR,SPECIAL
log4j.appender.SPECIAL=org.apache.log4j.FileAppender
log4j.appender.SPECIAL.Append=true
log4j.appender.SPECIAL.File=D:/test/log/test/special.log
log4j.appender.SPECIAL.layout=org.apache.log4j.PatternLayout
log4j.appender.SPECIAL.layout.ConversionPattern=%d %p [%c] - %m%n
public class Log4jSpecialDemo {

    private static final Logger log = Logger.getLogger(Log4jSpecialDemo.class);

    public static void main(String[] args){
        log.debug("debug msg");
        log.info("info msg");
        log.warn("warn msg");
        log.error("error msg");
        log.fatal("fatal msg");
    }
}
// 文件输出
2017-12-22 10:55:28,463 ERROR [com.paditang.demo.Log4jSpecialDemo] - error msg
2017-12-22 10:55:28,463 FATAL [com.paditang.demo.Log4jSpecialDemo] - fatal msg

结语

​ 通过上文的配置信息和配置详解,可以看出如果了解了log4j的所有细节之后,配置一个日志输出还是非常简单的。希望通过这篇文章能对读者有所帮助,如有错误,希望不吝指教。

源码

日志框架Demo源码

参考文章

Log4J日志配置详解

Log4J官网文档

猜你喜欢

转载自blog.csdn.net/paditang/article/details/78871164