如何将 Log4j(1 或 2)配置为在针对 Slf4j 编写代码时使用自定义日志文件名



我知道有很多与此相关的问题,但我找不到与我正在查看的场景相匹配的问题,所以这就是问题。

当前日志记录设置:使用 Slf4j 和 Log4j1.2 绑定进行编码的记录器。 DailyRollingAppender使用。

程序:一个多线程后端Java程序,处理来自表的数据并调用相关的Web服务。

一个新的请求进来,让日志文件名基于某个数据,我们称之为match_code。这样,每当线程正在处理 MatchA 时,线程使用的日志文件应设置为 MatchA.log

我用谷歌搜索了一段时间,了解到每当进程启动时,我都需要以编程方式配置 Log4j 配置,问题是我应该如何更改日志文件名设置,同时不影响其他设置,例如 Patterns .

如果这意味着可以解决我的问题,我愿意切换到 Log4j 2.x,到目前为止,没有运气找到这方面的样本。

任何建议不胜感激。谢谢。

关于尝试内容的更新

已尝试使用System.setProperty方法动态设置日志文件。下面是属性设置:

log4j.appender.file.File=/log/${logfile.name}.log

在主类中,先添加以下两行:

    static{
        System.setProperty("logfile.name","output");
    }
    private static Logger logger = LoggerFactory.getLogger(Engine.class);

在进程发现数据是进程之后立即添加了以下内容:

System.setProperty("logfile.name",match_code+"_output");

其中match_code是数据库中的值,例如"MatchA"

结果是,主类 DID 的日志名为 output.log 。但是,如果我输入数据进行测试,日志仍将转到output.log,并且不会基于数据创建新的日志文件。

Dunno 如果我理解您的问题:您希望相同的日志消息转到不同的日志文件,具体取决于您正在处理的数据?

如果你使用LogBack,你可以通过MDC + SiftingAppender的组合来实现。 例如,在代码中,您可以执行以下操作:

(在代码中)

MDC.put("match_code", "MatchA");
logger.debug("whatever message");  // just log it normally

(登录.xml)

  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
      <key>match_code</key>
      <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
      <appender name="FILE-${match_code}" class="ch.qos.logback.core.FileAppender">
        <file>${match_code}.log</file>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
        </layout>
      </appender>
    </sift>
  </appender>

请注意,这里我使用LogBack作为日志记录后端。 Log4j 1 没有官方的筛选附加器。 我有点记得 Log4j 2 中的类似内容。 希望这可以作为您搜索的起点,如果您真的坚持使用 Log4j

最新更新