如何为单个项目中运行的每个批次创建单独的日志文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为单个项目中运行的每个批次创建单独的日志文件?相关的知识,希望对你有一定的参考价值。

使用Spring启动和Spring调度程序项目来运行多个批处理。

这里所有批处理信息都写在一个日志文件中。(One log file got created

现在我需要在不同批次i.e no. of batches = that many no. of log files的单独日志文件中写入信息。

请注意,我只有一个主类,因为我使用的是spring boot,所有批次只在一个包下,所有批次只有一个服务,所有批次都有一个存储库。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
  <Property name="LOG_PATTERN">$${ctx:filename} %d %p %c{1.} [%t] %m%n
  </Property>
  <Property name="APP_LOG_ROOT">C:/job-logs/claims-dms/</Property>
  <Property name="APP_LOG_BACK_ROOT">C:/job-logs/claims-dms/back/</Property>
</Properties>
<Appenders>
    <Console name="Console" target="SYSTEM_OUT" follow="true">
        <PatternLayout pattern="${LOG_PATTERN}" />
    </Console>

    <RollingFile name="appLog" fileName="${APP_LOG_ROOT}claims-dms.log"
        filePattern="${APP_LOG_BACK_ROOT}claims-dms-%d{yyyy-MM-dd}-%i.log.gz">
        <PatternLayout pattern="${LOG_PATTERN}" />
        <Policies>
            <SizeBasedTriggeringPolicy size="500MB" />
            <TimeBasedTriggeringPolicy interval="1"
                modulate="true" />

        </Policies>
        <DefaultRolloverStrategy max="1" />
    </RollingFile>

</Appenders>
<Loggers>

    <Logger name="com.bct" additivity="false" level="all">
        <AppenderRef ref="appLog" />
        <AppenderRef ref="Console" />
    </Logger>
    <Logger name="org.hibernate.SQL" additivity="false" level="all">
        <AppenderRef ref="appLog" />
        <AppenderRef ref="Console" />
    </Logger>
    <Logger name="org.hibernate.type.descriptor.sql" additivity="false"
        level="all">
        <AppenderRef ref="appLog" />
        <AppenderRef ref="Console" />
    </Logger>
    <Logger name="org.springframework.jdbc.core" additivity="false"
        level="all">
        <AppenderRef ref="appLog" />
        <AppenderRef ref="Console" />
    </Logger>



    <Root>
        <AppenderRef ref="Console" />
    </Root>
</Loggers>
</Configuration>
答案

您可以将批处理名称放在MDC中,从那里触发作业,并在logback.xml中使用该键

@Scheduled
public void scheduleJob(){
    MDC.put("jobname", jobName);
    // other stuff
}

和logback.xml

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

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <!-- in the absence of the class attribute, it is assumed that the
         desired discriminator type is
         ch.qos.logback.classic.sift.MDCBasedDiscriminator -->
    <discriminator>
        <key>jobName</key>
        <defaultValue>batch-service</defaultValue>
    </discriminator>
    <sift>
        <appender name="FILE-${jobName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${server.docroot}/logs/${jobName}.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
              <fileNamePattern>${server.docroot}/logs/${jobName}.%i.log</fileNamePattern>
              <minIndex>1</minIndex>
              <maxIndex>5</maxIndex>
            </rollingPolicy>

            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
              <maxFileSize>100MB</maxFileSize>
            </triggeringPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
            </layout>
        </appender>
    </sift>
</appender>


<root level="INFO">
<appender-ref ref="SIFT" />
</root>
</configuration>

现在,对于每个作业,将创建一个新的日志文件。

以上是关于如何为单个项目中运行的每个批次创建单独的日志文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何为单个模型保存多个单独的记录

Filebeat/ELK中如何为不同的日志定义单独的索引?

在 Angular 项目中,如何为项目单独创建路由文件?

如何为多个选项卡/窗口运行工具栏的单个实例

是:如何为is创建单独的.babelrc文件

如何为 icarousel 中的每个按钮创建单独的操作?