正如我在评论中提到的,我认为将日志记录配置存储在数据库中并不是一个好主意。如果我理解正确,您关心的是如何根据某些变量更改附加程序配置。这可以通过使用 MDC 过滤器或简单地从服务属性中读取值来解决。
如果你想从你的 application.yml 或 env vars 中读取一些值,你可以简单地使用 spring 表达式。
但是,如果您想要更多的灵活性和控制力,您可以使用 MDC 过滤器,您可以在其中设置您想要的任何内容并将其传递给 logback 配置。
http://logback.qos.ch/apidocs/ch/qos/logback/classic/turbo/MDCFilter.html
在以下链接中,您可以看到如何为 logback 做 MDC 的映射和基本用法:
https://www.baeldung.com/mdc-in-log4j-2-logback
这是我如何使用 MDC 过滤器的示例。基本上,根据请求到来时登录的组织,我对其进行解析并将其设置在 MDC 中,然后在写入日志时可以通过 logback 读取它。
Java 配置:
@Component
@Order
public class MDCFilter implements Filter {
@Override
public void init(FilterConfig fc) throws ServletException {
}
@Override
public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc) throws IOException, ServletException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = "System admin";
String organization = "System-Club";
if (authentication != null) {
if (authentication.getPrincipal() instanceof UserDetails) {
UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal();
username = springSecurityUser.getUsername();
String apd = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
orgnization = apd.getOrganization().getName();
}
}
if(orgnization != null) {
MDC.put("orgnization", orgnization.replaceAll("\\s+","_").toLowerCase());
}
try {
fc.doFilter(sr, sr1);
} finally {
if (username != null) {
MDC.remove("username");
}
if (orgnization != null) {
MDC.remove("orgnization");
}
}
}
@Override
public void destroy() {
}
}
logback.xml:
<appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>organization</key>
<defaultValue>System</defaultValue>
</discriminator>
<sift>
<!-- A standard RollingFileAppender, the log file is based on 'logFileName' at runtime -->
<appender name="FILE-${organization}"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/demo/logs/${organization}/org.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%-5level %date{dd.MM.yyyy. HH:mm:ss} - Organization: %mdc{organization} - %logger{35} [%L] - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/demo/logs/${organization}/org.%d{dd.MM.yyyy}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
</sift>
</appender>