You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为特定类的Slf4j日志追加固定标识SPRING_BATCH_LOG?

解决方案:给Spring Batch类日志添加固定前缀并保留类名

问题核心

需要让Spring Batch相关类的日志记录器名称同时包含固定前缀SPRING_BATCH_LOG和类全名,而非仅显示固定字符串或仅显示类名。

可行实现方法

方法1:修改日志框架格式配置(推荐,无需修改代码)

如果使用Logback或Log4j2,可通过配置日志输出格式,针对指定包/类的日志自动添加前缀,完全不需要改动业务代码。

Logback配置示例

在logback-spring.xml中,修改appender的JSON编码器配置,通过条件判断为目标类的日志追加前缀:

<appender name="JSON_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <timestamp/>
            <message/>
            <logger>
                <pattern>
                    %if(%logger matches 'c\.v\.r\.r\.c\..*'){SPRING_BATCH_LOG : %}%logger
                </pattern>
            </logger>
            <thread/>
            <level/>
        </providers>
    </encoder>
</appender>

说明:%if(%logger matches 'c\.v\.r\.r\.c\..*')匹配你的Spring Batch类所在的包路径(示例中为c.v.r.r.c),匹配成功时自动添加SPRING_BATCH_LOG : 前缀,不匹配则输出原日志器名称。

Log4j2配置示例

在log4j2-spring.xml的JSON布局中,使用字符串替换规则添加前缀:

<JsonLayout>
    <KeyValuePair key="@timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}"/>
    <KeyValuePair key="message" value="%message"/>
    <KeyValuePair key="logger" value="%replace(%logger){^c\.v\.r\.r\.c\.,SPRING_BATCH_LOG : c.v.r.r.c.}"/>
    <KeyValuePair key="thread" value="%thread"/>
    <KeyValuePair key="level" value="%level"/>
</JsonLayout>

说明:通过%replace函数将指定包前缀替换为带SPRING_BATCH_LOG : 的新前缀,直接实现需求格式。

方法2:手动构造Logger实例(简单直接)

放弃Lombok的@Slf4j注解,手动创建Logger时直接拼接前缀与类名:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class RetryOb {

    private static final Logger log = LoggerFactory.getLogger("SPRING_BATCH_LOG : " + RetryOb.class.getName());
    private final RetryJobService retryJobService;

    public void retry(RetryRequest retryRequest) {
        log.info("Creating a retry Initiate job execution");
        retryJobService.startJob(retryRequest);
    }
}

这种方式直接在日志器名称中嵌入前缀,日志输出时会直接显示SPRING_BATCH_LOG : c.v.r.r.c.RetryOb。

方法3:自定义Lombok扩展(适合批量处理)

如果有大量类需要处理,可以自定义Lombok扩展注解,自动生成带前缀的Logger:

  1. 创建自定义注解@SpringBatchSlf4j:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface SpringBatchSlf4j {
}
  1. 编写Lombok处理器(需了解Lombok SPI扩展机制),让注解自动生成类似方法2的Logger实例代码,实现批量类的日志前缀统一配置。

总结

  • 优先选方法1:无需改代码,通过日志配置统一实现,维护成本最低。
  • 少量类场景选方法2:简单直接,无额外配置成本。
  • 大量类场景选方法3:一次性实现批量配置,减少重复代码。

内容的提问来源于stack exchange,提问作者Muhammed Thabjeel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:55:28