Java 是否可以从DB添加logback.xml配置值?
我想从数据库中动态配置logback.xml值。 这是我的logback.xml文件:Java 是否可以从DB添加logback.xml配置值?,java,xml,spring-boot,logback,syslog,Java,Xml,Spring Boot,Logback,Syslog,我想从数据库中动态配置logback.xml值。 这是我的logback.xml文件: <configuration> <appender name="KIWI" class="ch.qos.logback.classic.net.SyslogAppender"> <syslogHost>localhost:8080</syslogHost> <facility&
<configuration>
<appender name="KIWI" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>localhost:8080</syslogHost>
<facility>LOCAL0</facility>
<suffixPattern>%thread: %-5level %logger{36} - %msg%n</suffixPattern>
</appender>
<logger name="com.javacodegeeks.examples.logbacksyslogexample.message.kiwi" level="INFO">
<appender-ref ref="KIWI" />
</logger>
</configuration>
本地主机:8080
本地0
%线程:%-5级别%logger{36}-%msg%n
我想从数据库中获取syslog主机名信息,而不是直接在这里硬编码。可能吗
提前谢谢。正如我在评论中提到的,我认为在数据库中存储日志配置不是一个好主意。如果我理解正确,您关心的是如何根据某些变量更改appender配置。这可以通过使用MDC过滤器或从服务属性中读取值来解决 如果您想从application.yml或env变量中读取一些值,只需使用spring表达式即可 但是,如果您想要更大的灵活性和控制,您可以使用MDC过滤器,在这里您可以设置任何您想要的内容,并将其传递给logback配置 在下面的链接中,您可以看到如何进行MDC的映射和基本用法以进行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>
组织
系统
/home/demo/logs/${organization}/org.log
%-5级别%date{dd.MM.yyyy.HH:MM:ss}-组织:%mdc{Organization}-%logger{35}[%L]-%msg%n
/home/demo/logs/${organization}/org.%d{dd.MM.yyyy}.%i.log
30
10MB
您为什么要这样做?你能再解释一下吗?我不想让主机名和java服务这样的系统配置直接依赖。如果我能从数据库中得到这些值,我不会;我的java服务和syslog服务配置之间没有任何依赖关系。如果我想更改syslog配置,我可以在数据库中进行更改,这将反映在这里。我不确定在数据库中放置日志配置是否是一种方法。对于syslogHost,您可以通过参数设置它,然后将其从代码传递到记录器。看这里,也许对你有帮助。“对于syslogHost,您可以通过参数设置它,然后将其从代码传递到记录器。”您能解释一下如何执行此操作吗?