使用每个租户自定义配置的Spring Logback多租户实现
我正在尝试实现一个多租户兼容的日志记录,它将每个租户的日志记录在不同的文件中,并且可以为每个租户单独配置 我在Maven版本中使用了Spring Boot,其中包含SLF4j和Logback 为了为每个租户实现不同的文件,我使用MCP为每个请求设置租户标识符使用每个租户自定义配置的Spring Logback多租户实现,spring,maven,logback,multi-tenant,Spring,Maven,Logback,Multi Tenant,我正在尝试实现一个多租户兼容的日志记录,它将每个租户的日志记录在不同的文件中,并且可以为每个租户单独配置 我在Maven版本中使用了Spring Boot,其中包含SLF4j和Logback 为了为每个租户实现不同的文件,我使用MCP为每个请求设置租户标识符 MDC.put("tenant", "tenant-" + tenant_id); 现在可以像这样轻松地注销租户 <encoder> <pattern>%X{tenant} %d{HH:mm:ss.SSS
MDC.put("tenant", "tenant-" + tenant_id);
现在可以像这样轻松地注销租户
<encoder>
<pattern>%X{tenant} %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
</encoder>
%X{tenant}%d{HH:mm:ss.SSS}[%thread]-5级别%logger{5}-%msg%n
但是,我无法将它们放在不同的文件中。此外,对于如何定义每个租户的LogbackXML,我没有任何概念
我找不到任何超越基础的好例子-你有什么建议吗?你运气不好,你必须实现自己的appender。不过应该不会太难。界面非常简单:
public interface Appender<E> extends LifeCycle, ContextAware, FilterAttachable<E> {
/**
* Get the name of this appender. The name uniquely identifies the appender.
*/
String getName();
/**
* This is where an appender accomplishes its work. Note that the argument
* is of type Object.
* @param event
*/
void doAppend(E event) throws LogbackException;
/**
* Set the name of this appender. The name is used by other components to
* identify this appender.
*
*/
void setName(String name);
}
谢谢你的提示-我刚刚找到了“筛选appender”,你认为appender为我的目的提供了足够的功能吗?是的,它基本上符合我所描述的,你可以基于这一点来实现你的appender最后一个问题:如果我想让TenantA拥有比TenantB更多的日志级别,那么在每个请求开始时通过编程设置日志级别就足够了吗?我在这里遇到并行请求的问题吗?是的,我的意思是,每个appender都可以有自己的配置,它们可以是任意组合的appender,它们有自己的级别。
private Map<String, Appender> appenders = new ConcurrentHashMap<>();
void doAppend(LoggingEvent event) {
String tenant = event.getMDCPropertyMap().get("tenant");
Appender appender = appenders.get(tenant);
if(appender == null) { //may need to synchronize, careful
appender = initTenantAppender(tenant);
appenders.put(tenant, appender);
}
appender.doAppend(event);
}