讨论组:
[email protected]
[email protected]
2
主页
http://jakarta.apache.org/log4j
3
使用:
3.1 配置Log4j
3.1.1
BasicConfigurator.configure();
3.1.2
log4j.properties
3.2 在类中创建 Logger.
HelloWorld.java
package cn.bisosft.component.log.log4j.demo; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Logger; public class HelloWorld { private static Logger logger = Logger.getLogger("cn.bisosft.component.log.log4j.demo.HelloWorld"); static public void main(String[] args) { BasicConfigurator.configure(); logger.debug("Hello world."); } }
3.3 使用logger 输出信息.
3.3.1 支持的方法:
debug()
info()
warn()
error()
fatal()
log()
4.
Log4j 架构
4.1 Log4j 包括三个组件:
Logger
Appender
Layout
4.2 Logger 层次体系结构
4.2.1 RootLogger 根记录器:
4.2.1.1 它总是存在, 可以通过
Logger.getRootLogger() 获取.
4.2.1.2 它的级别不能设置为空.
4.2.1.3 不能通过名字获取它.
4.2.2 所有其它 Logger 必须在所属类中通过 getLogger() 来获取实例.
4.2.3 Named Hierarchy Rule 层次命名规则(继承关系):
log4j.logger.cn.bisoft=DEBUG log4j.logger.cn.bisoft.component=DEBUG
上面的代码说明:
log4j.logger.cn.bisoft 是 父Logger,
log4j.logger.cn.bisoft.component 是 子Logger.
4.3
级别/优先级
优先级从低到高:
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF.
log() 可指定级别,输出消息
4.3.2
输出异常堆栈:
logger.debug(String msg, Throwable e)
logger.fatal(String msg, Throwable e)
logger.error(String msg, Throwable e)
logger.fatal(String msg, Throwable e)
常见错误:
很多人使用
logger.error(e) 或 logger.error(e.getMessage()), 这个不会 print 异常堆栈的, 应该使用
logger.error("exception information!", e)
e.getMessage() 这个方法最好不要使用, 它输出的信息是很少的, 不利于调试.
4.3.3 Logger 控制输出消息级别
rootLogger=INFO
x=NONE
x.y=DEBUG
x.y.z=NONE
则它的的影响范围:
rootLogger INFO
x INFO
x.y DEBUG
x.y.z DEBUG
注意: Logger 消息级别默认取自己的,若没有配置则向上(祖先/父亲)搜索第一个非空的Logger 的级别.
4.3.4 logger 过滤器
Logger 只会记录优先级 >= 当前级别的消息, 低于此级别的消息将 drop 掉.
4.3.4 Hierarchy-wide Threshold Filter 全局范围Logger过滤器
它的优先级高于所有的Logger, 是总开关.默认为ALL,不过滤任何消息.
设置:
LoggerRepository repository = x.getLoggerRepository(); // Set the hierarchy-wide threshold to WARN effectively disabling // all INFO and DEBUG requests. repository.setThreshold(Level.WARN);
5
Appender
表示输出目的地, 一个Logger 可以有多个目的地.
5.1
console
file
Swing component
remote socket server
JMS
NT Event Logger NT事件记录器
Remote UNIX Syslog daemon 远程UNIX系统日志守护进程
5.2
支持异步输出.
5.3
默认行为:
logger 获取自己的Appender及向上获取 所有 的Appender, 向他们发送消息.
5.4
Appender Additivity Rule: Appender的可加性规则
若 Logger 的父 Logger 的Additivity标志为 false, 则
logger 获取自己的Appender及向上获取直到遇到 父 Logger(包括父 Logger) 所有 的Appender, 向他们发送消息.
6
Layout
输出消息格式控制
PatternLayout
c 输出日志事件信息 C 输出完全限定类名 d 输出日期 p 输出日志级别 r 输出消息输出时间 t 输出线程名 F 输出文件名 l 输出调用信息 L 输出行号 m 输出消息 M 输出方法名 n 换行 x Outputs the NDC (nested diagnostic context) associated with the thread that generated the logging event. X Outputs the MDC (mapped diagnostic context) associated with the thread that generated the logging event. % %%输出% 填充: %20 左填充 %-20 右填充 裁剪: %.20 超过20个字符,从左边裁剪.
7
配置文件示例:
log4j.properties
################################################# # # Log4j 配置模板 # ################################################# # log4j.rootLogger=[level], [appenderName1, appenderName2, ...] # 配置RootLogger级别, 及Appender列表. log4j.rootCategory=DEBUG, CONSOLE, LOGFILE # log4j.threshold=[level] # 配置全局消息过滤器 log4j.threshold=ALL # 包消息级别 log4j.logger.org.hibernate=INFO log4j.logger.cn.bisoft=DEBUG log4j.logger.cn.bisoft.component=DEBUG # CONSOLE settings. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=ERROR log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{MM-dd HH:mm:ss.SSS} [%-5p] %c - %m%n # LOG FILE settings. log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.File=log/debug.log log4j.appender.LOGFILE.MaxFileSize=10MB log4j.appender.LOGFILE.MaxBackupIndex=5 log4j.appender.LOGFILE.File.DatePattern='.'yyyy-MM-dd-HH-mm-ss log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=[%d{mm:ss.SSS}] | %-5p | %-20C{1}.%-20M(L: %-4L) | %-50m | (%r ms)%n # 输出消息编码 log4j.appender.LOGFILE.encoding=UTF-8