日志是软件开发中不可缺少的部分,log4j是一个功能强大的日志组件,提供方便的日志记录功能。
Maven地址:mvnrepository.com/artifact/lo…
简单实例
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的一般步骤如下:
-
配置log4j环境。Log4j提供多种配置方式,其中BasicConfigurator.configure()是最基础的一种。
-
对每个需要获取日志的类,通过Logger.getLogger方法和传递一个字符串(通常是该类的全名)获取一个Logger对象。该Logger对象通过被定义为static final。
假如在包com.wombat下有一个类X,以下三种表达式都是可行相同的:
Logger.getLogger(“com.wombat.x”);
Logger.getLogger(X.class.getName());
Logger.getLogger(X.class);
- 使用logger实例的输出方法,例如debug()、info()、warn()、error()和fatal()或者更通用的log()方法,在选定的设备上输出日志信息。
Log4j架构
Log4j包含三个主要的组件:loggers,appenders和layouts。这三个组件可以控制日志的级别,日志的输出目的地以及日志输出的格式。
Logger层次
Logger层次顶端的是root logger,它有三个特别的地方:
- root logger永远存在
- 它的level不能设为null
- 它不能通过名字获得
以下是常用的Logger类方法:
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形式的配置文件。
实例
项目结构
测试代码
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版)
log4j.rootLogger=debug,stdout,D,Elog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method: %l%n%m%nlog4j.appender.D=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File=logs/debug.loglog4j.appender.D.Append=truelog4j.appender.D.Threshold=DEBUGlog4j.appender.D.layout=org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%nlog4j.appender.E=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File=logs/error.loglog4j.appender.E.Append=truelog4j.appender.E.Threshold=ERRORlog4j.appender.E.layout=org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
Log4j配置(XML版)
<?xml version="1.0" encoding="UTF-8" ?><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依赖包
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>
测试结果
控制台输出:
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输出:
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输出:
2016-09-03 23:10:32 [main:1] - [ERROR] This is a error message.