2016-07-24 58 views
0

我對記錄很陌生,而且我已經開始了一個我選擇了Logback的項目。SLF4J和Logback:傳播記錄到自動佈線服務

我有以下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> 

我有2個服務(BooBar),兩種不同的封裝。我爲他們每個人配置了一個appender,並且這些服務的日誌記錄工作正常。

這是我面臨的問題。

這兩種服務(BooBar)都具有第三個服務(Tee)的自動佈線依賴關係,沒有定義appender。 Tee服務位於com.foo.tee

我不想爲3個服務有獨特的日誌,因爲他們做不同的事情,並在不同的時間運行。

有沒有辦法將服務日誌記錄到Boo或Bar appen,具體取決於哪種服務(Boo/Bar)稱爲此服務?

基本上,我想實現的是

  • 酒吧有一個三通的依賴。如果Bar調用Tee方法,該方法的日誌記錄應該只寫入Bar記錄器
  • Boo也有Tee依賴關係。如果噓調用一個三通方法,該方法的記錄應寫入噓記錄儀只有
  • 酒吧和噓聲日誌寫入到不同的文件,三通記錄應該只被追加到它的「調用器」登錄

我希望這樣做可以使正在執行的操作具有上下文,因爲具有第三個Tee日誌文件使得難以追蹤來自何處的呼叫。

謝謝! PS:我試圖找到一個以前的答案,但我不知道我是否用錯誤的關鍵字搜索,或者如果這不能完成。

+0

不確定發生了什麼事情,但是如果您將lombok安裝到您的項目中,那麼您只需使用@ Slf4j就可以獲得記錄器的註釋類。看看它,祝你好運。 – Sarief

+0

@Sarief有點矯枉過正,因爲它只替換一行'private final Logger log = LoggerFactory.getLogger(getClass())' – OrangeDog

+0

@OrangeDog也許,但對我來說,它就像是:install and use。也沒有必要爲thsi線,因爲它在我看來是矯枉過正:D – Sarief

回答

1

那麼你已經配置了3個伐木者

  • com.foo.bar
  • com.foo.boo

如果你在想一些類不bar/boo包使用bar/boo記錄器,那麼你就不需要使用自己的記錄器。

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

另請注意,該記錄器名稱實際上並不需要實際上對應於任何包或類名稱。

如果你希望記錄器依賴於調用者,那麼調用應該包括一個記錄器。

class Tee { 
    public void doSomething(Logger log) { 
+0

所以,Logback無法確定記錄器的使用取決於誰叫Tee,對吧?在這種情況下,如果Boo調用Tee,則Tee日誌記錄將被輸出到Bar日誌。 –

+0

使用的記錄器是您使用的記錄器。沒有魔法的地方。 – OrangeDog

+0

謝謝@OrangeDog,我只是想知道id是否存在魔法,因爲我對日誌記錄框架有點新,而對於我來說,這樣做會非常有用。我已經計劃使用你的建議,但想知道是否有什麼可以避免它。謝謝! –