我有这样的类结构:
public class Worker {
private Parser parser;
private Validator validator;
private Feeder feeder;
//...
}
Parser
,Validator
和Feeder
都是具有不同实现类的接口。这些字段在Worker的实例化的上下文中实例化,并且不在工作者之间共享。
我想要做的是为每个Worker创建一个org.slf4j.Logger
实例,然后根据需要由解析器,验证器和馈送器使用。基本上,在实例化时,我们想给Worker命名,然后让所有日志记录使用该名称,如下所示:
org.slf4j.LoggerFactory.getLogger(workerName)
理想情况下,我希望找到这样的解决方案:
public class XmlParser implements Parser {
@Autowired
private Logger logger;
//...
}
然后将Spring Framework的自动装配功能配置为在属于同一Worker的所有对象中使用相同的Logger实例。显然,不同的工作人员应该获得不同的Logger实例。强制所有三个接口Parser
,Validator
和Feeder
指定一个setLogger()
类型的方法,至少可以说是不优雅的。
如何使用一些聪明的依赖注入解决方案完成此任务?
答案 0 :(得分:0)
我认为在没有太多Spring魔术的情况下实现这一目标的最简单方法就是像往常一样在工人中创建记录器:
final static Logger logger = LoggerFactory.getLogger("workerName");
然后让您的工作人员在不同的组件中设置此记录器。如果您的组件是由Spring注入的,请让您的工作人员实现InitializingBean并在 afterPropertiesSet()中设置记录器。
如果您真的想要更加动态地执行此操作,请查看this example,其中使用BeanPostProcessor和反射来注入正确的记录器。
答案 1 :(得分:0)
尝试为您的员工设置MDC值。如果您的目标是区分不同标记生成的日志,那么设置MDC可能就足够了。如果您希望将不同工作人员生成的日志转到不同的文件,那么请使用 看一下SiftingAppender和MDCBasedDiscriminator。