记录日志之log4j

日志

tomcat在运行时,会在logs文件夹下生成以.log结尾的文件,该文件就是日志,通过这些日志信息可以快速的定位程序的问题。在一个完整的软件系统中,记录日志是必不可少的一个模块,因为要记录的日志可能会较多,因此该工作是System.out.println()无法完成的。
日志信息根据用途与记录内容的不同,分为调试日志、运行日志、异常日志等。
在java中用于记录日志的技术有很多,常用的有:

  • logger
  • log4j
  • log4j2
  • logback

其中除了logger使用的概率较小,因此主要介绍后面三个。

日志级别

为了方便日志信息的输出显示,对日志内容进行了分级管理。 日志级别由高到低 ,共分 6 个级别:

  • fatal(致命的)
  • error
  • warn
  • info
  • debug
  • trace(堆栈)

为什么要对日志进行分级呢?
将日志输出到控制台,或者写入到文件中,这些操作都会降低程序的运行效率。但由于开发需要、便于维护等原因,要将必要的日志信息记录,这时就需要在代码中加入记录日志的相关语句。假设在开发调试程序时需要记录日志信息,等到系统上线后这些信息就没必要记录了,此时需要将记录日志信息相关代码全部删除,这个过程费时费力。
将日志信息进行分级管理之后,便可方便的控制信息输出内容及输出位置,哪些信息需要输出,哪些信息不需要输出,只需在一个日志控制文件中稍加修改即可,不用修改代码中的内容。即在开发调试程序时,将日志信息级别设置低一些,这样输出的日志信息会非常多,当系统上线之后,将日志信息级别设置的高一些,此时只有少部分日志信息被记录。

log4j简介

log4j是apache旗下的项目,apache已经在2015年8月5日宣布log4j 1.x的版本已经不再更新了,最终版本是log4j 1.2.17的版本,推荐开发者使用log4j2,但是有些稍旧点的项目仍然在使用1.x的版本,所以这里先简单介绍下。
jar包的下载可以到其官网中下载:http://logging.apache.org/log4j/1.2/
百度网盘下载:http://pan.baidu.com/s/1kU4WZWz

为了控制日志的输出,在Log4j中提供了日志输出控制文件,该文件主要由三个部分构成:

  • 日志信息的输出位置:控制日志信息将要输出的位置,是控制台还是文件等。
  • 日志信息的输出格式:控制日志信息的显示格式,即以怎样的字符串形式显示。
  • 日志信息的输出级别:控制日志信息的显示内容,即显示哪些级别的日志信息。

有了日志输出控制文件,代码中只要设置好日志信息内容及其级别即可,通过控制文件
便可控制这些日志信息的输出了。

使用log4j记录日志

1.导入jar包
将log4j-1.2.17.zip文件解压后即可看到log4j-1.2.17.jar文件,将该jar包拷贝到项目中。

2.放入日志输出控制文件
在src目录下创建log4j.properties文件,将下面内容拷贝到文件中保存。

log4j.rootLogger=info,console

#控制台附加器
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

#文件附加器
log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.File = f:/monkey1024/monkey.log
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

#滚动文件附加器
log4j.appender.rollfile = org.apache.log4j.RollingFileAppender
log4j.appender.rollfile.File = f:/monkey1024/monkey.log
log4j.appender.rollfile.MaxFileSize = 10KB
log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

3.代码中实现日志记录

package com.monkey1024.test;

import org.apache.log4j.Logger;

/**
 * log4j
 *
 */
public class Log4jTest01 {

    public static void main(String[] args) {
        //创建记录日志的对象
        Logger log = Logger.getLogger(Log4jTest01.class);

        //下面语句会根据log4j.properties中的日志级别输出
        log.debug("debug信息");
        log.info("info信息");
        log.warn("warn信息");
        log.error("error信息");
    }

}

上面代码中的日志输出语句,会根据 log4j.properties 文件中日志级别的设置进行输出,会输出到指定位置。 其输出结果是:输出指定级别及其更高级别的信息。如指定 info 级别,则会输出 fatal、 error、 warn、 info 级别的信息。就本例而言,上面代码不会执行 debug()方法。

log4j.properties文件分析

日志属性文件 log4j.properties 是专门用于控制日志输出的。其主要进行三方面控制:

  • 输出位置:控制日志将要输出的位置,是控制台还是文件等。
  • 输出布局:控制日志信息的显示形式
  • 输出级别:控制要输出的日志级别。

日志属性文件由下面两个对象组成:

  • 根日志,即为 Java 代码中的日志记录器,可以控制日志输出级别与添加附加器。
  • 附加器,可以设置输出布局、文件位置、文件大小等内容。

定义日志附加器 appender
附加器的本质是一个接口,其定义语法为:

log4j.appender.appenderName =  输出位置

appenderName 为自定义名称。
输出位置为log4j 指定的类型,是定义好的一些 appender 接口的实现类。打开 log4j解压目录下的 site文件夹下的 index.html,在打开的页面中点击 JavaDoc,即可可看到 log4j 的 API。

在log4j.properties中编写如下配置:

log4j.appender.console = org.apache.log4j.ConsoleAppender

该配置的appender名字为console,类型是org.apache.log4j.ConsoleAppender即将日志输出到控制台。

常用的附加器实现类

  • org.apache.log4j.ConsoleAppender:日志输出到控制台
  • org.apache.log4j.FileAppender:日志输出到文件
  • org.apache.log4j.RollingFileAppender:当日志文件大小到达指定尺寸的时候将产生一个新的日志文件
  • org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件

通过上面附加器可以指定日志输出的位置。

修饰日志附加器
修饰日志附加器,是为定义好的附加器添加一些属性,以控制到指定位置的输出。不同的附加器,其修饰属性不同。

控制台附加器:

log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

Target:控制输出到控制台的使用目标。其值为 System.out 或 Sytem.err。它们的区别是,
System.out 是以黑色字体显示到控制台,而 System.err 则是以红色字体显示。

文件附加器:

log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.File = f:/monkey1024/monkey.log
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

log4j.appender.file.File:日志要输出的文件位置及文件名称。

滚动文件附加器:

log4j.appender.rollfile = org.apache.log4j.RollingFileAppender
log4j.appender.rollfile.File = f:/monkey1024/monkey.log
log4j.appender.rollfile.MaxFileSize = 10KB
log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

MaxFileSize:用于指定日志文件的最大值。若文件超过指定值,将自动产生另一个日志文件。

常用layout布局
在上面的配置文件中都出现了layout,该项可以配置日志的布局类型,常用的如下:

  • org.apache.log4j.HTMLLayout:网页布局,以 HTML 表格形式布局
  • org.apache.log4j.SimpleLayout:简单布局,包含日志信息的级别和信息字符串
  • org.apache.log4j.PatternLayout:匹配器布局,可以灵活地指定布局模式。其主要是通过设置 PatternLayout 的 ConversionPattern 属性值来控制具体输出格式的。ConversionPattern 的值中有很多控制字符,这些字符的意义可以百度:ConversionPattern取值说明。

配置根Logger
配置 rootLogger,以便于代码加载来控制日志的输出。其语法为:

log4j.rootLogger = [ level ] , appenderName1,appenderName2, …

其中,level 是日志记录的优先级,分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。OFF 为关闭日志功能。
低级别的可以显示高级别的,但高级别的不能显示低级别的。所以,级别越高,将来显示的信息就越少。

例如:

log4j.rootLogger=info,console,file

#控制台附加器
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

#文件附加器
log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.File = f:/monkey1024/monkey.log
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n