2017-08-06-log4j-简介、日志等级、三种配置方式
2017-08-07-log4-logger日志器
2017-08-08-log4j-Layout布局
2017-08-09-log4j-Appender;
2017-08-10-log4-Filter
1. Log4j
基于log4j版本:1.2.17
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 类图结构
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所使用的命名空间。
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");
}
}
测试结果就是运行打印出如上日志信息,略去。