自从我开始使用 XRebel 以来,我就想知道以下问题:
我们开始替换我们的记录器 (SLF4J) 字段:
private static final Logger log = LoggerFactory...;
至
@Inject
private Logger log;
与相应的@Produces
生产者。
这通常工作得很好,但我想知道 @SessionScoped
beans 的大小。他们现在总是有一个自己的记录器,根据 XRebel 的说法,为每一个 Bean 添加大约 900k。
现在,SLF4J LoggerFactory.getLogger(Class clazz)
做到了,according to the docs ,
Return a logger named corresponding to the class passed as parameter, using the statically bound ILoggerFactory instance
但我不太确定这是如何一起发挥作用的。
所以我的问题是:容器是否真的在每个 session bean 的每个实例中都有一个记录器,从而在 session 大小方面产生相当大的开销,或者使用 @Inject 变体而不产生任何开销是否安全所有这些开销?
最佳答案
可以回答您的问题 - 这取决于情况。
如果您将记录器的范围设置为 session 范围,那么是的,每个 session 都会有自己的记录器。该记录器需要可序列化(通常不是,因为它们后面有文件句柄)。
除了拥有自己的记录器外观之外,我所做的就是使它们具有应用程序范围。通常,在幕后记录器是高度同步的(多个调用者写入单个附加程序),更改会排队并定期写入。您可以使用应用程序范围的记录器,这将大大减少开销。
关于java - 防止在 SessionScoped beans 中序列化 CDI 注入(inject)的 Logger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30238034/