当前位置: 首页 > 工具软件 > log4sh > 使用案例 >

zookeeper-Log4j替换Log4j2

能逸清
2023-12-01

log4j被检测出存在安全隐患,甲方要求更换为log4j2:

操作

直接将zookeeper的lib包下面的log4j,slf4j相关jar删除
在lib下引入:
slf4j-api-1.7.36.jar
log4j-api-2.17.2.jar
log4j-core-2.17.2.jar
log4j-slf4j-impl-2.17.2.jar
log4j-1.2-api-2.17.2.jar
之后直接启动会报错:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/jmx/HierarchyDynamicMBean
	at org.apache.zookeeper.jmx.ManagedUtil.registerLog4jMBeans(ManagedUtil.java:51)
	at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:77)
	at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:55)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:119)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.jmx.HierarchyDynamicMBean
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)

在源码中分析发现:

    @SuppressWarnings("rawtypes")
    public static void registerLog4jMBeans() throws JMException {
        if (Boolean.getBoolean("zookeeper.jmx.log4j.disable") == true) {
            return;
        }
        
        MBeanServer mbs = MBeanRegistry.getInstance().getPlatformMBeanServer();

        // Create and Register the top level Log4J MBean
        HierarchyDynamicMBean hdm = new HierarchyDynamicMBean();

        ObjectName mbo = new ObjectName("log4j:hiearchy=default");
        mbs.registerMBean(hdm, mbo);

        // Add the root logger to the Hierarchy MBean
        Logger rootLogger = Logger.getRootLogger();
        hdm.addLoggerMBean(rootLogger.getName());

        // Get each logger from the Log4J Repository and add it to
        // the Hierarchy MBean created above.
        LoggerRepository r = LogManager.getLoggerRepository();
        Enumeration enumer = r.getCurrentLoggers();
        Logger logger = null;

        while (enumer.hasMoreElements()) {
           logger = (Logger) enumer.nextElement();
           hdm.addLoggerMBean(logger.getName());
        }
    }

考虑直接在启动脚本中将
zookeeper.jmx.log4j.disable 设置为true

cp -a zkServer.sh zkServerLog4j2.sh

在zkServerLog4j2.sh中将涉及到QuorumPeerMain,这个类的启动命令前插入:

-Dzookeeper.jmx.log4j.disable=true
 类似资料: