2016-09-01 28 views
1

テナントログを異なるファイルに記録するマルチテナント互換ロギングを実装しようとしていますおよびをテナントごとに個別に設定できます。テナントごとにカスタム設定を使用したSpring Logbackマルチテナント実装

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を定義する方法についての概念を持っていません。

私は基本を超えた良い例は見つかりません - ご意見はありますか?

答えて

1

あなたは運が悪いので、自分でアペンダーを実装する必要があります。それはあまりにも困難ではありません。インターフェイスはかなり単純です:あなたが追加したファイルを判別することができますgetMDCPropertyMap、そこから:

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

あなたはLoggingEventこのメソッドを持っているdoAppendでを取得します。 もし私があなただったら私はおそらくファイルを扱うことに根ざしたことにはならず、実際には普通のRollingFileAppenderというマップを持っていました。ヒントについて

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

感謝を - 私はちょうどあなたがアペンダは私の目的のために十分な提供と思います「SiftingAppender」を見つけ:だからあなたのdoAppend方法は、次のようになりますか? –

+0

ええ、それは基本的に私が説明していることです、あなたはその1つに基づいてアペンダーを実装することができます – Ulises

+0

ありがとう! - 最後の質問:TenantAのために別のログレベルをTenantBよりも持っていたいのであれば、各要求の始めにプログラムレベルでログレベルを設定すれば十分ですか?私はここで並列要求に問題がありますか? –

関連する問題