【问题标题】:Spring Logback multitenancy implementation with custom config per tenantSpring Logback 多租户实现,每个租户都有自定义配置
【发布时间】:2016-09-01 06:20:35
【问题描述】:

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

我在带有 SLF4j 和 Logback 的 Maven 构建中使用 Spring Boot。

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

 MDC.put("tenant", "tenant-" + tenant_id);

现在可以像这样轻松注销租户

<encoder>
    <pattern>%X{tenant} %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
</encoder>

但是,我无法将它们放在不同的文件中。此外,我对如何定义每个租户的 logback xml 没有任何概念。

我找不到任何超越基础知识的好例子 - 你有什么建议吗?

【问题讨论】:

    标签: spring maven logback multi-tenant


    【解决方案1】:

    你运气不好,你将不得不实现自己的附加程序。不过应该不会太难。界面非常简单:

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

    您将在doAppend 中获得一个LoggingEvent,它具有以下方法:getMDCPropertyMap,您可以从中区分要附加到哪个文件。 如果我是你,我可能不会深入处理文件,实际上会有一张普通的RollingFileAppender 的地图。所以你的 doAppend 方法可能如下所示:

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

    【讨论】:

    • 感谢您的提示 - 我刚刚找到“SiftingAppender”,您认为 appender 为我的目的提供了足够的功能吗?
    • 是的,它基本上就是我所描述的,你可以基于那个来实现你的appender
    • 谢谢! - 最后一个问题:如果我想为 TenantA 设置比 TenantB 的另一个日志级别 - 在每个请求开始时以编程方式设置日志级别是否足够?我在这里遇到并行请求的问题吗?
    • 是的,我的意思是,每个附加程序都可以有自己的配置,它们可以是附加程序与它们自己的级别的任意组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2021-12-11
    • 1970-01-01
    • 2021-03-04
    • 2023-03-07
    相关资源
    最近更新 更多