在Log4j模式布局中右对齐复合/复合表达式?

时间:2015-08-05 22:28:13

标签: log4j logback log4j2

我希望我的日志看起来像这样:

      ClassName.methodName() - just did something
ClassName.methodNameLonger() - just did something else

我知道您可以使用%-17M对方法名称进行右对齐,但我最终得到了这个:

ClassName.methodName      () - just did something
ClassName.methodNameLonger() - just did something else

有没有办法将多个元素证明为单个块,这样填充只出现在最开始?

我不确定是否可以查看参考: https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

更多详情

如果我试图对类名称进行右对齐,我会得到:

ClassName      .      methodName() - just did something
ClassName      .methodNameLonger() - just did something else
ClassNameLonger.methodNameLonger() - just did something else

这并不可怕,但它仍然无法将多个字段(包括文字文本())视为一个合理的单位。

3 个答案:

答案 0 :(得分:2)

如另一个答案所述,Log4j不支持此功能。

然而,logback确实如此。

li

此处提供完整文档:

http://logback.qos.ch/manual/layouts.html#Parentheses

括号是特殊的

在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> 开始,logback支持复合转换字,例如0.9.27,可以转换子模式。

例如,模式

%replace

将对子模式%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{32} - %msg%n 生成的输出进行分组,以便在少于30个字符时对其进行右边填充。

如果没有分组,则输出

%d{HH:mm:ss.SSS} [%thread]

使用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

答案 1 :(得分:1)

您是否尝试过对齐姓名? %-20C{1}.%17M

答案 2 :(得分:1)

这绝对可以在 log4j 2 中完成

您可以将整个复合表达式放在 %replace 模式中(不带参数),然后证明 %replace 的结果是正确的

因此,如果我想证明复合表达式 [%c{1}:%method:%line]

我会简单地将表达式转储到一个空的替换中并正确证明如下

%-40.40replace{[%c{1}:%method:%line]}{}{}

结果是一个分组表达式被截断/扩展为正好 40 个字符并右对齐(或 %-40.-40replace 表示左对齐)