代码之家  ›  专栏  ›  技术社区  ›  Stav Alon

Logback日志由应用程序保持打开状态,不从磁盘中删除

  •  1
  • Stav Alon  · 技术社区  · 6 年前

    我在Linux上有一个Spring Boot应用程序,它使用Logback写入服务日志。Logback设置为写入文件(account service.log)并以10.5MB的速度旋转文件,最后在第8次旋转时删除文件。这是默认配置。

    我遇到的问题是,创建的第一个日志文件被写入超过10.5MB大小限制(它确实在10.5MB标记处旋转)。所以它的大小一直在增加,直到它成为第八个文件,然后它试图被删除。此时,文件大小为84MB(10.5MB*8)。 You can see here the file increasing in size

    这方面的主要问题是,操作系统试图删除文件,但由于应用程序仍保持打开状态,因此文件系统不会显示已删除的文件(如命令 发现 )系统仍然保留磁盘上分配的空间。此外,文件仍被写入,因此它占用了越来越多的磁盘空间。我跑了 sudo lsof | grep已删除 发现此文件未被完全删除。

    同样有趣的是,第一个文件所属的组与其他文件不同。第一个文件具有组根,而其余文件具有正确的组名account service。这可能是应用程序无法关闭文件的原因,但我不确定。

    Logback依赖来自我的Spring Boot pom:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    后续的日志文件确实会被删除,并且不会写入超过10.5 MB的限制。

    有人看到过这个问题或找到了解决方法吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Stav Alon    6 年前

    所以我解决了大部分问题,但还有一个问题。

    主要问题是我使用内置的logback xml进行日志记录(base.xml)。在那里,它被配置为同时启用控制台和文件日志记录。

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
    

    因此,当我在本地运行它时,我会将日志写入终端和服务日志文件,这很好,但问题发生在部署的实例上。发生的事情是,“控制台”和“文件”记录器都在向文件写入数据,这就是为什么即使在第一个文件旋转之后,它仍然在被写入。“控制台”记录器正在写入第一个文件,即使它旋转,因为从其角度来看,该文件是终端。这也帮助修复了我们看到的双重日志记录问题。

    我的解决方案是添加我自己的logback xml(logback-spring.xml)来覆盖基。xml一。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <springProfile name="default">
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
    

    这将停止对已部署实例的控制台日志记录,从而防止第一个文件的日志记录超过10.5MB的限制。此修复也修复了我们遇到的磁盘空间问题。

    唯一一个我还不能解决的问题是,为什么应用程序会打开文件,从而不允许将其从磁盘空间中完全删除。

        2
  •  0
  •   Neelesh    6 年前

    正如您所提到的,文件作为根用户访问权限看起来不正确。您可以通过ps-efw | grep applicationName检查应用程序,以查看它具有哪些用户权限,因为您的应用程序应该只具有应用程序用户权限。