我希望我的日志看起来像这样:
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
这并不可怕,但它仍然无法将多个字段(包括文字文本()
)视为一个合理的单位。
答案 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
表示左对齐)