Logging的基本概念
1 Logging是一个调试程序最基本的方法。
2 Logging可以被当作一个审计工具。
那么,Logging和我们熟悉的Debugging(调试工具)相比较,有什么不同呢?
1 Debugger在多线程和分布式的环境中并不总是可用的。
2 Debugger的信息是临时的,而Logging记录下来的信息是永久的。
但是Logging也有自己的缺点:
1 Logging会影响程序的性能,降低程序的执行速度。
2 需要在程序中编写额外的代码记录相关的信息。
3 如果输出的日志信息很多,从中间找到这些信息也是非常困难的。
Logging库所应该具备的基本功能
1 控制logging语句何时生效和何时失效。
2 控制logging的输出位置。
3 控制logging的输出格式。
最重要的,以上3种功能,我们希望能够通过配置文件以及代码等形式进行灵活,方便的控制。
Log4j的实现
在log4j的实现中,有3个核心的类分别实现了上面所提到的logging库应该具备的基本功能。
他们分别是Logger,Appender和Layout。
本文来自 博客园 逖靖寒 http://gpcuster.cnblogs.com
Logger
Loggers 是通过名称来区别的,并且通过名称可以构成一个继承关系。
比如:叫“com.foo.bar”的logger继承于叫“com.foo”的logger,叫“com.foo”的logger继承于叫“com”的logger。
Loggers 可以设置输出log的level. 这些level分别是: DEBUG, INFO, WARN, ERROR 和 FATAL 。
1 如果一个logger没有设置level, 那么他将继承上一级logger的level.
2 root logger 在所有logger的顶层. 他将一直存在并且有一个指定的level.
关于Logger输出level继承的例子:
Logger |
Assigned |
Inherited |
---|---|---|
root |
Proot |
Proot |
X |
none |
Proot |
X.Y |
none |
Proot |
X.Y.Z |
none |
Proot |
Example 1
Logger |
Assigned |
Inherited |
---|---|---|
root |
Proot |
Proot |
X |
Px |
Px |
X.Y |
Pxy |
Pxy |
X.Y.Z |
Pxyz |
Pxyz |
Example 2
Logger |
Assigned |
Inherited |
---|---|---|
root |
Proot |
Proot |
X |
Px |
Px |
X.Y |
none |
Px |
X.Y.Z |
Pxyz |
Pxyz |
Example 3
Logger |
Assigned |
Inherited |
---|---|---|
root |
Proot |
Proot |
X |
Px |
Px |
X.Y |
none |
Px |
X.Y.Z |
none |
Px |
Example 4
本文来自 博客园 逖靖寒 http://gpcuster.cnblogs.com
Appender
logging的输出位置由 Appenders来控制。log4j中的实现的 Appenders 可以输出到 console, files, Unix syslog, JMS, NT Event log, SMTP等等。
1 多个appenders可以同时作用于1个或多个logger。
2 appender继承上一级logger的所有appender。
3 Appender可以通过 additive属性来控制继承关系.
关于Appender继承的例子:
Logger |
Added |
Additivity |
Output Targets |
Comment |
---|---|---|---|---|
root |
A1 |
not applicable |
A1 |
The root logger does not have a parent. |
x |
A-x1, A-x2 |
true |
A1, A-x1, A-x2 |
Appenders in root are added to appenders in "x". |
x.y |
none |
true |
A1, A-x1, A-x2 |
Appenders of "x" and root. |
x.y.z |
A-xyz1 |
true |
A1, A-x1, A-x2, A-xyz1 |
Appenders in "x.y.z", "x" and root. |
security |
A-sec |
false |
A-sec |
No appender accumulation as the additivity flag is set to false. |
security.ACL |
none |
true |
A-sec |
Only appenders of "security" as the additivity flag in "security" is set to false. |
本文来自 博客园 逖靖寒 http://gpcuster.cnblogs.com
Layout
用户可以通过 Layout来控制输出到Appender上的日志的格式。
1 The PatternLayout 可是指定用户需要的格式以及输出的内容来输出.
2 Logging的输出也可以被表示为HTML或XML的格式.
3 我们也可以定义一个ObjectRenderer 来对输出的对象进行输出。
Configuration
1 Log4j 的配置支持程序代码控制和配置文件。
2 配置文件可以表示为 key=value的格式或者是xml的格式。
参考文章:
本文来自 博客园 逖靖寒 http://gpcuster.cnblogs.com