写一点我的总结:
1、项目启动时,logback的加载会优于配置文件的加载,所以把 logback中 的日志配置放到配置文件需要一些技巧。
2、java项目启动时,会把环境的配置信息加载到运行时环境(即System)。
3、如何理解System,项目启动后
System.getenv() -> 获得一个map,打印效果如下:
- USERDOMAIN_ROAMINGPROFILE=DESKTOP-ICK7RL8
- PROCESSOR_LEVEL=6
- _RUNJAVA="D:\java\jdk\jdk1.8.0_172\bin\java.exe"
- SESSIONNAME=Console
- ALLUSERSPROFILE=C:\ProgramData
- JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:52866,suspend=y,server=n -Dfile.encoding=utf-8 -Dcom.sun.management.jmxremote= -Dcom.sun.management.jmxremote.port=1022 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=127.0.0.1 -Djava.util.logging.config.file="C:\Users\pactera\.IntelliJIdea15\system\tomcat\Unnamed_com_cqfmbank_fpp_parent\conf\logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
- PROCESSOR_ARCHITECTURE=AMD64
- PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
- SystemDrive=C:
- JRE_HOME=D:\java\jdk\jdk1.8.0_172
- MAVEN_HOME=D:\java\maven\apache-maven-3.5.2
- USERNAME=pactera
- TOMCAT_HOME=D:\java\tomcat\apache-tomcat-8.0.26
- ProgramFiles(x86)=C:\Program Files (x86)
- PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
- DriverData=C:\Windows\System32\Drivers\DriverData
- ProgramData=C:\ProgramData
- ProgramW6432=C:\Program Files
- HOMEPATH=\Users\pactera
- _RUNJDB="D:\java\jdk\jdk1.8.0_172\bin\jdb.exe"
- PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 Stepping 10, GenuineIntel
- LOGGING_CONFIG=-Djava.util.logging.config.file="C:\Users\pactera\.IntelliJIdea15\system\tomcat\Unnamed_com_cqfmbank_fpp_parent\conf\logging.properties"
- ProgramFiles=C:\Program Files
- PUBLIC=C:\Users\Public
- CURRENT_DIR=D:\java\tomcat\apache-tomcat-8.0.26\bin
- windir=C:\WINDOWS
- =::=::\
- ZOOKEEPER_HOME=D:\java\zookeeper\zookeeper-3.4.12
- LOCALAPPDATA=C:\Users\pactera\AppData\Local
- CATALINA_TMPDIR=C:\Users\pactera\.IntelliJIdea15\system\tomcat\Unnamed_com_cqfmbank_fpp_parent\temp
- USERDOMAIN=DESKTOP-ICK7RL8
- LOGONSERVER=\\DESKTOP-ICK7RL8
- JAVA_HOME=D:\java\jdk\jdk1.8.0_172
- PROMPT=$P$G
- CATALINA_BASE=C:\Users\pactera\.IntelliJIdea15\system\tomcat\Unnamed_com_cqfmbank_fpp_parent
- OneDrive=C:\Users\pactera\OneDrive
- APPDATA=C:\Users\pactera\AppData\Roaming
- _EXECJAVA="D:\java\jdk\jdk1.8.0_172\bin\java.exe"
- CommonProgramFiles=C:\Program Files\Common Files
- Path=C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\iCLS\;C:\Program Files\Intel\Intel(R) Management Engine Components\iCLS\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;D:\java\maven\apache-maven-3.5.2\bin;D:\java\maven\apache-maven-3.5.2\bin;D:\java\tomcat\apache-tomcat-8.0.26\bin;D:\java\zookeeper\zookeeper-3.4.12\bin;C:\WINDOWS\System32\OpenSSH\;D:\java\Python\Scripts\;D:\java\Python\;D:\java\Python\Scripts\;D:\java\Python\;C:\Users\pactera\AppData\Local\Microsoft\WindowsApps;C:\Users\pactera\AppData\Local\atom\bin
- OS=Windows_NT
- COMPUTERNAME=DESKTOP-ICK7RL8
- CATALINA_HOME=D:\java\tomcat\apache-tomcat-8.0.26
- MAINCLASS=org.apache.catalina.startup.Bootstrap
- LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
- PROCESSOR_REVISION=8e0a
- CLASSPATH=D:\java\tomcat\apache-tomcat-8.0.26\bin\bootstrap.jar;D:\java\tomcat\apache-tomcat-8.0.26\bin\tomcat-juli.jar
- CommonProgramW6432=C:\Program Files\Common Files
- ComSpec=C:\WINDOWS\system32\cmd.exe
- =D:=D:\java\tomcat\apache-tomcat-8.0.26\bin
- SystemRoot=C:\WINDOWS
- TEMP=C:\Users\pactera\AppData\Local\Temp
- ACTION=start
- HOMEDRIVE=C:
- USERPROFILE=C:\Users\pactera
- TMP=C:\Users\pactera\AppData\Local\Temp
- CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
- NUMBER_OF_PROCESSORS=8
- JAVA_ENDORSED_DIRS=D:\java\tomcat\apache-tomcat-8.0.26\endorsed
4、同样的,使用 System.getProperties() 也可以获得所有的配置文件参数值,这些配置信息值是全局的,在这整个项目运行的生命周期中任何一个地方都可以获得,可以在配置文件、前端页面使用 ${key} 获取,也可以在后端代码使用注解 @Value("${key}") 获取,项目停止运行后消失。如果想自己在 logback.xml 中加载配置文件,可以先自己通过写个监听器,然后加载配置信息,通过 System.setProperty(key, value) 的形式存放到全局配置中,和项目自己加载配置的原理是一样的,只不过项目加载的话,会比logback.xml 加载的晚一些。
以下是我加载 apollo 配置写的案例:
logback.xml:/resources 目录下的日志配置文件
以下是 LoadCustomLister 代码:
package cn.com.yitong.inte.tools;
import ch.qos.logback.core.status.OnConsoleStatusListener;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
import org.apache.commons.lang.StringUtils;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.Set;
/**
* Created by pactera on 2019/1/9.
*/
public class LoadCustomLister extends OnConsoleStatusListener {
private final String LOG_CUSTOM_KEY = "log.sql.level";
private boolean init;
@Override
protected PrintStream getPrintStream() {
if (!init) {
try {
loadCustomConfigParam();
} catch (Exception e) {
e.printStackTrace();
}
init = true;
}
return super.getPrintStream();
}
private void loadCustomConfigParam() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Config config = ConfigService.getAppConfig();
Set propertyNames = config.getPropertyNames();
Iterator propertiesPropertySource = propertyNames.iterator();
while (propertiesPropertySource.hasNext()) {
String propertyName = (String) propertiesPropertySource.next();
String property = config.getProperty(propertyName, null);
System.setProperty(propertyName, property);
}
String logSqlLevel = config.getProperty(LOG_CUSTOM_KEY, null);
super.getPrintStream().println(this.getClass() + " - log.sql.level=[" + logSqlLevel + "]");
if(StringUtils.isBlank(logSqlLevel))
System.setProperty(LOG_CUSTOM_KEY, "INFO");
}
}