首页 > 解决方案 > 如何为单个项目中运行的每个批次创建单独的日志文件?

问题描述

从事 Spring Boot 和 Spring Scheduler 项目以运行多个批次。

这里我将所有批次信息写入一个日志文件。(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>

标签: spring-bootlog4jspring-scheduled

解决方案


您可以将您的批处理名称放在 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>

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


推荐阅读