2017-08-06-log4j-简介-日志等级-三种配置方式

我想念泉州的夏天了

基于log4j版本:1.2.17

1. Log4j

1.是什么能做什么

Log4j 是Apache为Java提供的日志管理工具。他与System.out.println()的作用相似,用来跟踪、调试、维护程序。 使用Log4j来打印这些测试代码,然后通过配置文件就能统一管理这些日志信息了!我们可以在配置文件中关闭所有日志,也可以在配置文件中打开所有日志,也可以打开某个级别的日志。甚至还可以管理日志出现的格式(是否加上日期和时间),以及日志输出的目标(是否为控制台,是否为文件)。

log4j就是使用日志器(Logger)将消息以指定终端(Appender)设定的格式(Layout)输出到指定终端(Appender),期间可以用日志等级(Level)设定输出日志的等级,用过滤器(Filter)过滤输出的日志。

  • 2.日志等级
  • 4.日志器
  • 5.Layout
  • 6.Appender
  • 7.Filter

2.日志等级

在Log4j中日志消息常用的五个级别,级别由高到低排列如下:

  • FATAL:重大错误,例如系统崩溃,不能再继续运行下去了。
  • ERROR:错误,例如某模块出错,例如除0错误,数据库连接错误等。
  • WARN:警告,程序的隐患,如果不处理,将来可能就是错误;
  • INFO:信息,可以用来查看程序执行的流程;开发环境用debug,生产环境用info以及更高,基本上在开发环境中查看一些信息都是使用info。
  • DEBUG:调试,用来调试程序的bug。用我老师的话,最好每个方法都打上debug日志。类似于Java抛异常时的堆栈信息,便于找错。

根据日志级别从高到低,设置了某一日志级别,低于这个级别的日志不会输出。比如设置基本为 Level.WARN,则INFO和DEBUG不会输出。

2.1 类图结构

http://image.linxingyang.net/image/L-log4j/image/2017-08-05/level.png

2.2 Priority

禁止使用该类,使用Level代替。

2.3 Level

Level中定义了OFF(Integer.MAX_VALUE),FATAL(50000),ERROR(40000),WARN(30000),INFO(20000),DEBUG(10000),TRACE(5000),ALL(Integer.MIN_VALUE)这么多个等级。

我们自己也可以自定义一些等级来供自己使用,因为最终判断是否打印日志是比较等级对应列的数值。

那为什么我们常用的就只有那5个呢?

个人理解是太多了也没必要,而且看Logger类中也是只提供了5个。。

3. 配置log4j初始化信息

那么如何使用Log4j呢?

  • 可以在代码中直接设置log4j属性来使用
  • 使用log4j.xml配置文件,放在类目录根路径下
  • 使用log4j.properties配置文件,实际常用这种,放在类目录根路径下

下面每种配置的都举个相同作用简单的例子,后面的例子大都是使用log4j.properties来举例。

3.1 代码中配置

这种的,其中用了PropertyConfigurator,也就等于使用log4j.properties类似的方式,只是此时配置信息不在log4j.properties文件中,而是直接写死在代码中。当然也可以有其他种方式来在代码中初始这个配置,不止这一种形式。


package testlog4j;

import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class TestInitLog4j {
	private static Logger log = Logger.getLogger(TestInitLog4j.class);

	public static void main(String[] args) {
		final Properties props = new Properties();
        props.setProperty("log4j.rootLogger", "debug,console");
        props.setProperty("log4j.appender.console","org.apache.log4j.ConsoleAppender");
        props.setProperty("log4j.appender.console.layout","org.apache.log4j.PatternLayout");
        props.setProperty("log4j.appender.console.layout.ConversionPattern","%d{yyyy-MM-dd HH:mm:ss} [%p] %m [%t] %c [%l]%n");
        PropertyConfigurator.configure(props);
        
        log.debug("aa");
        log.info("aa");
        log.warn("aa");
        log.error("aa");
        log.fatal("aa");
	}
}

3.2 log4j.properties配置方式

log4j.properties配置文件中的配置如下:


log4j.rootLogger=debug,console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} [%p] %m [%t] %c [%l]%n

程序中使用


package testlog4j;

import org.apache.log4j.Logger;

public class TestInitLog4j2 {
	private static Logger log = Logger.getLogger(TestInitLog4j2.class);
	public static void main(String[] args) {
		log.debug("aa");
        log.info("aa");
        log.warn("aa");
        log.error("aa");
        log.fatal("aa");
	}
}

测试结果就是运行打印出如上日志信息,略去。

3.3 log4j.xml配置方式

这里,如果想要代码自动提示,需要导入Log4j.dtd文件,该文件位于log4j源码包中log4j-1.2.17-src.zip\apache-log4j-1.2.17\src\main\resources\org\apache\log4j\xml文件夹下中。

将该文件解压出来。使用eclipse/myeclipse的preferences菜单,按照下图所示,输入xml进行搜索,然后点击xml Catalog,点击add,location即dtd文件的位置,key就是引用该dtd所使用的命名空间。

http://image.linxingyang.net/image/L-log4j/image/2017-08-05/importlog4jdtd.png

log4j.properties配置文件中的配置。


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="this is xml file %d{yyyy-MM-dd HH\:mm\:ss} [%p] %m [%t] %c [%l]%n"/>
		</layout>
	</appender>
	<root>
		<appender-ref ref="console"/>
		<level value="debug"></level>
	</root>
</log4j:configuration>

测试代码同上


package testlog4j;

import org.apache.log4j.Logger;

public class TestInitLog4j2 {
	private static Logger log = Logger.getLogger(TestInitLog4j2.class);
	public static void main(String[] args) {
		log.debug("aa");
        log.info("aa");
        log.warn("aa");
        log.error("aa");
        log.fatal("aa");
	}
}

测试结果就是运行打印出如上日志信息,略去。