有没有一种简单的方法为每个类创建一个记录器实例?

我现在使用静态方法来记录(因为我发现登录Android非常容易),但现在我需要为不同的类配置不同的appender,所以我遇到了静态日志记录方法的问题。

我读了Log4J:创建Logger实例的策略 ,我注意到我现在是时候更改日志记录策略了,所以我需要以下代码到我的类,需要一个特殊的记录器。

private static final Logger logger = Logger.getLogger(XXXX.class); 

我觉得既然这是重复的工作,那么我们有什么方法可以避免向每个类添加重复的代码,或者只是编写更少的代码。 AOP或dependency injection可以做这样的工作吗?

我正在使用log4j和Spring,但是其他任何方法都将受到高度赞赏。

是的,你可以。

  • 创建自定义注释,如@Logger

     @Retention(RUNTIME)//will be used at runtime, so retain till runtime @Target(FIELD)//field level annotation public @interface Logger { } 
  • 在由Spring注入的bean中将您的Logger字段注释为@Logger。

     @Logger private Logger logger; 

    在这里你可以使用slf4j logger,但你可以直接使用log4j等。看看我如何在这里注释logger。 这是由Spring创建的bean内部。

  • 使用名为BeanPostProcessor的Spring生命周期接口和使用reflection utils类的方法postProcessBeforeInitialization来注入记录器。

     public class LoggerInjector implements BeanPostProcessor { /** * Return the bean itself. */ public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException { return bean; } /** * For all beans before initialization, inject the logger using slf4j. * @param bean * @param beanName * @return returns same bean by injecting logger. */ public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException { ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() { public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException { ReflectionUtils.makeAccessible(field); if (field.getAnnotation(Logger.class) != null) { if (field.get(bean) == null) { final Logger logger = LoggerFactory.getLogger(bean.getClass()); field.set(bean, logger); } } } }); return bean; } } 
  • 完成后,让Spring知道您有一个记录器注入器,如:

      

确实是一个“重复的工作”,要为每个需要一个类的类添加一个记录器 – 但是,请记住,即使使用dependency injection,您仍然需要声明方法变量(在您的情况下为“logger”)。 所以,它不会为你节省太多打字。

我还建议您使用日志外观(如SLF4J )和底层实现(如logback)。 Logback是由log4j的同一作者编写的,但由于这些原因更好。 如果您确实选择了这条路线(在您的应用中使用SLF4J),请记住将jcl-over-slf4j添加到您的类路径(可能在您的pom文件中),因为您使用的是Spring。

再次关于日志记录策略,可能值得查看Logback文档中引用的演示应用程序。 示例代码,与您的代码类似,仅使用日志记录外观:

 Logger logger = LoggerFactory.getLogger(LoginAction.class); 

您可以尝试使用Lombok项目。 你只需要将lombok库添加到你的类路径中,当然你也需要log4j库。 并在类级别使用@Slf4j注释,然后您应该能够编写这样的日志消息。 log.info("message")而不创建静态记录器实例。

更多信息,请访问http://projectlombok.org/features/Log.html

可以使用工厂方法为您需要的每个记录器在您的上下文中添加一个记录器bean(虽然这不是通常的方法):

    

然后你可以简单地注入你的记录器:

 @Autowired private Logger logger;