2017-05-26 86 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