Log4j 日志框架入门

阅读更多
1
讨论组:
[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

















你可能感兴趣的:(log4j)