【发布时间】:2010-09-10 01:46:04
【问题描述】:
我正在使用带有 Log4J 的 Java 1.4。
我的一些代码涉及序列化和反序列化值对象 (POJO)。
我的每个 POJO 都声明了一个记录器
private final Logger log = Logger.getLogger(getClass());
序列化程序抱怨 org.apache.log4j.Logger 不是可序列化的。
我应该使用
private final transient Logger log = Logger.getLogger(getClass());
改为?
【问题讨论】:
-
您可以问自己几个问题并添加为您的问题的编辑。你的想法是什么,反对让它短暂?瞬态是什么意思?
-
我应该提到,我喜欢为每个实例而不是为每个类一个记录器的想法。我将有许多由容器(例如 Spring 应用程序上下文)实例化和管理的同一类的实例,并且希望基于每个 bean 而不是基于每个类来切换日志记录级别。在 Spring 应用程序上下文的示例中,记录器将被声明为类似于 private final transient Logger log = Logger.getLogger(getBeanName()); bean 不再是 POJO 并实现 BeanNameAware
-
另见the SLF4J FAQ:“类的记录器成员应该声明为静态的吗?[...] 总之,将记录器成员声明为静态变量需要更少的 CPU 时间并且具有内存占用略小。[...] 但是,实例变量可以为每个应用程序创建不同的记录器环境,即使对于在共享库中声明的记录器也是如此。也许比前面提到的考虑更重要的是,实例变量是 IOC 友好的,而静态变量不是。”
-
开始使用 SLF4J 并自动处理序列化:“从 SLF4J 版本 1.5.3 开始,记录器实例在序列化过程中仍然存在。因此,主机类的序列化不再需要任何特殊操作,即使当记录器被声明为实例变量时。在以前的版本中,记录器实例需要在宿主类中声明为瞬态。”(参见 [SLF4J 常见问题解答] (slf4j.org/faq.html))
标签: java logging serialization log4j