Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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 Log4j vs Logback:并发写入同一日志?_Java_Web Applications_Logging_Log4j_Logback - Fatal编程技术网

Java Log4j vs Logback:并发写入同一日志?

Java Log4j vs Logback:并发写入同一日志?,java,web-applications,logging,log4j,logback,Java,Web Applications,Logging,Log4j,Logback,我有几个web应用程序在同一个tomcat上运行 我有两个问题: 1-通过搜索,我了解到当存在多个应用程序时,登录到同一个文件可能会出现一些问题。对于在同一web服务器上运行的多个应用程序,情况就是这样吗?当使用默认标准输出时,这也正确吗 2-在Logback库中有一种谨慎的模式: 在谨慎模式下,FileAppender将安全地写入指定的文件,即使存在运行在不同JVM(可能运行在不同主机上)中的其他FileAppender实例。审慎模式的默认值为false 我想知道使用Logback是否只对多个

我有几个web应用程序在同一个tomcat上运行

我有两个问题:

1-通过搜索,我了解到当存在多个应用程序时,登录到同一个文件可能会出现一些问题。对于在同一web服务器上运行的多个应用程序,情况就是这样吗?当使用默认标准输出时,这也正确吗

2-在Logback库中有一种谨慎的模式:

在谨慎模式下,FileAppender将安全地写入指定的文件,即使存在运行在不同JVM(可能运行在不同主机上)中的其他FileAppender实例。审慎模式的默认值为false

我想知道使用Logback是否只对多个JVM有利,还是对运行在同一web服务器上的多个we应用程序有利?如果不是,在这方面是否与log4j相同

谢谢

  • 对。通常,您的原则应该是为每个应用程序(web或非web)编写不同的日志文件。另一种选择是,由服务器决定要写入的文件。JBoss有几种方法可以一般地注销,这将转到同一个文件。但是,我仍然希望每个应用程序都有一个单独的日志
  • 据我所知,log4j和Logback的目标都是尽量减少它们可能导致应用程序的开销,因此不太可能有一个更有利的方法。如果多个JVM对您来说很重要,我相信Logback更适合处理它,但是在外部使用它并不是一个坏主意

  • 有一件事必须澄清:当Log4j的不同实例同时写入同一文件时,无论是否在同一JVM中运行,都会出现问题

    当使用服务器(和不同的类加载器)时,根据部署和配置,Log4j可能有一个服务器范围的实例或多个实例

  • 见上文。Stdout可能会遇到相同的混合输出问题,但在旋转文件时不会出现这种问题
  • Logback的谨慎模式将解决不同实例(同一JVM与否)的并发写入问题。如果您的配置使用服务器范围的Log4j实例,则这方面没有优势

  • 在log4j和logback中,如果多个
    FileAppender
    实例写入同一日志文件,则所述日志文件损坏的风险很高。无论
    FileAppender
    实例是在同一JVM上运行还是在不同JVM上运行都是无关的,即损坏的风险是相同的

    正如文档中提到的,在logback中的
    FileAppender
    将避免损坏,即使存在在相同或不同JVM中运行的其他
    FileAppender
    实例,这些实例可能运行在不同的主机上。默认情况下,审慎模式处于禁用状态


    控制台不能被破坏,因此这个问题是没有意义的。

    使用文件锁实际上从来都不是有效/安全的,因此当从不同的Appender/JVM的作品登录到同一个文件时,不建议这样做。请参阅我直接从中获取的配置。

    
    

    SocketAppenders可能有点粗糙,因为您可能不打算为logback编写太多代码


    还有一个选择。您可以使用类似的工具,它可以完全解决您遇到的问题。

    我们可以详细说明问题是什么吗?这些是:混合行、一行中混合内容、丢失日志、滚动文件名问题?
    <configuration>
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- Support multiple-JVM writing to the same log file -->
        <prudent>true</prudent>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
          <maxHistory>30</maxHistory> 
        </rollingPolicy>
    
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender> 
    
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration>