【问题标题】:Log4j - need newline only sometimesLog4j - 有时只需要换行符
【发布时间】:2013-09-16 23:39:38
【问题描述】:

使用 System.out,您可以:

System.out.print
System.out.println

有时我不想要换行符(比如当我打印“About to commit transaction...done”时)。使用 System.out 我会这样做:

System.out.print("About to commit transaction...");
System.out.println("done.");

我不知道如何在 log4j 中做到这一点。我的 log4j 属性文件有这个:

log4j.rootLogger=DEBUG, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-30c{1} %x %-30M - %m%n 

我不想简单地删除“%n”并且必须在每个日志记录语句中指定它。

这在 Log4j 中可行吗?

【问题讨论】:

    标签: java logging log4j newline log4j2


    【解决方案1】:

    您可以尝试一些创意,例如声明三个记录器,每个记录器具有不同的附加程序(以及不同的转换模式)。

    第一个就是你现在拥有的(相当于 System.println)。

    第二个将具有模式 %-30c{1} %x %-30M - %m(相当于 System.print)

    第三个将有模式 %m%n (相当于 System.println 没有日志消息头)。

    这可能可行,但在您的代码中包含三个记录器似乎不值得麻烦......

    您可以尝试将此请求作为 log4j2 中的功能...

    【讨论】:

    • 谢谢 Remko。很高兴知道它不受支持,所以我不会一直想知道该怎么做。
    • 这仅在单线程应用程序的情况下才能正常工作。如果您有多个线程日志记录,您可能会得到类似“[Thread1] About to commit transaction...[Thread2] About to commit transaction...[Thread1] done\n[Thread2] done”之类的信息,这将使日志难以处理阅读是否经常使用“无换行符”附加程序。在您的示例中,我建议使用 DEBUG 级别来记录 tx 的开始(带换行符),并使用 INFO 来记录 tx 的结束
    • 好点,是的。任何解决方案都会遇到这个问题。因此,提问者要么没有考虑这一点,要么希望将其用于单线程用例。
    猜你喜欢
    • 1970-01-01
    • 2014-01-23
    • 2011-01-19
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多