Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使Logback日志成为空行,而不包括模式字符串?_Java_Logging_Conditional_Newline_Logback - Fatal编程技术网

Java 如何使Logback日志成为空行,而不包括模式字符串?

Java 如何使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}

我有一个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}-%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:消息带有
中间有一条直线。
正如您所看到的,这些日志语句都不是我所需要的工作方式

  • 如果我只是记录一个空字符串,编码器的模式仍然在消息前面,即使消息是空的
  • 如果在字符串的开始或中间嵌入换行符,此后的所有内容都将丢失模式前缀,因为该模式只在消息开始时应用一次。
  • 如果在字符串末尾嵌入换行符,它确实会创建所需的空行,但这仍然只是部分解决方案;它仍然不允许我在记录的消息之前输出空行
在对评估者、标记等进行了大量实验之后,我终于找到了一个解决方案,虽然相当笨拙,但却达到了预期效果。这是一个两步解决方案:

  • 修改每个现有Appender中的筛选器,使其仅允许非空消息
  • 创建每个附加器的副本;修改重复项,使其筛选器只允许空消息,其模式只包含换行符
  • 生成的文件如下所示:

    logback.xml(已修改)

    
    回来!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>