1. 程式人生 > >初始化logback的變數

初始化logback的變數

    為了配置方便,我們將logback的相關變數引數放到配置檔案system.properties中。在tomcat容器啟動時,控制容器的載入順序,先載入properties檔案,再初始化logback。由於logback是通過StaticLoggerBinder中的靜態程式碼塊初始化,因此要在它之前載入配置檔案,需要研究tomncat初始化的順序。

下來看下tomcat啟動都做了什麼

十月 13, 2016 8:58:29 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:ecf.meloans' did not find a matching property.
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Server version:        Apache Tomcat/7.0.68
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Server built:          Feb 8 2016 20:25:54 UTC
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Server number:         7.0.68.0
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: OS Name:               Windows 7
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: OS Version:            6.1
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Architecture:          amd64
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Java Home:             D:\program files\Java\jdk1.8.0_101\jre
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: JVM Version:           1.8.0_101-b13
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: JVM Vendor:            Oracle Corporation
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: CATALINA_BASE:         D:\program files\jr-tomcat-7.0.68
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: CATALINA_HOME:         D:\program files\jr-tomcat-7.0.68
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Command line argument: -Dmaven.multiModuleProjectDirectory=$M2_HOME
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Command line argument: -Dcatalina.base=D:\program files\jr-tomcat-7.0.68
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Command line argument: -Dcatalina.home=D:\program files\jr-tomcat-7.0.68
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Command line argument: -Dwtp.deploy=D:\program files\jr-tomcat-7.0.68\webapps
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Command line argument: -Djava.endorsed.dirs=D:\program files\jr-tomcat-7.0.68\endorsed
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.VersionLoggerListener log
資訊: Command line argument: -Dfile.encoding=UTF-8
十月 13, 2016 8:58:29 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
資訊: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\program files\Java\jdk1.8.0_101\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Imaging\;C:\Program Files (x86)\AMD\ATI.ACE\Core-Static;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\java\jdk1.7.0_60\bin;C:\Program Files\TortoiseSVN\bin;.
十月 13, 2016 8:58:29 上午 org.apache.coyote.AbstractProtocol init
資訊: Initializing ProtocolHandler ["http-bio-8080"]
十月 13, 2016 8:58:29 上午 org.apache.coyote.AbstractProtocol init
資訊: Initializing ProtocolHandler ["ajp-bio-8009"]
十月 13, 2016 8:58:29 上午 org.apache.catalina.startup.Catalina load
資訊: Initialization processed in 662 ms
十月 13, 2016 8:58:29 上午 org.apache.catalina.core.StandardService startInternal
資訊: Starting service Catalina
十月 13, 2016 8:58:29 上午 org.apache.catalina.core.StandardEngine startInternal
資訊: Starting Servlet Engine: Apache Tomcat/7.0.68
十月 13, 2016 8:58:29 上午 org.apache.catalina.loader.WebappClassLoaderBase validateJarFile
資訊: validateJarFile(D:\program files\jr-tomcat-7.0.68\webapps\ecf.meloans\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class
十月 13, 2016 8:58:32 上午 org.apache.catalina.startup.TldConfig execute
資訊: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
十月 13, 2016 8:58:32 上午 org.apache.catalina.core.ApplicationContext log
資訊: Spring WebApplicationInitializers detected on classpath: [
[email protected]
] set system logging parameter :log.app.version = 0.0.1 set system logging parameter :log.dir = d:/wangzy25/log set system logging parameter :log.credit.accounting.level = ERROR set system logging parameter :log.credit.accounting.task.level = DEBUG set system logging parameter :log.app.env = development set system logging parameter :log.credit.accounting.dao.level = ERROR set system logging parameter :log.root.level = DEBUG set system logging parameter :log.app.name = credit.accounting set system logging parameter :log.system.name = com.midea.jr 十月 13, 2016 8:58:32 上午 org.apache.catalina.core.ApplicationContext log 資訊: Initializing Spring root WebApplicationContext log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. SLF4J: Class path contains multiple SLF4J bindings.

其中:
資訊: Starting service Catalina
.
.
.
資訊: Spring WebApplicationInitializers detected on classpath: [[email protected]]
.
.
.
資訊: Initializing Spring root WebApplicationContext
SLF4J: Class path contains multiple SLF4J bindings.

表示了Catalina啟動-->WebApplicationInitializers-->WebApplicationContext-->SLF4J bindings

因此我們只要在SLF4J bindings之前載入配置檔案即可。

方案1、通過配置listener,將其放到logback之前

package com.midea.jr.ecf.meloans.listener;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import ch.qos.logback.ext.spring.web.WebLogbackConfigurer;


/**
 * <p>Project:com.midea.jr.ecf			<p>
 * <p>Module:meloans.utils			<p>
 * <p>Description:載入系統配置檔案 system.properties		<p>
 *
 * @author WANGZY25
 * @date 2016年10月12日 下午3:03:54
 */
public class LoadSystemConfigListener implements  ServletContextListener {	

	@Override
	public void contextInitialized( ServletContextEvent sce ) {
		Properties prop = new Properties();
		InputStream in = this.getClass().getResourceAsStream( "/system.properties" );
		System.out.println("***********  begin loading log configuration   *********");
		try {
			prop.load(in);
			Enumeration<Object> iter= prop.keys();
			while(iter.hasMoreElements()){
				String key = iter.nextElement().toString();
				if(key.startsWith( "log" )){
					System.setProperty( key, prop.getProperty( key ) );
					System.out.println( "set system logging parameter : "+key+" = "+prop.getProperty( key ) );
				}
			}
		} catch( IOException e ) {
			e.printStackTrace();
		}
		 WebLogbackConfigurer.initLogging(sce.getServletContext());
	}

	@Override
	public void contextDestroyed( ServletContextEvent sce ) {
		WebLogbackConfigurer.shutdownLogging(sce.getServletContext());
	}
}

同時在web.xml中,把這個listener配置到靠前的位置
<listener>
        <listener-class>com.midea.jr.ecf.meloans.utils.LoadSystemConfigListener</listener-class>
</listener>


方案2、重寫WebApplicationInitializer

package com.midea.jr.ecf.meloans.listener;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.springframework.web.WebApplicationInitializer;


/**
 * <p>Project:com.midea.jr.ecf			<p>
 * <p>Module:meloans.utils			<p>
 * <p>Description:載入系統配置檔案 system.properties		<p>
 *
 * @author WANGZY25
 * @date 2016年10月12日 下午3:03:54
 */
public class JrLogbackConfigLoader implements WebApplicationInitializer{
	
	@Override
	public void onStartup( ServletContext servletContext ) throws ServletException {
		Properties prop = new Properties();
		InputStream in = this.getClass().getResourceAsStream( "/system.properties" );
		try {
			prop.load(in);
			Enumeration<Object> iter= prop.keys();
			while(iter.hasMoreElements()){
				String key = iter.nextElement().toString();
				if(key.startsWith( "log" )){
					System.setProperty( key, prop.getProperty( key ) );
					System.out.println("set system logging parameter :"+key+" = "+prop.getProperty( key ));
				}
			}
		} catch( IOException e ) {
			e.printStackTrace();
		}
	}

}

參考地址:

Logback統一配置及環境變數載入問題

http://www.jianshu.com/p/39178af66aef