手動執行加載日誌配置文件

在啓動項目後,發現自己定義得日誌文件死活打印不出來,jar包衝突已經排除,日誌配置文件的正確性已經排除,並且這時項目急着上線,該怎麼辦呢? 
答案是:自己主動去加載日誌文件,步驟如下:
注: a. 本例是web程序
		 b. 有人可能會疑問爲什麼不用spring的初始化,因爲spring的初始化會導致service層的日誌失效,所以必須在spring之前將日誌類LogManager初始化完成,這樣就能保證項目中所有的日誌文件都能正常打印,並且
**1. 編寫listener類**
package com.sm.hbase.controller;

import org.apache.log4j.Hierarchy;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.helpers.Loader;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.spi.Configurator;
import org.apache.log4j.spi.DefaultRepositorySelector;
import org.apache.log4j.spi.LoggerRepository;
import org.apache.log4j.spi.RootLogger;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 〈一句話功能簡述〉<br>
 * 〈功能詳細描述〉
 *
 * @author miracle
 * @date 2020/3/13
 * @see [相關類/方法](可選)
 * @since [產品/模塊版本] (可選)
 */
public class LogInit implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
    	/*** 開始  ***/
        String configurationOptionStr = OptionConverter.getSystemProperty("log4j.configuration", (String)null);
        URL url = null;
        if (configurationOptionStr == null) {
            url = Loader.getResource("log4j.xml");
            if (url == null) {
                url = Loader.getResource("log4j.properties");
            }
        } else {
            try {
                url = new URL(configurationOptionStr);
            } catch (MalformedURLException var7) {
                url = Loader.getResource(configurationOptionStr);
            }
        }

        Hierarchy h = new Hierarchy(new RootLogger(Level.DEBUG));
        DefaultRepositorySelector repositorySelector = new DefaultRepositorySelector(h);
        LoggerRepository loggerRepository = repositorySelector.getLoggerRepository();
        Configurator configurator = new PropertyConfigurator();
        configurator.doConfigure(url, loggerRepository);

		/* 結束: 這一部分代碼是log4j啓動時加載的代碼,見 org.apache.log4j.LogManager類中的static 方法*/
//        List<String> list = new ArrayList<>();
//        org.apache.log4j.Logger rootLogger = loggerRepository.getRootLogger();
//        Appender file = rootLogger.getAppender("File");
//        if (file != null && file instanceof org.apache.log4j.RollingFileAppender) {
//            RollingFileAppender rollingFileAppender = (RollingFileAppender) file;
//            list.add(rollingFileAppender.getFile());
//        }

		// 下面是手動配置LogManager中的repositorySelector即可
        LogManager.setRepositorySelector(repositorySelector, null);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
		// 此方法不用管
    }
}

  1. 將listener類加入到web.xml中
// listener必須在所有listener之前纔會對項目所有內容生效
  <listener>
    <listener-class>com.sm.hbase.controller.LogInit</listener-class>
  </listener>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章