2017-05-26 80 views
1

目前我有一個彈簧啓動應用程序,並像SampleClass每個類,我想有一個日誌我需要初始化這樣的記錄:動態登錄Spring框架

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

這意味着,我們需要靜態發送類名到getLogger方法。 我正在考慮創建一個可登錄接口,每當一個類實現了這個接口時,它就會動態地找到這個類的名稱並且正確地將這個記錄寫入輸出流並輸入正確的類名。 我搜索了一個合適的解決方案,但每個例子都是在編譯時特別發送類名。春天有這個能力嗎?

+0

看看https://stackoverflow.com/questions/3923971/why-calling-loggerfactory-getlogger-every-time-is-not-recommended! –

+0

不,但我創建了一個ILoggable接口,我創建了一個與鏈接中提到的方式相同的日誌對象。創建了一個Log類並實現了ILoggable。當我在Log類中使用日誌對象時,輸出表明日誌屬於ILoggable而不是Log類。輸出是類似這樣的「cccservice.ILoggable:test」而不是「cccservice.Log:test」 – Reza

+1

你有2個選擇:要麼使用私有靜態最終記錄器LOG = LoggerFactory.getLogger(MethodHandles.lookup()。lookupClass ())'作爲你的日誌定義,你可以在IntelliJ Idea(Eclipse有類似的東西)中聲明爲活動模板,並且在輸入模板詞時,IDE將用propper代碼替換這個詞,或者使用項目Lombok並定義簡單['@ Log','@ Slf4j',...](https://projectlombok.org/features/Log.html)關於課程級別的註釋 –

回答

1

創建一個新的@Log註釋。

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

現在實行BeanPostProcessor這使我們postProcessBeforeInitialization方法,它使我們能夠初始化之前管理的bean。我們搜索@Log註釋並注入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; 
    } 
} 

,並使用@Log標註在現場級來形容,我們要注入的記錄器。

@Log 
private Logger logger; 
+0

這也是一個好主意。 – Reza

1

我建議使用龍目島@log的變體光盤在您的項目,它會自動在編譯時

如果您正在使用SLF4J使用@ SLF4J

設置它的最好的辦法,甚至春季內部使用在一些項目中

+0

這可能是一個很好的解決方案。我需要在類中定義一個日誌變量還是添加它? – Reza

+0

IDE如何對待它。他們是否知道像log和getter/setter這樣的變量,或者我需要做一些額外的工作? – Reza

+0

在IDE中,一旦你添加了lombok,雙擊jar,它會詢問IDE的位置,然後設置它。之後,乾淨啓動IDE它會自動取值 – rajadilipkolli