在查看PatternLayout的javadoc时,我注意到它推荐使用EnhancedPatternLayout而不是PatternLayout。然而,它们似乎做的事情差不多。
它们的主要区别是什么,特别是我需要注意哪些区别?
我还想知道为什么他们创建了一个单独的类而不是增强原有的类。是否有语法上的差异?
在查看PatternLayout的javadoc时,我注意到它推荐使用EnhancedPatternLayout而不是PatternLayout。然而,它们似乎做的事情差不多。
它们的主要区别是什么,特别是我需要注意哪些区别?
我还想知道为什么他们创建了一个单独的类而不是增强原有的类。是否有语法上的差异?
sbuf
的成员字段,它会对其进行修改,而EnhancedPatternLayout使用一个私有的StringBuffer实例。这意味着,在并发调用期间,PatternLayout.format()调用容易出现数据竞争,而EnhancedPatternLayout.format()调用则不会。PatternLayout
的字段SB访问会导致一些真正的问题还有点神秘 - 因为调用已经在AppenderSkeleton.doAppend()
方法中进行了synchronized
- (例如,参见log4j 1.2.17的源代码)。因此,EnhancedPatternLayout
似乎带来了不必要的GC使用增加。而我在使用PatternLayout
时从未看到过日志输出出现错误/混合的情况... - Petr BodnárEnhancedPatternLayout
是PatternLayout
的升级版,应该优先使用它(除了为与PatternLayout
兼容而使用PatternLayout
)。PatternLayout存在一些问题,这些问题在EnhancedPatternLayout中不存在,特别是在同步方面。EnhancedPatternLayout
中有一些额外的转换字符,而在PatternLayout中是不可用的。否则看起来它们是相同的。我不是Java专家,所以您可以通过比较两个文档页面和/或源代码自行检查。 - Çağdaş Bozman我对这两个 HTML 页面进行了比较。
以下是我认为的主要区别:介绍和两个新的“转换字符”:%properties
和 %throwable
我已经重新格式化了文本以便阅读。
这个类是
org.apache.log4j.PatternLayout
的增强版本,最初是作为废弃的 log4j 1.3 努力的一部分开发的,并且已经在 extras companion 中提供。应该优先使用此模式布局而不是
org.apache.log4j.PatternLayout
,除非兼容性问题,其中PatternLayout
已通过子类扩展或替代模式解析器。
%properties
%properties{application}
,其中“application”是该键。将输出与键对应的Properties捆绑包中的值。
如果没有指定其他子选项,则使用格式{{key1,val1},{key2,val2}}
输出Properties键值对集合的全部内容。
%throwable
(为了易读性重新格式化)
用于输出已绑定到
LoggingEvent
的 Throwable 跟踪, 默认情况下,这将输出与调用Throwable.printStackTrace()
通常找到的完整跟踪一样。
%throwable{short}
或%throwable{1}
将输出堆栈跟踪的第一行。throwable{none}
或throwable{0}
将抑制堆栈跟踪。%throwable{n}
如果是正整数,则输出n
行堆栈跟踪,如果是负整数,则省略最后的-n
行。- 如果未指定
%throwable
模式,则 appender 将负责按其自己的方式输出堆栈跟踪。