当应用程序在 Linux 中通过 crontab 运行时,Log4j2 日志记录不起作用

Bas*_*sit 2 linux cron java-8 log4j2

我有一个java应用程序,在其中实现了日志记录。这是文件

log4j2.xml

<configuration xmlns:xi="http://www.w3.org/2001/XInclude" status="WARN">
    <xi:include href="log4j-xinclude-appenders.xml" />
    <xi:include href="log4j-xinclude-loggers.xml" />  
</configuration>
Run Code Online (Sandbox Code Playgroud)

log4j-xinclude-appenders.xml

<appenders>

    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>

    <Routing name="RoutingAppender">
        <Routes pattern="${ctx:logFileName}">
            <Route>
                <RollingFile name="Rolling-${ctx:logFileName}"
                         fileName="logs/${ctx:logFileName}.log"
                         filePattern="logs/${ctx:logFileName}-%d{MM-dd-yyyy}-%i.log">
                    <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %c{36} %l: %msg%n"/>
                    <SizeBasedTriggeringPolicy size="5 MB" />
                    <DefaultRolloverStrategy min="1" max="4" />
                </RollingFile>
            </Route>

            <Route ref="Console" key="${ctx:logFileName}"/>
        </Routes>
    </Routing>

</appenders>
Run Code Online (Sandbox Code Playgroud)

log4j-xinclude-loggers.xml:

<loggers>

    <root level="warn">
        <appender-ref ref="Console" />
    </root>

    <logger name="abc.def.ghi.regulators" level="info" additivity="false">
        <appender-ref ref="RoutingAppender" />       
    </logger>

    <logger name="org.apache" level="info" />
    <logger name="org.springframework" level="info" />
</loggers>
Run Code Online (Sandbox Code Playgroud)

现在我在 Linux 中设置 cron 作业,如下所示

*/15 9-23 * * * /usr/bin/java -jar /pathToApplication/application.jar arg1
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果我手动运行这个罐子,那么一切都会正常。就像我转到应用程序路径并执行命令一样

java -jar application.jar arg1
Run Code Online (Sandbox Code Playgroud)

但是当这个命令通过 cronjob 运行时,就没有日志记录。尽管应用程序运行良好,但我收到电子邮件并运行顺利,但没有日志记录。

我想知道为什么当我手动运行它时会有日志记录,但当通过 cron 作业运行时则没有日志记录。

我正在我的应用程序中创建文件、写入文件、从文件中读取,除了使用 cron 作业运行时进行日志记录外,一切正常。

我该如何解决这个日志记录问题?这是权限问题吗?如果是,那么其他文件相关任务的执行情况如何(创建、读取、写入)。?

谢谢

小智 5

问题可能出在工作目录上。crontab 以crontab 用户的主目录作为工作目录来执行任务。你应该像这样修复你的 crontab smth

*/15 9-23 * * * cd /pathToApplication/ && /usr/bin/java -jar /pathToApplication/application.jar arg1
Run Code Online (Sandbox Code Playgroud)