Log4j使用简记

日志是软件开发中不可缺少的部分,log4j是一个功能强大的日志组件,提供方便的日志记录功能。

官网:http://logging.apache.org/

Maven地址:http://mvnrepository.com/artifact/log4j/log4j

简单实例

1
2
3
4
5
6
7
8
9
10
11
12
public class BasicConfiguratorTest {
private static Logger logger= Logger.getLogger("BasicConfiguratorTest");
public static void main(String[] args){
BasicConfigurator.configure();
logger.debug("Hello world.");
}
}
/*
输出:
2016-09-01 17:37:40,140 - test - BasicConfiguratorTest DEBUG [main] - Hello world.
0 [main] DEBUG BasicConfiguratorTest - Hello world.
*/

如上所示,在应用中使用log4j的一般步骤如下:

  1. 配置log4j环境。Log4j提供多种配置方式,其中BasicConfigurator.configure()是最基础的一种。

  2. 对每个需要获取日志的类,通过Logger.getLogger方法和传递一个字符串(通常是该类的全名)获取一个Logger对象。该Logger对象通过被定义为static final。

    假如在包com.wombat下有一个类X,以下三种表达式都是可行相同的:

    Logger.getLogger(“com.wombat.x”);

    Logger.getLogger(X.class.getName());

    Logger.getLogger(X.class);

  1. 使用logger实例的输出方法,例如debug()、info()、warn()、error()和fatal()或者更通用的log()方法,在选定的设备上输出日志信息。

Log4j架构

Log4j包含三个主要的组件:loggers,appenders和layouts。这三个组件可以控制日志的级别,日志的输出目的地以及日志输出的格式。

Logger层次

Logger层次顶端的是root logger,它有三个特别的地方:

  1. root logger永远存在
  2. 它的level不能设为null
  3. 它不能通过名字获得

以下是常用的Logger类方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package org.apache.log4j;
public class Logger {
// Logger creation & retrieval methods:
public static Logger getRootLogger();
public static Logger getLogger(String name);
// printing methods:
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);
// printing methods for exceptions:
public void debug(Object message, Throwable t);
public void info(Object message, Throwable t);
public void warn(Object message, Throwable t);
public void error(Object message, Throwable t);
public void fatal(Object message, Throwable t);
// generic printing method:
public void log(Level p, Object message);
}

一般的logger(非root logger)可以通过getLogger(String name)方法获取,当第一次调用该方法时,它会自动生成一个实例。此外,不论在什么地方,相同name的获取结果都是同一个Logger实例。

Levels

Log4j提供了明了的日志等级供用户使用。

  • off:
  • fatal:很少使用,一般表示很严重的crash
  • error:经常使用,一般用于日志Java Exception
  • warn:常用于提示出现了小问题,例如缺少参数
  • info:常用于提示应用的重要结点
  • debug:
  • all:

Appenders

Appender决定了日志的目的地

  • ConsoleAppender(控制台)
  • FileAppender(文件)
  • DailyRollingFileAppender(每天产生一个日志文件)
  • RollingFileAppender(文件大小到达指定尺寸时产生一个新的文件)
  • WriteAppender(将日志信息以流格式发送到任意指定的地方)
  • JDBCAppender(将日志信息保存到数据库中)

Layouts

Layout决定了日志输出的格式

  • %c 输出日志信息所属的类的全名
  • %d 输出日志时间点的日期或时间,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2016-9-3 10:55:59
  • %f 输出日志信息所属的类的类名
  • %l 输出日志事件的发生位置,即输出日志信息的语句处于它所属类的第几行
  • %m 输出代码中指定的信息,如log(error)中的error
  • %n 输出一个回车换行符,具体符合当前操作系统回车换行符
  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  • %r 输出自应用启动到输出该日志信息所耗费的毫秒数
  • %t 输出产生该日志事件的线程名
  • %x 输出和当前线程相关的NDC(嵌套诊断环境)
  • %F 输出日志消息产生时所在的文件名称
  • %% 输出一个“%”字符

Log4j配置

  • Basic- Configurator.configure():该方法进行log4j的简单初始化,给root logger添加一个ConsoleAppender,同时PatternLayout设置为“%-4r [%t] %-5p %c %x - %m%n“,日志级别设置为debug。

  • PropertyConfigurator.configure ( String configFilename) :读取使用键值对编写的配置文件。

  • DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

实例

项目结构

ProjectStruct

测试代码

1
2
3
4
5
6
7
8
9
10
import org.apache.log4j.Logger;
public class Test {
private static Logger logger= Logger.getLogger(Test.class);
public static void main(String[] args){
logger.debug("This is a debug message.");
logger.info("This is a info message.");
logger.error("This is a error message.");
}
}

Log4j配置(Properties版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
log4j.rootLogger=debug,stdout,D,E
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method: %l%n%m%n
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=logs/debug.log
log4j.appender.D.Append=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=logs/error.log
log4j.appender.E.Append=true
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n

Log4j配置(XML版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d - test - %c %p [%t] %x - %m%n"/>
</layout>
</appender>
<appender name="D" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="logs/debug.log"/>
<param name="append" value="false"/>
<param name="threshold" value="debug"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n"/>
</layout>
</appender>
<appender name="E" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="logs/error.log"/>
<param name="append" value="false"/>
<param name="threshold" value="error"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n"/>
</layout>
</appender>
<logger name="e" additivity="true">
<level value="error"/>
<appender-ref ref="E"/>
</logger>
<logger name="d" additivity="true">
<level value="debug"/>
<appender-ref ref="D"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="stdout"/>
<appender-ref ref="D"/>
<appender-ref ref="E"/>
</root>
</log4j:configuration>

Maven配置

运行log4j需要引入log4j依赖包

1
2
3
4
5
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

测试结果

控制台输出:

1
2
3
2016-09-03 23:10:32,311 - test - com.zju.Test DEBUG [main] - This is a debug message.
2016-09-03 23:10:32,312 - test - com.zju.Test INFO [main] - This is a info message.
2016-09-03 23:10:32,312 - test - com.zju.Test ERROR [main] - This is a error message.

debug.log输出:

1
2
3
2016-09-03 23:10:32 [main:0] - [DEBUG] This is a debug message.
2016-09-03 23:10:32 [main:1] - [INFO] This is a info message.
2016-09-03 23:10:32 [main:1] - [ERROR] This is a error message.

error.log输出:

1
2016-09-03 23:10:32 [main:1] - [ERROR] This is a error message.