Java 如何使Logback日志成为空行,而不包括模式字符串?
我有一个Java应用程序,它被设置为使用SLF4J/Logback。我似乎找不到一种简单的方法使Logback输出在另外两个日志条目之间完全空白。空白行不应包括编码器的模式;它应该是空白的。我在网上搜索过一种简单的方法,但结果是空的 我有以下设置: logback.xmlJava 如何使Logback日志成为空行,而不包括模式字符串?,java,logging,conditional,newline,logback,Java,Logging,Conditional,Newline,Logback,我有一个Java应用程序,它被设置为使用SLF4J/Logback。我似乎找不到一种简单的方法使Logback输出在另外两个日志条目之间完全空白。空白行不应包括编码器的模式;它应该是空白的。我在网上搜索过一种简单的方法,但结果是空的 我有以下设置: logback.xml 返回级别=信息; 中立的 否认 %d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n 系统输出 警告 %d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}
返回级别=信息;
中立的
否认
%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n
系统输出
警告
%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n
System.err
LogbackMain.java(测试代码)
package-pkg;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
公共类LogbackMain
{
私有静态最终记录器log=LoggerFactory.getLogger(LogbackMain.class);
公共LogbackMain()
{
log.info(“消息A:单行消息”);
log.info(“消息B:此消息之后的消息将为空。”);
log.info(“”);
log.info(“消息C:此消息之前的消息为空。”);
log.info(“\n消息D:消息开头有换行符。”);
log.info(“消息E:消息末尾有换行符。\n”);
Log.FIN(“消息F:在中间有NA断裂的消息”);
}
/**
*@param args
*/
公共静态void main(字符串[]args)
{
新LogbackMain();
}
}
这将产生以下输出:
16:36:14.152[main]INFO pkg.LogbackMain-消息A:单行消息。
16:36:14.152[main]INFO pkg.LogbackMain-消息B:此消息之后的消息将为空。
16:36:14.152[main]信息包LogbackMain-
16:36:14.152[main]INFO pkg.LogbackMain-消息C:此消息之前的消息为空。
16:36:14.152[main]信息包LogbackMain-
消息D:消息开头有换行符。
16:36:14.152[main]INFO pkg.LogbackMain-消息E:消息末尾带有换行符。
16:36:14.152[main]INFO pkg.LogbackMain-消息F:消息带有
中间有一条直线。
正如您所看到的,这些日志语句都不是我所需要的工作方式
- 如果我只是记录一个空字符串,编码器的模式仍然在消息前面,即使消息是空的
- 如果在字符串的开始或中间嵌入换行符,此后的所有内容都将丢失模式前缀,因为该模式只在消息开始时应用一次。
- 如果在字符串末尾嵌入换行符,它确实会创建所需的空行,但这仍然只是部分解决方案;它仍然不允许我在记录的消息之前输出空行
回来!message.isEmpty()&&;级别=信息;
中立的
否认
%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n
系统输出
返回消息.isEmpty()&&;级别=信息;
中立的
否认
%n
系统输出
回来!message.isEmpty()&&;级别=警告;
中立的
否认
%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n
System.err
返回消息.isEmpty()&&;级别=警告;
中立的
否认
%n
System.err
通过此设置,我以前的测试代码生成以下输出:
17:00:37.188[main]INFO pkg.LogbackMain-消息A:单线消息。
17:00:37.188[main]INFO pkg.LogbackMain-消息B:此消息之后的消息将为空。
17:00:37.203[main]INFO pkg.LogbackMain-消息C:此消息之前的消息为空。
17:00:37.203[main]信息包LogbackMain-
消息D:消息开头有换行符。
17:00:37.203[main]INFO pkg.LogbackMain-消息E:消息末尾带有换行符。
17:00:37.203[main]INFO pkg.LogbackMain-消息F:消息带有
中间有一条直线。
请注意,带有空消息的日志语句现在会根据需要创建一个空行。所以这个解决方案是有效的。然而,正如我上面所说的,必须为每个Appender创建一个副本是非常不方便的,而且它肯定不是非常可伸缩的。更不用说,为了达到这样一个简单的结果而做这么多的工作,似乎有点过头了
因此,我将问题提交给Stack Overflow,并提出一个问题:有更好的方法吗?
另外,作为最后说明,最好采用仅配置的解决方案;如果可能的话,我希望避免编写自定义Java类(过滤器、标记等)来获得这种效果。原因是,我正在做的项目
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%n</pattern>