防止在SessionScoped bean中

时间:2015-05-14 12:58:38

标签: java logging cdi slf4j xrebel

自从我开始使用XRebel以来,我想知道以下内容:

我们开始从:

替换我们的记录器(SLF4J)字段
private static final Logger log = LoggerFactory...;

@Inject
private Logger log;

与相应的@Produces制作人。

这一般工作正常,但我想知道@SessionScoped bean的大小。他们现在总是拥有一个自己的记录器,根据XRebel添加大约900k到每个豆子。

现在,SLF4J LoggerFactory.getLogger(Class clazz)执行,according to the docs

  

返回一个名为对应于作为参数传递的类的记录器,   使用静态绑定的ILoggerFactory实例

但我不确定,这是如何共同发挥的。

所以我的问题是:容器在每个会话bean的每个实例中确实都有一个记录器,在会话大小上产生了相当大的开销,或者使用@Inject变量而不产生所有开销是否安全?

1 个答案:

答案 0 :(得分:2)

好的回答你的问题 - 这取决于。

如果您将记录器的范围限定为会话作用域,则是,每个会话将拥有自己的记录器。该记录器需要是可序列化的(并且它们通常不是,因为它们后面有文件句柄)。

我所做的 - 除了拥有自己的记录器外观 - 就是让它们成为应用程序的范围。通常,幕后记录器高度同步(多个调用者写入单个appender),更改排队并定期写入。您可以使用应用程序范围的记录器,这将大大减少过头。