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

Log4j2 Logging is not working when application is running through crontab in linux

我有一个 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>

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>

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>

现在我在 Linux 中设置 cron 作业,就像

*/15 9-23 * * * /usr/bin/java -jar /pathToApplication/application.jar arg1

现在的问题是如果我手动 运行 这个 jar 那么一切正常。就像我去应用程序路径并执行命令

java -jar application.jar arg1

但是当这个命令 运行 通过 cronjob 时就没有日志记录了。虽然应用程序工作正常,但我收到电子邮件并 运行 顺利但没有日志记录。

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

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

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

谢谢

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

*/15 9-23 * * * cd /pathToApplication/ && /usr/bin/java -jar /pathToApplication/application.jar arg1