EnhancedPatternLayout和PatternLayout有哪些主要区别?

9

在查看PatternLayout的javadoc时,我注意到它推荐使用EnhancedPatternLayout而不是PatternLayout。然而,它们似乎做的事情差不多。

它们的主要区别是什么,特别是我需要注意哪些区别?

我还想知道为什么他们创建了一个单独的类而不是增强原有的类。是否有语法上的差异?


1
至少有一个主要的区别是对时区的支持 - 请参见https://dev59.com/5XI-5IYBdhLWcg3wlpQM。 - B5A7
4个回答

2
PatternLayoutEnhancedPatternLayout的主要区别在于format()方法。PatternLayout依赖于一个名为sbuf的成员字段,它会对其进行修改,而EnhancedPatternLayout使用一个私有的StringBuffer实例。这意味着,在并发调用期间,PatternLayout.format()调用容易出现数据竞争,而EnhancedPatternLayout.format()调用则不会。

是的。不过,在什么情况下PatternLayout的字段SB访问会导致一些真正的问题还有点神秘 - 因为调用已经在AppenderSkeleton.doAppend()方法中进行了synchronized - (例如,参见log4j 1.2.17的源代码)。因此,EnhancedPatternLayout似乎带来了不必要的GC使用增加。而我在使用PatternLayout时从未看到过日志输出出现错误/混合的情况... - Petr Bodnár
如果调用总是同步的,将布局类中的StringBuffer转换为StringBuilder可能会带来一些好处。我猜在所有场景中,append调用并不能保证同步? - shams
好的,这正是问题所在——当调用不能保证同步时......关于StringBuilder,Log4j库不能使用此类,因为它需要兼容他们支持的旧版本Java... - Petr Bodnár

2
请查看文档,里面对一切进行了解释。 EnhancedPatternLayoutPatternLayout的升级版,应该优先使用它(除了为与PatternLayout兼容而使用PatternLayout)。PatternLayout存在一些问题,这些问题在EnhancedPatternLayout中不存在,特别是在同步方面。

9
我之所以问这个问题,正是因为我已经查过文档,但没有任何解释。是的,它被增强了,我也可以从名称中看出来,但是增强了怎样 - aditsu quit because SE is EVIL
1
那意味着EnhancedPatternLayout只有内部变化,但使用方式完全相同? - aditsu quit because SE is EVIL
2
几乎可以说,在EnhancedPatternLayout中有一些额外的转换字符,而在PatternLayout中是不可用的。否则看起来它们是相同的。我不是Java专家,所以您可以通过比较两个文档页面和/或源代码自行检查。 - Çağdaş Bozman

0
EnhancedPatternLayout将结果格式化为StringBuffer,而PatternLayout将结果格式化为String。

0

我对这两个 HTML 页面进行了比较。

以下是我认为的主要区别:介绍和两个新的“转换字符”:%properties%throwable

我已经重新格式化了文本以便阅读。

1. 介绍

这个类是 org.apache.log4j.PatternLayout 的增强版本,最初是作为废弃的 log4j 1.3 努力的一部分开发的,并且已经在 extras companion 中提供。

应该优先使用此模式布局而不是 org.apache.log4j.PatternLayout,除非兼容性问题,其中 PatternLayout 已通过子类扩展或替代模式解析器。

2. %properties

用于输出与日志事件关联的属性。
“properties”转换词后面可以跟随放置在大括号之间的映射键,例如%properties{application},其中“application”是该键。将输出与键对应的Properties捆绑包中的值。 如果没有指定其他子选项,则使用格式{{key1,val1},{key2,val2}}输出Properties键值对集合的全部内容。

3.%throwable

(为了易读性重新格式化)

用于输出已绑定到 LoggingEvent 的 Throwable 跟踪, 默认情况下,这将输出与调用 Throwable.printStackTrace() 通常找到的完整跟踪一样。

  • %throwable{short}%throwable{1} 将输出堆栈跟踪的第一行。
  • throwable{none}throwable{0} 将抑制堆栈跟踪。
  • %throwable{n} 如果是正整数,则输出 n 行堆栈跟踪,如果是负整数,则省略最后的 -n 行。
  • 如果未指定 %throwable 模式,则 appender 将负责按其自己的方式输出堆栈跟踪。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接