在Log4j模式布局中右对齐复合/复合表达式?
我希望我的日志如下所示:在Log4j模式布局中右对齐复合/复合表达式?,log4j,logback,log4j2,Log4j,Logback,Log4j2,我希望我的日志如下所示: ClassName.methodName() - just did something ClassName.methodNameLonger() - just did something else 我知道您可以用%-17M正确地证明方法名称,但我最终得出以下结论: ClassName.methodName () - just did something ClassName.methodNameLonger() - just did somethi
ClassName.methodName() - just did something
ClassName.methodNameLonger() - just did something else
我知道您可以用%-17M
正确地证明方法名称,但我最终得出以下结论:
ClassName.methodName () - just did something
ClassName.methodNameLonger() - just did something else
有没有一种方法可以将多个元素作为一个块进行对齐,从而使填充仅出现在最开始的地方
我不确定是否可以查看参考资料:
更多详细信息
如果我尝试对类名进行右对齐,我会得到:
ClassName . methodName() - just did something
ClassName .methodNameLonger() - just did something else
ClassNameLonger.methodNameLonger() - just did something else
这并不可怕,但它仍然不能将多个字段(包括文本
()
)作为一个连续的单元来进行对齐。您是否尝试正确对齐类名<代码>%-20C{1}.%17M如另一个答案中所述,Log4j不支持此选项
然而,logback确实如此
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender" scan="true">
<encoder>
<pattern>%-5level %20(%logger{0}.%method\(\)) - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
将对子模式%d{HH:mm:ss.SSS}[%thread]
生成的输出进行分组,以便在少于30个字符时正确填充
如果没有分组,则输出为
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Classload hashcode is 13995234
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Initializing for ServletContext
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Trying platform Mbean server
13:09:30 [pool-1-thread-1] INFO ch.qos.logback.demo.LoggingTask - Howdydy-diddly-ho - 0
13:09:38 [btpool0-7] INFO c.q.l.demo.lottery.LotteryAction - Number: 50 was tried.
13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Beginning to factor.
13:09:40 [btpool0-7] DEBUG c.q.l.d.prime.NumberCruncherImpl - Trying 2 as a factor.
13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Found factor 2
使用“%-30()”
分组将
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Classload hashcode is 13995234
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Initializing for ServletContext
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Trying platform Mbean server
13:09:30 [pool-1-thread-1] INFO ch.qos.logback.demo.LoggingTask - Howdydy-diddly-ho - 0
13:09:38 [btpool0-7] INFO c.q.l.demo.lottery.LotteryAction - Number: 50 was tried.
13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Beginning to factor.
13:09:40 [btpool0-7] DEBUG c.q.l.d.prime.NumberCruncherImpl - Trying 2 as a factor.
13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Found factor 2
后一种形式更容易阅读
如果需要将括号字符视为文字,则需要通过在每个括号前面加反斜杠对其进行转义。与中一样,
\(%d{HH:mm:ss.SSS}[%thread]\)
这肯定可以在log4j2中完成
您可以将整个复合表达式放置在%replace模式中(不带参数),然后对%replace的结果进行对齐
因此,如果我想证明复合表达式[%c{1}:%method:%line]
我只需将表达式转储到一个空的替换中,并按如下所示对其进行右对齐
%-40.40replace{[%c{1}:%method:%line]}{{}{}
结果是一个分组表达式被截断/扩展到正好40个字符并右对齐(或
%-40.-40replace
用于左对齐)我看不到,问题看起来没有改变。你试过证明类名是正确的吗<代码>%-20C{1}.%17M我没有更新我的帖子,我更新了你的帖子,因为它只与你的问题相关。也许我的编辑在获得批准之前对您不可见。我现在要更新我原来的帖子了……啊,我明白了。谢谢嗯,对齐/对齐是在代码中每个元素的基础上完成的。我们需要引入一个类+方法转换说明符来支持您的请求。如果你真的想这样做,我建议在log4j2的Jira issue tracker上提出一个功能请求,并自己提供一个补丁。感谢你的洞察力。就其价值而言,我不确定现在我在日志输出中看到类名和方法名后对其进行分组是否有利。单独对齐类名在某种程度上看起来更干净。但是将()
放在方法名称旁边是复合表达式的一个优点。
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Classload hashcode is 13995234
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Initializing for ServletContext
13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Trying platform Mbean server
13:09:30 [pool-1-thread-1] INFO ch.qos.logback.demo.LoggingTask - Howdydy-diddly-ho - 0
13:09:38 [btpool0-7] INFO c.q.l.demo.lottery.LotteryAction - Number: 50 was tried.
13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Beginning to factor.
13:09:40 [btpool0-7] DEBUG c.q.l.d.prime.NumberCruncherImpl - Trying 2 as a factor.
13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Found factor 2