2017-05-26 2 views
1

Derzeit eine Feder Boot-Anwendung und für jede Klasse wie SampleClass, dass ich habe würde ich ein Protokoll ich den Logger wie diese, müssen sie gerne initialisieren:Dynamisch im Frühjahr Rahmen Anmeldung

private static Logger log = LoggerFactory.getLogger(SampleClass.class); 

was bedeutet, dass Wir müssen den Klassennamen statisch an die Methode getLogger senden. Ich dachte daran, eine loggable Schnittstelle zu erstellen und jedes Mal, wenn eine Klasse diese Schnittstelle implementiert, findet sie dynamisch den Klassennamen und schreibt das Protokoll korrekt in den Ausgabestrom mit dem korrekten Klassennamen. Ich googelte, um eine richtige Lösung zu finden, aber jedes Beispiel sendet speziell den Klassennamen in der Kompilierzeit. Hat der Frühling diese Fähigkeit?

+0

Werfen Sie einen Blick auf https://stackoverflow.com/questions/3923971/why-calling-loggerfactory-getlogger-every-time-is-not-recommended! –

+0

Nein, aber ich habe eine Schnittstelle ILOgable erstellt und ich habe ein Protokoll-Objekt auf die gleiche Weise wie in der Verknüpfung erwähnt erstellt. Erstellt eine Protokollklasse und implementiert ILoggable. Wenn ich das Log-Objekt innerhalb der Log-Klasse verwende, sage ich, dass das Log zu ILoggable anstatt zur Log-Klasse gehört. die Ausgabe ist etwas wie diese "cccservice.ILogable: test" statt "cccservice.Log: test" – Reza

+1

Sie haben 2 Optionen: entweder verwenden private statische endgültige Logger LOG = LoggerFactory.getLogger (MethodHandles.lookup(). LookupClass()) 'als Ihre Protokolldefinition, die Sie als Live-Vorlage in IntelliJ Idea deklarieren können (Eclipse hat etwas Ähnliches) und beim Eingeben Ihres Vorlagenworts ersetzt die IDE dieses Wort durch den passenden Code oder verwendet Projekt Lombok und definiert a einfache ['@ Log',' @ Slf4j', ...] (https://projectlombok.org/features/Log.html) Annotation auf Klassenebene –

Antwort

1

Erstellen Sie eine neue @Log Annotation.

@Documented 
@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Log {} 

nun die BeanPostProcessor implementieren, die uns die postProcessBeforeInitialization Methode gibt, die uns eine Bohne vor der Initialisierung zu verwalten. Wir suchen nach der @Log Annotation und injizieren eine Implementierung mit der LoggerFactory.

@Component 
public class LoggerPostProcessor implements BeanPostProcessor { 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     ReflectionUtils.doWithFields(bean.getClass(), new ReflectionUtils.FieldCallback() { 
      public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { 
       Logger log = LoggerFactory.getLogger(bean.getClass()); 
       ReflectionUtils.makeAccessible(field); 
       field.set(bean, log); 
      } 
     }, new ReflectionUtils.FieldFilter() { 
      @Override 
      public boolean matches(Field field) { 
       return field.isAnnotationPresent(Log.class); 
      } 
     }); 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     return bean; 
    } 
} 

Und verwenden Sie die @Log Anmerkung auf der Feldebene zu beschreiben, dass wir einen Logger injizieren wollen.

@Log 
private Logger logger; 
+0

das ist auch eine gute Idee. – Reza

1

Ich empfehle Lombok @Log varient in Ihrem Projekt zu verwenden, wird es bei der Kompilierung

automatisch Wenn Sie slf4j Verwendung @ SLF4J

verwenden Es ist am besten Ansatz und sogar Feder verwendet intern in einigen Projekten

+0

Das könnte eine gute Lösung sein. Muss ich eine Protokollvariable innerhalb der Klasse definieren oder hinzufügen? – Reza

+0

Auch wie IDE es behandeln. Kennen sie die Variablen wie Log und Getter/Setter oder muss ich etwas mehr arbeiten? – Reza

+0

In der IDE, sobald Sie Lombok hinzufügen doppelklicken Sie auf jar und es wird nach dem IDE-Speicherort fragen, dann legen Sie es fest. nach diesem clean start IDE wird es automatisch Werte – rajadilipkolli

Verwandte Themen