是否可以从 DB 添加 logback.xml 配置值?

Posted

技术标签:

【中文标题】是否可以从 DB 添加 logback.xml 配置值?【英文标题】:Is it possible to add logback.xml configuration values from DB? 【发布时间】:2020-11-17 08:26:38 【问题描述】:

我想从数据库动态配置 logback.xml 值。 这是我的 logback.xml 文件:

<configuration>
    <appender name="KIWI" class="ch.qos.logback.classic.net.SyslogAppender">
        <syslogHost>localhost:8080</syslogHost>
        <facility>LOCAL0</facility>
        <suffixPattern>%thread: %-5level %logger36 - %msg%n</suffixPattern>
    </appender>
    
    <logger name="com.javacodegeeks.examples.logbacksyslogexample.message.kiwi" level="INFO">
        <appender-ref ref="KIWI" />
    </logger>
</configuration>

我想从数据库中获取系统日志主机名信息,而不是直接在这里进行硬编码。这可能吗?

提前谢谢你。

【问题讨论】:

你为什么要这样做?能多解释一下吗 我不希望系统日志配置(如主机名)和我的 java 服务之间存在直接依赖关系。如果我可以从数据库中获取值,我的 java 服务和 syslog 服务配置之间没有任何依赖关系。如果我想更改系统日志配置,我可以在数据库中进行更改,这将在此处反映出来。 我不确定将日志配置放入数据库是否是这样做的方法。对于 syslogHost,您可以通过参数进行设置,然后将其从代码传递给记录器。看这里,也许对你有帮助:***.com/questions/24235296/…。 openwritings.net/pg/java/pass-variableparameter-logbackxml "对于 syslogHost,您可以通过参数进行设置,然后将其从代码传递给记录器。"你能解释一下如何做到这一点吗? 【参考方案1】:

正如我在评论中提到的,我认为将日志记录配置存储在数据库中并不是一个好主意。如果我理解正确,您关心的是如何根据某些变量更改附加程序配置。这可以通过使用 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 %datedd.MM.yyyy. HH:mm:ss - Organization: %mdcorganization - %logger35 [%L]  - %msg%n</pattern>
                </encoder>
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>/home/demo/logs/$organization/org.%ddd.MM.yyyy.%i.log</fileNamePattern>
                    <maxHistory>30</maxHistory>
                    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                        <maxFileSize>10MB</maxFileSize>
                    </timeBasedFileNamingAndTriggeringPolicy>
                </rollingPolicy>
            </appender>
        </sift>
    </appender>

【讨论】:

以上是关于是否可以从 DB 添加 logback.xml 配置值?的主要内容,如果未能解决你的问题,请参考以下文章

获取 logback.xml 以记录不可变日志

为web项目添加logback

logback logback.xml 常用配置详解

覆盖登录配置

logback.xml和logback-spring.xml的区别

springboot使用之三:springboot使用logback日志