2016-07-24 50 views
0

Ich bin irgendwie neu in Logging, und ich habe ein Projekt gestartet, für das ich Logback gewählt habe.SLF4J und Logback: Logger auf autowired Dienste propagieren

Ich habe folgende logback.xml Konfiguration

<?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> 

I 2 Services haben (Boo und Bar), in zwei verschiedenen Paketen. Ich habe einen Appender für jeden von ihnen konfiguriert, und die Protokollierung für diese Dienste funktioniert gut.

Dies ist das Problem, mit dem ich konfrontiert bin.

Beide Dienste (Boo und Bar) eine autowired Abhängigkeit eines dritten Service (Tee), für die es keine appender definiert. Der Tee Service ist auf com.foo.tee

Ich möchte nicht ein eindeutiges Protokoll für die 3 Dienste haben, da sie verschiedene Dinge tun und zu unterschiedlichen Zeiten ausgeführt werden.

Gibt es eine Möglichkeit, Tee Dienstprotokollierung zu Boo oder Bar Appenders, je nachdem, welcher Dienst (Boo/Bar) diesen Dienst genannt?

Im Grunde, was ich erreichen will ist

  • Bar hat eine T-Abhängigkeit. Wenn Bar eine T-Methode aufruft, sollte die Protokollierung dieser Methode nur in Bar-Logger geschrieben werden.
  • Boo hat auch eine T-Abhängigkeit. Wenn Boo, der ein T-Methode aufruft, sollte diese Methode der Protokollierung geschrieben werden Logger Boo nur
  • Bar und Boo Protokolle schreiben, um verschiedene Dateien und Protokollierung Tee sollte nur auf seine „Invocator“ angehängt werden log

Ich möchte, dass dies Kontext für die Operation hat, die ausgeführt wird, da es eine dritte Protokolldatei für T-Stück erschwert, zu verfolgen, woher ein Anruf kam.

Danke!

PS: Ich habe versucht, eine vorherige Antwort darauf zu finden, aber ich weiß nicht, ob ich mit den falschen Schlüsselwörtern suchte oder ob das nicht erreicht werden kann.

+0

nicht wirklich sicher, was los ist, aber wenn Sie Lombok zu Ihrem Projekt installieren, alles, was Sie tun müssen, um Logger zu bekommen, ist Annotate-Klasse mit @ Slf4j. Schaut hinein, viel Glück. – Sarief

+0

@Sarief ein bisschen Overkill, da es nur eine einzige Zeile ersetzt 'private final Loggerlog = LoggerFactory.getLogger (getClass())' – OrangeDog

+0

@OrangeDog vielleicht, aber für mich war es wie: installieren und verwenden. auch keine Notwendigkeit für diese Linie, wie es meiner Meinung nach Overkill ist: D – Sarief

Antwort

1

So haben Sie konfiguriert drei Logger

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

Wenn Sie einige Klasse wollen, sind nicht in der Bar/Boo-Paket, um den Bar/Boo-Logger zu verwenden, dann müssen Sie nicht seinen eigenen Logger verwenden.

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

Beachten Sie auch, dass Logger-Namen eigentlich keinem Paket- oder Klassennamen entsprechen müssen.

Wenn der Logger vom Anrufer abhängig sein soll, sollte der Anruf einen Logger enthalten.

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

Also, Logback kann nicht bestimmen, den Logger zu verwenden, je nachdem, wer Tee genannt, richtig? In diesem Fall wird, wenn Boo Tee aufruft, die Tee-Protokollierung in Bar-Log ausgegeben. –

+0

Der Logger, der verwendet wird, ist der Logger, den Sie verwenden. Es gibt keine Magie irgendwo. – OrangeDog

+0

Danke @OrangeDog, ich habe gerade versucht ID herauszufinden, dass es von Magie existiert, denn ich bin irgendwie neu in Logging Frameworks und so etwas wäre für mich sehr nützlich gewesen. Ich hatte bereits vor, Ihren Vorschlag zu verwenden, wollte aber wissen, ob es etwas zu vermeiden gibt. Vielen Dank! –