自从我开始使用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
变量而不产生所有开销是否安全?
答案 0 :(得分:2)
好的回答你的问题 - 这取决于。
如果您将记录器的范围限定为会话作用域,则是,每个会话将拥有自己的记录器。该记录器需要是可序列化的(并且它们通常不是,因为它们后面有文件句柄)。
我所做的 - 除了拥有自己的记录器外观 - 就是让它们成为应用程序的范围。通常,幕后记录器高度同步(多个调用者写入单个appender),更改排队并定期写入。您可以使用应用程序范围的记录器,这将大大减少过头。