一、简介

1、简介

Log4j是Apache的一个开源项目,开发人员可以使用Log4j控制日志的输出,输出的位置可以是控制台、文件、邮件和数据库等;它有三个主要的组件:Layouts(输出样式)、Appenders(输出位置)和Loggers(优先级)来处理日志的输出格式、输出位置和优先级。

2、优势

使用Log4j之前,通常是使用System.out方式实现日志的输出,但此种方式不能制定日志的优先级,例如:开发时需要某些日志但在上线后不需要。另外:System.out方式只能输出到控制台或文件,不能输出到其他地方,而且不能随意设置日志的输出格式。

二、输出格式与样式(Layouts)

1、输出样式

Layouts提供了4种日志输出样式:

  • HTML样式
org.apache.log4j.HTMLLayout
  • 自定义样式
org.apache.log4j.PatternLayout
  • 包含日志级别与信息的样式
org.apache.log4j.SimpleLayout
  • 包含日志时间、线程、类别等信息的样式
org.apache.log4j.TTCCLayout

2、输出格式

Log4j使用类似C语言中printf函数的打印格式格式化日志信息,打印参数如下:

  • %m

输出代码中指定的日志信息(log.info("xxx"))。

  • %p

    输出优先级,即DEBUG、INFO、WARN、ERROR和FATAL。

    %-5p

    由于优先级的字母长度不一致,使用此配置是为了在输出结果中对齐;%-5p是使输出的优先级文字左对齐、右边填充空格,%5p是使文字右对齐、左边填充空格:

    • log4j.appender.myAppender.layout.ConversionPattern = [%p] %l %n

    • log4j.appender.myAppender.layout.ConversionPattern = [%-5p] %l %n

    • log4j.appender.myAppender.layout.ConversionPattern = [%5p] %l %n

  • %r

输出自应用启动到输出该Log信息耗费的毫秒数。

  • %c

输出所属的类名。

  • %t

输出产生日志事件的线程名。

  • %n

输出一个回车换行符。

  • %d

输出日志时间点的日期或时间,默认格式为:yyyy-MM-dd。也可以在其后指定格式,例如:%d{yyyy MM dd HH:mm:ss,SSS}。

  • %l

输出日志的发生位置,包括类名、发生的线程以及在代码中的行数(com.log.MyApp.main(MyApp.java:19))。

三、输出位置(Appenders)

Log4j定义了很多种输出位置的方式:

  • 将日志输出到控制台
org.apache.log4j.ConsoleAppender
  • 将日志信息以流格式输出到任意位置
org.apache.log4j.WriterAppender
  • 将日志输出到文件
org.apache.log4j.FileAppender
  • 日志文件达到指定大小时产生新文件
org.apache.log4j.RollingFileAppender
  • 每天输出(产生)一个日志文件
org.apache.log4j.DailyRollingFileAppender
  • 将日志输出到数据库
org.apache.log4j.jdbc.JDBCAppender
  • 将日志发送至邮件
org.apache.log4j.net.SMTPAppender

四、优先级

Log4j可以自定义日志的输出级别,从低到高依次为:TRACE、DEBUG、INFO、WARN、ERROR和FATAL,这些级别分别用来指定输出日志的重要程度:如果定义了输出的级别为WARN,则只有等于或高于这个级别的日志才能输出。

五、配置

Log4j有两种定义方式:一种是使用XML,另一种是使用Properties。

1、XML

src/log4j.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
	<appender name="myAppender" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
		</layout>
	</appender>
	<root>
		<priority value="debug" />
		<appender-ref ref="myAppender" />
	</root>
</log4j:configuration>

2、Properties

  • 指定日志优先级和输出位置

日志优先级(level)和输出位置(appender)的配置格式:

log4j.rootLogger = LEVEL, appenderName, ...

示例:

log4j.rootLogger = debug, myAppender
  • 配置输出位置

格式:

log4j.appender.appenderName = appender类路径全名
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.optionN = valueN

示例:

log4j.appender.myAppender = org.apache.log4j.ConsoleAppender
log4j.appender.myAppender.Target = System.err
  • 配置输出格式

格式:

log4j.appender.appenderName.layout = layout类路径全名
log4j.appender.appenderName.layout.option1 = value1
......
log4j.appender.appenderName.layout.optionN = valueN

示例:

log4j.appender.myAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.myAppender.layout.ConversionPattern = [%-5p] %d{yyy-MM-dd HH:mm:ss} Method:%l%n\t%m%n

六、示例

1、将日志输出到控制台

log4j.rootLogger = DEBUG, myAppender

log4j.appender.myAppender=org.apache.log4j.ConsoleAppender
log4j.appender.myAppender.Threshold=DEBUG
log4j.appender.myAppender.Target=System.out
log4j.appender.myAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppender.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} %c - %m%n
#log4j.appender.myAppender.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

或更简洁的:

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

2、将日志输出到文件

log4j.rootLogger = DEBUG, fileAppender

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

3、日志文件达到指定大小时产生新文件

log4j.rootLogger = DEBUG, myAppender

log4j.appender.myAppender=org.apache.log4j.RollingFileAppender
log4j.appender.myAppender.File=G:/log/file.log
log4j.appender.myAppender.MaxFileSize=500KB
log4j.appender.myAppender.MaxBackupIndex=50
log4j.appender.myAppender.Append=true
log4j.appender.myAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppender.layout.ConversionPattern=%d{ISO8601}-[%-5p][%C{1}]-%m%n

file.log文件大于500KB时会自动备份为类似file.log1的文件,最新的日志信息仍在file.log文件中。

4、将日志输出到数据库

log4j.rootLogger = DEBUG, dbAppender

log4j.appender.dbAppender=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.dbAppender.URL=jdbc:mysql://localhost:3306/test
log4j.appender.dbAppender.driver=com.mysql.jdbc.Driver
log4j.appender.dbAppender.user=root
log4j.appender.dbAppender.password=666666
log4j.appender.dbAppender.sql=INSERT INTO APPLOG(info) VALUES('%d{ISO8601}-[%p][%C{1}]-%m%n')
log4j.appender.dbAppender.layout=org.apache.log4j.PatternLayout

依赖:mysql-connector-java.jar

5、将日志发送至邮件

log4j.rootLogger = DEBUG, mailAppender

log4j.appender.mailAppender=org.apache.log4j.net.SMTPAppender
log4j.appender.mailAppender.Threshold=FATAL
log4j.appender.mailAppender.BufferSize=10
log4j.appender.mailAppender.SMTPHost=mail.163.com
log4j.appender.mailAppender.Subject=Log4J-Message
log4j.appender.mailAppender.From=sender@163.com
log4j.appender.mailAppender.SMTPUsername=sender@163.com
log4j.appender.mailAppender.SMTPPassword=Authorization Code
log4j.appender.mailAppender.To=toUser@163.com
log4j.appender.mailAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.mailAppender.layout.ConversionPattern=%d{ISO8601}-[%p][%C{1}]-%m%n

依赖:mail.jar

配置文件中的SMTPPassword为授权码;

通常在log4j.rootLogger中指定通用的日志输出级别;Threshold属性指定特殊级别的输出方式(前提是rootLogger中的级别小于Threshold中的级别)。

七、使用

1、下载log4j

下载log4j-1.2.17.jar

2、记录日志

  • 获取日志记录器对象

在XML或Properties文件中配置完日志的输出位置、输出格式、优先级等之后,就可以在程序中获取Logger对象记录日志信息。

API:

public static Logger getLogger(String name)
public static Logger getLogger(Class clazz)

示例:

Logger logger = LogManager.getLogger(MyApp.class);
  • 指定(读取)配置文件

    • 使用log4j默认配置:
      BasicConfigurator.configure();
    
    • 指定properties文件:
      PropertyConfigurator.configure("xxx/yyy.properties");
    
    • 指定XML文件:
      DOMConfigurator.configure("xxx/yyy.xml");
    
  • 记录日志信息

API:

public void debug(Object message)
public void debug(Object message, Throwable t)

public void error(Object message)
public void error(Object message, Throwable t)

public void info(Object message)
public void info(Object message, Throwable t)
......

3、样例

  • 配置文件

log4j.properties

log4j.rootLogger = debug, myAppender

log4j.appender.myAppender = org.apache.log4j.ConsoleAppender
log4j.appender.myAppender.Target = System.out
log4j.appender.myAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.myAppender.layout.ConversionPattern = [%-5p] %d{yyy-MM-dd HH:mm:ss} Method:%l%n\t%m%n
  • Java代码
public class Foo {

	public boolean doIt(int num){
		return num % 3 == 0;
	}
}


public class MyApp {

	private static final Logger logger = LogManager.getLogger(MyApp.class);
	
	public static void main(String[] args) {
		logger.debug("Entering application.");
		Foo foo = new Foo();
		if(foo.doIt(3)){
			logger.info("Just do it!");
		}else{
			logger.error("Didn't do it.");
		}
		logger.debug("Exiting application.");
	}
}

运行MyApp.main(),输出:

[DEBUG] 2013-01-29 21:43:32 Method:com.log.MyApp.main(MyApp.java:19)
	Entering application.
[INFO ] 2013-01-29 21:43:32 Method:com.log.MyApp.main(MyApp.java:22)
	Just do it!
[DEBUG] 2013-01-29 21:43:32 Method:com.log.MyApp.main(MyApp.java:26)
	Exiting application.
附:

Apache Log4j

Maven Repository: Log4j