我们将应用程序从自己的小型日志记录组件移至Log4j2。在我们最大的安装中,该应用程序每天可运行约60.000个工作。
我们编写了自己的Appender,它使用Hibernate写入数据库(请参阅InnovaIntegrationsportalHibernateAppender)。
在运行约36小时后,JVM因内存不足异常/错误(OOME)而崩溃,分析hprof后,我发现有763.5MB的org.apache.logging.log4j.core.appender.AbstractManager类。
查看随附的分析屏幕截图(2019-04-12 13_20_45-eclips ...)
https://issues.apache.org/jira/browse/LOG4J2-2589
更深入地讲,我尝试在测试类中重构行为并分析其结果(请参见屏幕截图1)。
对我来说似乎是内存泄漏。
InnovaIntegrationsportalHibernateAppender
package de.itout.innova.log4j.innova_log4j_appender;
import de.itout.innova.ssp.entities.ssp.entities.*;
import de.itout.jpa.util.*;
import java.io.*;
import java.util.*;
import javax.persistence.*;
import org.apache.logging.log4j.core.*;
import org.apache.logging.log4j.core.appender.*;
import org.apache.logging.log4j.core.config.plugins.*;
import org.apache.logging.log4j.core.layout.*;
/**
*
* @author swendelmann
*/
@Plugin(name = "InnovaIntegrationsportalHibernateAppender", category = "Core", elementType = "appender")
public class InnovaIntegrationsportalHibernateAppender extends AbstractAppender
{
private String schnittstelle;
private String version;
private String laufId;
private EntityManager em;
public InnovaIntegrationsportalHibernateAppender(String name, Filter filter, Layout<? extends Serializable> layout)
{
super(name, filter, layout);
}
public InnovaIntegrationsportalHibernateAppender(String name, …Run Code Online (Sandbox Code Playgroud) 我在一家多公司集团工作。每家公司都有自己的网络、自己的 IT 管理员,因此也有自己的 Active-Directory。无法通过 VPN 连接不同的网络,例如公司的用户可以从他们的电子邮件域中识别,例如 jdoe@company-a.com 和 jdoe@company-b.com
我的目标是为整个公司集团开发一个全球应用程序。
我想使用 Keycloak 作为身份和访问管理。
问题在于,所有公司的每个用户(属于定义组的成员)都必须有权访问/登录/授权到集中式前端和分散式后端(自编程 API 代理/网关)。
下面是目前的情况图:
建议:
在此先感谢您的帮助 :)
我用 2.14.0 和 2.13.3 对此进行了测试,我将 JDBC Appender 与 DynamicThresholdFilter 结合使用,并尝试了普通的 Logger 和 AsyncLogger。
在 JDBC Appender 中,我还尝试了 PoolingDriver 和 ConnectionFactory 方法。
事实证明,由于 Log4j2,线程没有并行启动。
使用 AsyncLogger 甚至使情况变得更糟,因为输出表示 Appender 未启动,并且在 15.000 条预期日志中,数据库中只有 13.517 条。
为了重现这个问题,我做了一个 github repo 在这里看到:https : //github.com/stefanwendelmann/Log4j_JDBC_Test
编辑
我用 h2db 替换了 mssql-jdbc,并且线程不会阻塞。JMC 自动分析说有JdbcDatabaseManager 的锁定实例。
我的 mssql-jdbc 的 PoolableConnectionFactory 中是否存在任何配置问题,或者 dbcp/jdbc 驱动程序池是否存在一般问题?
编辑 2
在 Apaches LOGJ2 Jira 上创建票证:https ://issues.apache.org/jira/browse/LOG4J2-3022
编辑 3
为 mssql 和 h2:file 添加了更长的飞行记录
我想知道哪个方法或哪个类称为构造函数MyClass.
public class MyClass
{
private static int instCount = 0;
public MyClass()
{
instCount++;
System.out.println("MyClass Konstruktor wurde aufgerufen! [" + instCount + "]");
}
}
Run Code Online (Sandbox Code Playgroud) java ×3
log4j2 ×2
call ×1
class ×1
constructor ×1
dbcp ×1
keycloak ×1
kubernetes ×1
ldap ×1
logging ×1
memory-leaks ×1
methods ×1
sql-server ×1