使用每个租户自定义配置的Spring Logback多租户实现

使用每个租户自定义配置的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

我正在尝试实现一个多租户兼容的日志记录,它将每个租户的日志记录在不同的文件中,并且可以为每个租户单独配置

我在Maven版本中使用了Spring Boot,其中包含SLF4j和Logback

为了为每个租户实现不同的文件,我使用MCP为每个请求设置租户标识符

 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);
}