Java 日志回滚FileAppender FileNotFoundException

Java 日志回滚FileAppender FileNotFoundException,java,spring-boot,logback,spring-logback,Java,Spring Boot,Logback,Spring Logback,我在我的spring boot项目中使用logback。当我们在PROD环境中部署应用程序时,部署失败,出现以下异常。在PROD之前,我们将应用程序部署在较低的环境中,没有发现任何问题。谁能给我点光吗 在logback.xml中,我们将日志路径指定为“/app/tomcatprofile/micro001/logs/sc erp security permissions check.log”,但从下面的日志中,将日志路径设置为“/app/tomcatprofile/micro001/logs”

我在我的spring boot项目中使用logback。当我们在PROD环境中部署应用程序时,部署失败,出现以下异常。在PROD之前,我们将应用程序部署在较低的环境中,没有发现任何问题。谁能给我点光吗

在logback.xml中,我们将日志路径指定为“/app/tomcatprofile/micro001/logs/sc erp security permissions check.log”,但从下面的日志中,将日志路径设置为“/app/tomcatprofile/micro001/logs”

还附上了我们的LogbackXML

15:54:22,305 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: /app/tomcatprofile/micro001/logs
15:54:22,305 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [/app/tomcatprofile/micro001/logs]
15:54:22,305 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - openFile(/app/tomcatprofile/micro001/logs,true) call failed. java.io.FileNotFoundException: /app/tomcatprofile/micro001/logs (Is a directory)
    at java.io.FileNotFoundException: /app/tomcatprofile/micro001/logs (Is a directory)
    at  at java.io.FileOutputStream.open0(Native Method)
    at  at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at  at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at  at ch.qos.logback.core.recovery.ResilientFileOutputStream.<init>(ResilientFileOutputStream.java:26)
    at  at ch.qos.logback.core.FileAppender.openFile(FileAppender.java:204)
    at  at ch.qos.logback.core.FileAppender.start(FileAppender.java:127)
    at  at ch.qos.logback.core.rolling.RollingFileAppender.start(RollingFileAppender.java:100)
    at  at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
    at  at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
    at  at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
    at  at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
    at  at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
    at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)
    at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152)
    at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)
    at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
    at  at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
    at  at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
    at  at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
    at  at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
    at  at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    at  at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    at  at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    at  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    at  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
    at  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
    at  at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:273)
    at  at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:86)
    at  at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)
    at  at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5151)
    at  at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at  at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at  at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at  at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at  at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917)
    at  at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701)
    at  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at  at java.lang.Thread.run(Thread.java:745)
15:54:22305 |-ch.qos.logback.core.rolling.RollingFileAppender[FILE]中的信息-活动日志文件名:/app/tomcatprofile/micro001/logs
15:54:22305 |-ch.qos.logback.core.rolling.RollingFileAppender[FILE]中的信息-文件属性设置为[/app/tomcatprofile/micro001/logs]
15:54:22305 |-ch.qos.logback.core.rolling.RollingFileAppender[FILE]-openFile(/app/tomcatprofile/micro001/logs,true)调用失败。java.io.FileNotFoundException:/app/tomcatprofile/micro001/logs(是一个目录)
位于java.io.FileNotFoundException:/app/tomcatprofile/micro001/logs(是一个目录)
位于java.io.FileOutputStream.open0(本机方法)
位于java.io.FileOutputStream.open(FileOutputStream.java:270)
位于java.io.FileOutputStream。(FileOutputStream.java:213)
位于ch.qos.logback.core.recovery.ResilientFileOutputStream。(ResilientFileOutputStream.java:26)
位于ch.qos.logback.core.FileAppender.openFile(FileAppender.java:204)
位于ch.qos.logback.core.FileAppender.start(FileAppender.java:127)
位于ch.qos.logback.core.rolling.RollingFileAppender.start(RollingFileAppender.java:100)
位于ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
位于ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
位于ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
位于ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
位于ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
位于ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)
位于ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152)
位于ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)
位于ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
位于ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
位于ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
位于org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
位于org.slf4j.impl.StaticLoggerBinder(StaticLoggerBinder.java:55)
位于org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
位于org.slf4j.LoggerFactory.performinization(LoggerFactory.java:124)
位于org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
位于org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
位于org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
位于org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
位于org.apache.commons.logging.LogFactory.getLog(LogFactory.java:273)
位于org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:86)
在org.springframework.web.SpringServletContainerInitializer.onStartup上(SpringServletContainerInitializer.java:169)
位于org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5151)
位于org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
位于org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
位于org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
位于org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
位于org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917)
位于org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
位于java.util.concurrent.FutureTask.run(FutureTask.java:266)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
运行(Thread.java:745)
Logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <property name="FILE_PATH" value="${catalina.base}/logs/sc-erp-security-permissions-check.log" />

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d [%t] %-5p %c - %X{TransactionId} - %m%n</Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>TRACE</level>
        </filter>
    </appender>

    <appender name="mainAppender"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${FILE_PATH}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILE_PATH}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <Pattern>%d [%t] %-5p %c - %X{TransactionId} - %m%n</Pattern>
        </encoder>
    </appender>

    <logger name="com.adp.smartconnect" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="mainAppender" />
        <appender-ref ref="consoleAppender" />
    </logger>

    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <logger name="org.springframework.web" level="INFO"/>
    <logger name="org.springframework.boot" level="WARN"/>
    <logger name="org.springframework.jmx" level="WARN"/>
    <logger name="com.adp.smartconnect.commons" level="WARN" />
    <logger name="springfox" level="WARN"/>

    <logger name="org.springframework.ws.client.MessageTracing.sent" level="INFO"/>
    <logger name="org.springframework.ws.client.MessageTracing.received" level="INFO"/>
    <logger name="org.springframework.ws.server.MessageTracing" level="INFO"/>

    <root>
        <level value="INFO" />
        <appender-ref ref="mainAppender" />
        <appender-ref ref="consoleAppender" />
    </root>
</configuration>

%d[%t]-5p%c-%X{TransactionId}-%m%n
痕迹
${FILE_PATH}
${FILE\u PATH}.%d{yyyy-MM-dd}.log
30
真的
%d[%t]-5p%c-%X{TransactionId}-%m%n

我们的logback配置在内部使用spring boot logback实现,在我从logback.xml中删除下面一行之后,问题就解决了

<include resource="org/springframework/boot/logging/logback/base.xml"/>

注意:我们的spring启动版本是1.5.10

困惑的问题:

  • 我们仍然不知道为什么会这样 完整日志文件路径中的“sc erp安全权限检查.log”
  • 使用base.xml,在开发、qa和阶段部署成功,但在PROD的4个节点中只有2个节点部署失败
  • 我仍然在做我的研究以找出确切的根本原因,如果我发现了什么,我会更新这个答案


    感谢@Andreas的及时回复。

    在我的例子中,问题是因为运行的用户没有权限创建包含日志文件的文件夹,我将其设置为/var/log/webcast

    解决我的问题的方法是在my.ser中为正在运行的用户授予权限
    [Unit]
    Description=myapp
    After=syslog.target
    
    [Service]
    User=webcast
    ExecStart=/bin/bash /opt/webcast/run.sh
    SuccessExitStatus=143
    Restart=always
    RestartSec=5
    StartLimitInterval=1
    
    [Install]
    WantedBy=multi-user.target