java - 防止在 SessionScoped beans 中序列化 CDI 注入(inject)的 Logger

标签 java logging cdi slf4j xrebel

自从我开始使用 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/

相关文章:

java - AppEngine ChannelAPI 警告 : No file found for:/_ah/channel/connected/

java - jvm优化可以改变指令顺序吗?

c++ - 在 C++ 中解析字符串

java - 如果没有 Web 层并因此没有 HTTP session ,CDI 是否有意义?

java - 如何在Android Studio中的Gradle中获取JDK路径?

c# - 识别 Facebook 域模型中的实体和值对象

java - EntityManager 总是返回 null

tomcat - CDI/焊接网络应用程序的有用环境

java - 从 ResultSet 获取列宽度/长度的最简单方法 - 我必须迭代吗?

java - Log4j2 多个记录器具有相同的附加程序但文件名不同