Logger - 日志写出器,供程序员输出日志信息
Appender - 日志目的地,把格式化好的日志信息输出到指定的地方去
ConsoleAppender - 目的地为控制台的Appender
FileAppender - 目的地为文件的Appender
RollingFileAppender - 目的地为大小受限的文件的Appender
Layout - 日志格式化器,用来把程序员的logging request格式化成字符串
PatternLayout - 用指定的pattern格式化logging request的Layout
日志级别
每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warm 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。
上面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是 error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用了info级别,则应用程 序中所有低于info级别的日志信息(如debug)将不会被打印出来。
(二)源码解析
基本步骤:
1、LogManager类对log4j.xml或者log4j.properties文件进行解析(xml文件优先,若存在xml文件则不对properties文件进行解析)
2、逐个解析配置文件中的logger对象,并将这些对象放入一个Hierarchy的实例中(Hierarchy类中定义了一个hashtable来存储所有的logger)
a、取得RootLogger
b、取得RootLogger对应的Appender (必须在配置文件中指明rootLogger的Appender)
c、取得Appender的Layout,将Layout追加到Appender中
d、将Appender追加到RootLogger中
e、将RootLogger添加进Hierarchy中
f、依照上面abcde的步骤将其他logger添加进Hierarchy中
3、通过LogManager.getLogger(String name)或LogManager.getLogger(Class clazz)获取获取到指定的logger对象(事实上,传递进去的clazz也会被转换为字符串,不过要加上它的包名,如Test.Class-->com.test.Test)
a、通过传递进来的参数,判断Hierarchy中是否已经含有此logger;(通过hashtable.get(key)获取再判断)
b、若该logger已经存在于Hierarchy中则将Hierarchy的logger返回
c、通过new Logger(String name)或new Logger(Class clazz)创建一个新的logger,设置这个logger的parent属性,将此对象放入Hiera