2016-07-24 1 views
0

私はLoggingの初心者です。私はLogbackを選択したプロジェクトを開始しました。SLF4JとLogback:ロガーを自動ワイヤードサービスに伝える

私は、私は2つの異なるパッケージで、2つのサービス(BooBar)を持って、次のlogback.xml設定

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
      <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="BARLOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${LOG_HOME:-/repository/logs}/bar.log</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>${LOG_HOME:-/repository/logs}/bar.%d{yyyy-MM-dd}.log</fileNamePattern> 
      <maxHistory>30</maxHistory> 
     </rollingPolicy> 
     <encoder> 
      <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="BOOLOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${LOG_HOME:-/repository/logs}/boo.log</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>${LOG_HOME:-/repository/logs}/boo.%d{yyyy-MM-dd}.log</fileNamePattern> 
      <maxHistory>30</maxHistory> 
     </rollingPolicy> 
     <encoder> 
      <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <logger name="com.foo.bar" level="debug" additivity="false"> 
     <appender-ref ref="BARLOGGER" /> 
    </logger> 

    <logger name="com.foo.boo" level="debug" additivity="false"> 
     <appender-ref ref="BOOLOGGER" /> 
    </logger> 

    <root level="error"> 
     <appender-ref ref="STDOUT" /> 
    </root> 

</configuration> 

を持っています。私はそれぞれにアペンダーを設定しており、これらのサービスのロギングは正常に機能します。

これは私が直面している問題です。

両方サービス(BooBar)が定義されたアペンダがないいる第三のサービス(Tee)のautowired依存性を有しています。 Teeサービスはcom.foo.teeにあります

私は3つのサービスに一意のログを持たせたくありません。異なるサービスと異なる時間に実行するためです。

このサービスと呼ばれるサービス(Boo/)に応じて、TeeサービスロギングをBooまたはBarアペンダに含める方法はありますか。

基本的に、私が達成したいことはバーティーの依存関係を持ってい

  • です。 BarがTeeメソッドを呼び出す場合、そのメソッドのロギングはBar loggerにのみ書き込む必要があります
  • BooにはTee依存関係もあります。ブーはティーメソッドを呼び出すと、そのメソッドのロギングが
をログのみ
  • バーとブーログが別のファイルへの書き込み、およびティーロギングが唯一の「invocator」に追加する必要がありますロガーをブーイングするために記述する必要があります

    Tee用の3番目のログファイルでは、どこから呼び出しが発生したのかを追跡することが困難になるため、これを実行するためのコンテキストが必要になります。

    ありがとうございます!

    PS:これまでの回答を見つけようとしましたが、間違ったキーワードで検索しているのか、それともできないのか分かりません。

  • +0

    あなたのプロジェクトにロンボクをインストールした場合、ロガーを取得するために必要なのは、@ Slf4jの注釈クラスです。それを見て、幸運。 – Sarief

    +0

    @Sarief少し余計に1行だけを置き換えます。 'private final Logger log = LoggerFactory.getLogger(getClass())' – OrangeDog

    +0

    @OrangeDogかもしれませんが、私にとってはインストールと使用のようでした。 D – Sarief

    答えて

    1

    あなたには、いくつかのクラスを望んでいないにしているので、もしあなたが3つのロガー

    • com.foo.bar
    • com.foo.boo
    • ルート

    を構成しましたbar/booロガーを使用するには、独自のロガーを使用しないでください。

    class Tee { 
        private final Logger log = LoggerFactory.getLogger(Bar.class); 
    

    実際には、ロガー名は実際にはパッケージやクラス名に実際に対応する必要はありません。

    ロガーを発信者に依存させる場合は、コールにロガーが含まれている必要があります。

    +0

    だから、Logbackは誰がTeeを呼び出したかによって使用するロガーを決定することはできません。この場合、BooがTeeを呼び出すと、TeeのログがBarログに出力されます。 –

    +0

    これは、使用するロガーを使用するロガーです。どこでも魔法はありません。 – OrangeDog

    +0

    @OrangeDogありがとう、私は魔法のindが存在していることをIDで確認しようとしていました。私はフレームワークを記録するのが初めてなので、とても役に立ちました。私はあなたの提案を使用することをすでに計画していましたが、それを避ける何かがあるかどうかを知りたがっていました。ありがとう! –

    関連する問題