关于java项目启动配置文件的加载

写一点我的总结:

1、项目启动时,logback的加载会优于配置文件的加载,所以把 logback中 的日志配置放到配置文件需要一些技巧。

2、java项目启动时,会把环境的配置信息加载到运行时环境(即System)

3、如何理解System,项目启动后

      System.getenv() -> 获得一个map,打印效果如下:

  1. USERDOMAIN_ROAMINGPROFILE=DESKTOP-ICK7RL8
  2. PROCESSOR_LEVEL=6
  3. _RUNJAVA="D:\java\jdk\jdk1.8.0_172\bin\java.exe"
  4. SESSIONNAME=Console
  5. ALLUSERSPROFILE=C:\ProgramData
  6. 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
  7. PROCESSOR_ARCHITECTURE=AMD64
  8. PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
  9. SystemDrive=C:
  10. JRE_HOME=D:\java\jdk\jdk1.8.0_172
  11. MAVEN_HOME=D:\java\maven\apache-maven-3.5.2
  12. USERNAME=pactera
  13. TOMCAT_HOME=D:\java\tomcat\apache-tomcat-8.0.26
  14. ProgramFiles(x86)=C:\Program Files (x86)
  15. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
  16. DriverData=C:\Windows\System32\Drivers\DriverData
  17. ProgramData=C:\ProgramData
  18. ProgramW6432=C:\Program Files
  19. HOMEPATH=\Users\pactera
  20. _RUNJDB="D:\java\jdk\jdk1.8.0_172\bin\jdb.exe"
  21. PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 Stepping 10, GenuineIntel
  22. LOGGING_CONFIG=-Djava.util.logging.config.file="C:\Users\pactera\.IntelliJIdea15\system\tomcat\Unnamed_com_cqfmbank_fpp_parent\conf\logging.properties"
  23. ProgramFiles=C:\Program Files
  24. PUBLIC=C:\Users\Public
  25. CURRENT_DIR=D:\java\tomcat\apache-tomcat-8.0.26\bin
  26. windir=C:\WINDOWS
  27. =::=::\
  28. ZOOKEEPER_HOME=D:\java\zookeeper\zookeeper-3.4.12
  29. LOCALAPPDATA=C:\Users\pactera\AppData\Local
  30. CATALINA_TMPDIR=C:\Users\pactera\.IntelliJIdea15\system\tomcat\Unnamed_com_cqfmbank_fpp_parent\temp
  31. USERDOMAIN=DESKTOP-ICK7RL8
  32. LOGONSERVER=\\DESKTOP-ICK7RL8
  33. JAVA_HOME=D:\java\jdk\jdk1.8.0_172
  34. PROMPT=$P$G
  35. CATALINA_BASE=C:\Users\pactera\.IntelliJIdea15\system\tomcat\Unnamed_com_cqfmbank_fpp_parent
  36. OneDrive=C:\Users\pactera\OneDrive
  37. APPDATA=C:\Users\pactera\AppData\Roaming
  38. _EXECJAVA="D:\java\jdk\jdk1.8.0_172\bin\java.exe"
  39. CommonProgramFiles=C:\Program Files\Common Files
  40. 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
  41. OS=Windows_NT
  42. COMPUTERNAME=DESKTOP-ICK7RL8
  43. CATALINA_HOME=D:\java\tomcat\apache-tomcat-8.0.26
  44. MAINCLASS=org.apache.catalina.startup.Bootstrap
  45. LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
  46. PROCESSOR_REVISION=8e0a
  47. CLASSPATH=D:\java\tomcat\apache-tomcat-8.0.26\bin\bootstrap.jar;D:\java\tomcat\apache-tomcat-8.0.26\bin\tomcat-juli.jar
  48. CommonProgramW6432=C:\Program Files\Common Files
  49. ComSpec=C:\WINDOWS\system32\cmd.exe
  50. =D:=D:\java\tomcat\apache-tomcat-8.0.26\bin
  51. SystemRoot=C:\WINDOWS
  52. TEMP=C:\Users\pactera\AppData\Local\Temp
  53. ACTION=start
  54. HOMEDRIVE=C:
  55. USERPROFILE=C:\Users\pactera
  56. TMP=C:\Users\pactera\AppData\Local\Temp
  57. CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
  58. NUMBER_OF_PROCESSORS=8
  59. 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");
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值