精华内容
下载资源
问答
  • 学习SpringBoot我们会使用JDBC来加载JDBC配置文件,这是有几种方式来进行文件的加载 Table of Contents 学习SpringBoot我们会使用JDBC来加载JDBC配置文件,这是有几种方式来进行文件的加载 前提:添加pom依赖 1:...

    学习SpringBoot我们会使用JDBC来加载JDBC配置文件,这是有几种方式来进行文件的加载

    Table of Contents

    学习SpringBoot我们会使用JDBC来加载JDBC配置文件,这是有几种方式来进行文件的加载

    前提:添加pom依赖

    1:使用@PropertySource加载自定义配置文件。

    2:@ConfigurationProperties注解的使用:一次加载到处使用。

    3:@ConfigurationProperties的使用优化:

    4:使用SpringBoot默认方式加载数据源(HikariDataSource)

    5:SpringBoot中使用自己配置的数据源


    前提:添加pom依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.bjsxt</groupId>
        <artifactId>springbootjdbc</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springbootjdbc</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <!--JDBC坐标-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <!--德鲁伊数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.12</version>
            </dependency>
    
            <!--mysql坐标-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    1:使用@PropertySource加载自定义配置文件。

       1.1:首先创建配置文件,设置配置文件的内容,我这里写的是连接数据库信息。

     

    1.2:创建加载配置类。

    package com.bjsxt.springbootjdbc.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    import javax.sql.DataSource;
    
    @Configuration
    //1.
    @PropertySource("classpath:/jdbc.properties")
    //2.
    // @EnableConfigurationProperties(JdbcProperties.class)
    public class JdbcConfiguration {
        /* //2:
        @Autowired
        private JdbcProperties jdbcProperties;
        */
    
    
        //1:
        @Value("${jdbc.driverClassName}")
        private String driverClassName;
    
        @Value("${jdbc.url}")
        private String url;
    
        @Value("${jdbc.username}")
        private String username;
    
        @Value("${jdbc.password}")
        private String password;
    
        //3
        // @ConfigurationProperties(prefix = "jdbc")
        @Bean
        public DataSource getDataSource(){
            DruidDataSource dataSource=new DruidDataSource();
            dataSource.setDriverClassName(this.driverClassName);
            dataSource.setUrl(this.url);
            dataSource.setUsername(this.username);
            dataSource.setPassword(this.password);
            return dataSource;
        }
    }
    

    1.3:创建控制器,打断点查看配置信息。

     

    这样做有一些缺点,如果多次需要使用配置信息,我们都需要这样一步一步的来,代码就会十分的冗余。为此就有了第二种注解使用的方式。

     

    2:@ConfigurationProperties注解的使用:一次加载到处使用。

    在使用前我们需要知道,@ConfigurationProperties只能读取SpringBoot的Application的配置文件进行数据的读取加载的

    2.1:将数据配置文件复制到application.properties的文件中去

     

    2.2:创建一个专门用于加载该配置的类。

    package com.bjsxt.springbootjdbc.config;
    
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    
    //2.
     @ConfigurationProperties(prefix = "jdbc")
    //只能读取springBoot Application注解文件
    public class JdbcProperties {
    
        private String driverClassName;
    
        private String url;
    
        private String username;
    
        private String password;
    
        public String getDriverClassName() {
            return driverClassName;
        }
    
        public void setDriverClassName(String driverClassName) {
            this.driverClassName = driverClassName;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    

    2.3:修改1.2的配置类。通过注入2.2专门加载配置类来通过get方法进行获取

    package com.bjsxt.springbootjdbc.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    import javax.sql.DataSource;
    
    @Configuration
    //1.
    //@PropertySource("classpath:/jdbc.properties")
    //2.
    @EnableConfigurationProperties(JdbcProperties.class)
    public class JdbcConfiguration {
        //2:
        @Autowired
        private JdbcProperties jdbcProperties;
    
    
        /*
        //1:
        @Value("${jdbc.driverClassName}")
        private String driverClassName;
    
        @Value("${jdbc.url}")
        private String url;
    
        @Value("${jdbc.username}")
        private String username;
    
        @Value("${jdbc.password}")
        private String password;
    
        */
    
        //3
        // @ConfigurationProperties(prefix = "jdbc")
        @Bean
        public DataSource getDataSource(){
            DruidDataSource dataSource=new DruidDataSource();
            dataSource.setDriverClassName(this.jdbcProperties.getDriverClassName());
            dataSource.setUrl(this.jdbcProperties.getUrl());
            dataSource.setUsername(this.jdbcProperties.getUsername());
            dataSource.setPassword(this.jdbcProperties.getPassword());
            return dataSource;
        }
    }
    

    2.4:测试

     

    3:@ConfigurationProperties的使用优化:

    3.1:取消该专门加载配置类注解

    package com.bjsxt.springbootjdbc.config;
    
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    
    //2.
    // @ConfigurationProperties(prefix = "jdbc")
    //只能读取springBoot Application注解文件
    public class JdbcProperties {
    
        private String driverClassName;
    
        private String url;
    
        private String username;
    
        private String password;
    
        public String getDriverClassName() {
            return driverClassName;
        }
    
        public void setDriverClassName(String driverClassName) {
            this.driverClassName = driverClassName;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    

    3.2:取消加载配置类,在该方法直接开启读取配置文件

    package com.bjsxt.springbootjdbc.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    import javax.sql.DataSource;
    
    @Configuration
    //1.
    //@PropertySource("classpath:/jdbc.properties")
    //2.
    //@EnableConfigurationProperties(JdbcProperties.class)
    public class JdbcConfiguration {
        //2:
        /*
        @Autowired
        private JdbcProperties jdbcProperties;
        */
    
    
        /*
        //1:
        @Value("${jdbc.driverClassName}")
        private String driverClassName;
    
        @Value("${jdbc.url}")
        private String url;
    
        @Value("${jdbc.username}")
        private String username;
    
        @Value("${jdbc.password}")
        private String password;
    
        */
    
        //3
        @ConfigurationProperties(prefix = "jdbc")
        @Bean
        public DataSource getDataSource(){
            DruidDataSource dataSource=new DruidDataSource();
            /*
            dataSource.setDriverClassName(this.jdbcProperties.getDriverClassName());
    
            dataSource.setUrl(this.jdbcProperties.getUrl());
            dataSource.setUsername(this.jdbcProperties.getUsername());
            dataSource.setPassword(this.jdbcProperties.getPassword());
             */
            return dataSource;
        }
    }
    

    3.3:测试:

     

     

    4:使用SpringBoot默认方式加载数据源(HikariDataSource)

    4.1:配置application.properties

    4.2:是注解配置类无效

    package com.bjsxt.springbootjdbc.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    import javax.sql.DataSource;
    
    //4.
    // @Configuration
    //1.
    //@PropertySource("classpath:/jdbc.properties")
    //2.
    //@EnableConfigurationProperties(JdbcProperties.class)
    public class JdbcConfiguration {
        //2:
        /*
        @Autowired
        private JdbcProperties jdbcProperties;
        */
    
    
        /*
        //1:
        @Value("${jdbc.driverClassName}")
        private String driverClassName;
    
        @Value("${jdbc.url}")
        private String url;
    
        @Value("${jdbc.username}")
        private String username;
    
        @Value("${jdbc.password}")
        private String password;
    
        */
    
        //3
        @ConfigurationProperties(prefix = "jdbc")
        @Bean
        public DataSource getDataSource(){
            DruidDataSource dataSource=new DruidDataSource();
            /*
            dataSource.setDriverClassName(this.jdbcProperties.getDriverClassName());
    
            dataSource.setUrl(this.jdbcProperties.getUrl());
            dataSource.setUsername(this.jdbcProperties.getUsername());
            dataSource.setPassword(this.jdbcProperties.getPassword());
             */
            return dataSource;
        }
    }
    

    4.3:修改控制器代码,查看该类的位置:

     

    5:SpringBoot中使用自己配置的数据源

    5.1:修改pom文件,添加Druid数据源

    5.2:修改数据源类型

    5.3:重启项目进行测试:

     

     

    展开全文
  • outlook正在加载配置无法打开

    千次阅读 2021-04-29 17:10:59
    删除(删除原来的配置文件)->添加(添加一个新的配置文件) 2,找到outlook.exe的位置,具体方式(查看outlook快捷方式的属性就能找到该位置) cmd进入该位置 (cmd以管理员形式打开) 重置outlook,重置...

    三步

    1,控制面板->mail(邮件)

    显示配置文件->删除(删除原来的配置文件)->添加(添加一个新的配置文件)

    2,找到outlook.exe的位置,具体方式(查看outlook快捷方式的属性就能找到该位置)

    cmd进入该位置

    (cmd以管理员形式打开)

    重置outlook,重置命令:outlook /importprf .\.prf

    回车后重启电脑

    3,以安全模式打开outlook

    win+R

    在其中输入outlook /safe

    点击确定

    打开后

    文件->选项->加载项->转到

    取消所有勾选,点击确定

    关闭安全模式下的outlook。

    再重新点击outlook就能正常打开了。。

    展开全文
  • log4j和log4j2怎么动态加载配置文件

    千次阅读 2018-12-26 01:37:00
    于是就有这样一个问题:如何在不停止当前项目的运行的情况下,让系统能够自动地监控配置文件的修改状况,从而实现动态加载配置文件的功能?而log4j 1.X和log4j2的差别略大,各自应该怎么实现这个功能? log4j 1.X...

    应用场景与问题

    当项目在运行时,我们如果需要修改log4j 1.X或者log4j2的配置文件,一般来说我们是不能直接将项目停止运行再来修改文件重新部署的。于是就有这样一个问题:如何在不停止当前项目的运行的情况下,让系统能够自动地监控配置文件的修改状况,从而实现动态加载配置文件的功能?而log4j 1.X和log4j2的差别略大,各自应该怎么实现这个功能?

    log4j 1.X动态加载配置文件

    log4j 1.X提供了动态加载配置文件的方法:

    DOMConfigurator.configureAndWatch()
    PropertyConfigurator.onfigureAndWatch()
    

    DOMConfigurator对应的是xml配置文件,PropertyConfigurator对应的是properties配置文件。这两个类都有configureAndWatch这个方法,该方法有个重载方法,如下:

    configureAndWatch(String configFilename)
    configureAndWatch(String configFilename, long delay)
    
    

    configureAndWatch方法用来监控配置文件是否被改动,监控的时间间隔是delay参数来决定,如果不传入该参数则使用默认的时间间隔1分钟(60000L)。configureAndWatch(String configFilename)实际上还是调用的configureAndWatch(String configFilename, long delay)

    log4j2动态加载配置文件

    和log4j 1.X比起来,log4j2的动态加载配置很简单就能实现,不需要另外在代码中调用api,方法如下:

    <configuration monitorInterval="30">
        ...
    </configuration>
    

    在log4j2.xml配置文件中的configuration节点添加monitorInterval的值,单位是秒,如果配置的值大于0,则会按照时间间隔来自动扫描配置文件是否被修改,并在修改后重新加载最新的配置文件。如果不配置该值,默认为0,即不扫描配置文件是否被修改。

    Log4j 1.X动态加载配置文件的底层实现原理

    DOMConfigurator#configureAndWatch源码解析

    org.apache.log4j.xml.DOMConfigurator#configureAndWatch源码如下:

    static public void configureAndWatch(String configFilename, long delay) {
        XMLWatchdog xdog = new XMLWatchdog(configFilename);
        xdog.setDelay(delay);
        xdog.start();
    }
    

    这里new了一个XMLWatchdog对象,接着设置了delay参数,最后调用了start()方法。
    watchdog是看门狗、检查者的意思,XMLWatchdog继承了FileWatchdog这个类,在XMLWatchdog中仅仅重写了doOnChange方法:

    public void doOnChange() {
        new DOMConfigurator().doConfigure(filename, LogManager.getLoggerRepository());
    }
    

    从方法名就可以看出来,如果XMLWatchdog监控到配置文件被改动了,就会调用这个doOnChange方法,用来重新加载配置文件。那么它又是怎么知道配置文件被改动过了呢?接着看其父类FileWatchdog的源码:

    public abstract class FileWatchdog extends Thread {
    
      /**
         The default delay between every file modification check, set to 60
         seconds.  */
      static final public long DEFAULT_DELAY = 60000; 
      /**
         The name of the file to observe  for changes.
       */
      protected String filename;
      
      /**
         The delay to observe between every check. By default set {@link
         #DEFAULT_DELAY}. */
      protected long delay = DEFAULT_DELAY; 
      
      File file;
      long lastModif = 0; 
      boolean warnedAlready = false;
      boolean interrupted = false;
    
      protected FileWatchdog(String filename) {
        super("FileWatchdog");
        this.filename = filename;
        file = new File(filename);
        setDaemon(true);
        checkAndConfigure();
      }
    
      /**
         Set the delay to observe between each check of the file changes.
       */
      public void setDelay(long delay) {
        this.delay = delay;
      }
    
      abstract protected void doOnChange();
    
      protected void checkAndConfigure() {
        boolean fileExists;
        try {
          fileExists = file.exists();
        } catch(SecurityException  e) {
          LogLog.warn("Was not allowed to read check file existance, file:["+
              filename+"].");
          interrupted = true; // there is no point in continuing
          return;
        }
    
        if(fileExists) {
          long l = file.lastModified(); // this can also throw a SecurityException
          if(l > lastModif) {           // however, if we reached this point this
        lastModif = l;              // is very unlikely.
        doOnChange();
        warnedAlready = false;
          }
        } else {
          if(!warnedAlready) {
        LogLog.debug("["+filename+"] does not exist.");
        warnedAlready = true;
          }
        }
      }
    
      public void run() {    
        while(!interrupted) {
          try {
            Thread.sleep(delay);
          } catch(InterruptedException e) {
        // no interruption expected
          }
          checkAndConfigure();
        }
      }
    }
    

    可以看到,FileWatchdog继承了Thread类,类里定义了几个成员变量,比如默认的监控时间间隔等。而在该类的构造方法中可以看到,首先该线程类将名字设定成FileWatchdog,接着根据传入的配置文件的路径new了一个File对象,然后该线程类又设置成了守护线程(daemon thread),最后调用了checkAndConfigure()

    checkAndConfigure()中,则是对new出来的配置文件File对象进行检查是否存在该文件,若不存在该文件则会设置成员变量的值,这样就不会去监控不存在的配置文件了。如果该配置文件存在,则通过lastModified()来获取文件的最后更新时间,和上次的更新时间作对比,如果比上次更新时间大则会调用doOnChange()来重新加载配置文件。

    而在FileWatchdog的run方法中,则是在无限循环中先让线程睡眠设置好的监控时间间隔,然后调用checkAndConfigure()

    总结

    可以看出,在log4j 1.X的DOMConfigurator中,是通过创建一个守护线程来不停地扫描配置文件的最后更新时间,并和上次的更新时间进行对比,如果最后更新时间大于上次更新时间则会重新加载配置文件。

    PropertyConfigurator#configureAndWatch源码解析

    PropertyConfigurator的configureAndWatch()其实和DOMConfigurator差不多,区别是PropertyConfigurator在方法里new了一个PropertyWatchdog对象,PropertyWatchdog和XMLWatchdog一样继承了FileWatchdog,一样重写了doOnChange()方法。只是PropertyWatchdog是通过new PropertyConfigurator().doConfigure()来加载配置文件的。

    从源码实现来看,无论是使用xml配置文件,还是使用properties配置文件,其动态加载配置文件的底层实现是基本一样的。可以通过解析配置文件的文件后缀来判断是xml还是properties文件,然后调用对应的方法即可,大概的思路如下:

    boolean flag = true;
    boolean isXml = StringUtils.equalsIgnoreCase("xml", StringUtils.substringAfterLast(filepath, "."));
    ling delay = 30000;
    
    if (isXml) {
      if (flag) {
        DOMConfigurator.configureAndWatch(filepath, delay);
      } else {
        DOMConfigurator.configure(filepath);
      }
    } else {
      if (flag) {
        PropertyConfigurator.configureAndWatch(filepath, delay);
      } else {
        PropertyConfigurator.configure(filepath);
      }
    }
    

    log4j2底层实现动态加载配置文件的简单解析

    虽然log4j2的动态加载配置很简单,但其底层实现比起log4j 1.X却要复杂很多,使用到了很多并发包下的类,具体也不是很了解,这里简单解释下流程。

    对于log4j2.xml文件,对应的是org.apache.logging.log4j.core.config.xml.XmlConfiguration这个类。如果在log4j2.xml里配置了monitorInterval,在构建XmlConfiguration时会根据该值来走一段特定的逻辑:

    for (final Map.Entry<String, String> entry : attrs.entrySet()) {
        final String key = entry.getKey();
        final String value = getStrSubstitutor().replace(entry.getValue());
        if ("status".equalsIgnoreCase(key)) {
            statusConfig.withStatus(value);
        } else if ("dest".equalsIgnoreCase(key)) {
            statusConfig.withDestination(value);
        } else if ("shutdownHook".equalsIgnoreCase(key)) {
            isShutdownHookEnabled = !"disable".equalsIgnoreCase(value);
        } else if ("shutdownTimeout".equalsIgnoreCase(key)) {
            shutdownTimeoutMillis = Long.parseLong(value);
        } else if ("verbose".equalsIgnoreCase(key)) {
            statusConfig.withVerbosity(value);
        } else if ("packages".equalsIgnoreCase(key)) {
            pluginPackages.addAll(Arrays.asList(value.split(Patterns.COMMA_SEPARATOR)));
        } else if ("name".equalsIgnoreCase(key)) {
            setName(value);
        } else if ("strict".equalsIgnoreCase(key)) {
            strict = Boolean.parseBoolean(value);
        } else if ("schema".equalsIgnoreCase(key)) {
            schemaResource = value;
        } else if ("monitorInterval".equalsIgnoreCase(key)) {
            final int intervalSeconds = Integer.parseInt(value);
            if (intervalSeconds > 0) {
                getWatchManager().setIntervalSeconds(intervalSeconds);
                if (configFile != null) {
                    final FileWatcher watcher = new ConfiguratonFileWatcher(this, listeners);
                    getWatchManager().watchFile(configFile, watcher);
                }
            }
        } else if ("advertiser".equalsIgnoreCase(key)) {
            createAdvertiser(value, configSource, buffer, "text/xml");
        }
    }
    

    可以看到,如果monitorInterval的值大于0,则会拿到WatchManager并设置扫描配置文件的时间间隔,如果配置文件存在,则会new一个ConfiguratonFileWatcher对象,并将配置文件和该对象一起传递给WatchManager的watchFile方法。这两个方法的底层实现很绕,比起log4j 1.X要复杂得多,不容易看懂。不过最终实现的效果还是一样的,依然会开启一个守护线程来监控配置文件是否被改动。

    区别在于,log4j2使用线程池来启动线程,在WatchManager#start()里实现的:

    @Override
    public void start() {
        super.start();
        if (intervalSeconds > 0) {
            future = scheduler.scheduleWithFixedDelay(new WatchRunnable(), intervalSeconds, intervalSeconds,
                    TimeUnit.SECONDS);
        }
    }
    

    而该方法则是在启动配置文件时被调用的,AbstractConfiguration#start()

    /**
     * Start the configuration.
     */
    @Override
    public void start() {
        // Preserve the prior behavior of initializing during start if not initialized.
        if (getState().equals(State.INITIALIZING)) {
            initialize();
        }
        LOGGER.debug("Starting configuration {}", this);
        this.setStarting();
        if (watchManager.getIntervalSeconds() > 0) {
            watchManager.start();
        }
        ...
    }
    

    这里只是简单解析了下主要的流程,具体的实现细节目前还看不太懂,有兴趣的可以自己去看看log4j2的源码。另外我在官方文档里看到说monitorInterval的最小值是5,但是在源码里也没看到这个,我觉得只要配置值大于0应该就是可以的。有不对之处,欢迎指出。

    这是官方原文:

    ###Automatic Reconfiguration
    When configured from a File, Log4j has the ability to automatically detect changes to the configuration file and reconfigure itself. If the monitorInterval attribute is specified on the configuration element and is set to a non-zero value then the file will be checked the next time a log event is evaluated and/or logged and the monitorInterval has elapsed since the last check. The example below shows how to configure the attribute so that the configuration file will be checked for changes only after at least 30 seconds have elapsed. The minimum interval is 5 seconds.

    参考链接

    展开全文
  • Logstash7.4动态加载配置文件

    千次阅读 2019-12-17 16:04:30
    从logst2.3开始,我们就可以把Logstash配置成动态监听配置文件修改、再加载配置文件功能。 在启动logstash的时候使用命令行选项--config.reload.automatic(或是-r)就可以将logstash配置成动态更新配置信息。 举...

    从logst2.3开始,我们就可以把Logstash配置成动态监听配置文件修改、再加载配置文件功能。
    在启动logstash的时候使用命令行选项--config.reload.automatic(或是-r)就可以将logstash配置成动态更新配置信息。
    举个例子:

    bin/logstash -f apache.config --config.reload.automatic
    

    注意:当在命令行中使用-e来传入配置信息的时候,–config.reload.automatic就不能起作用。

    默认情况下,logstash每个3s会检查一次配置信息是否更改。如果要修改这个间隔时间,可以使用--config.reload.interval <interval>选项。其中,interval规定了logstash检查配置文件的时间间隔,以秒为单位。

    如果logstash在没有启用自动加载功能的情况下已经启动的话,可以通过发送SIGHUP(signal hangup)到运行logstash的进程中,迫使logstash重新加载配置文件、并且重新启动管道。

    kill -SIGHUP 14175
    

    其中14175为运行logstash的进程ID。

    linux下kill的用法除了参考官方文档外,也可以参照该文档:https://www.sogou.com/link?url=hedJjaC291OfPyaFZYFLI4KQWvqt63NBpc2t0hZYVCeNMhcNHpE5BQ…

    查找运行logstash的进程ID的方法:
    通过命令行方式启动logstash的时候,市级上启动的是java程序。所以用ps -ef|grep logstash找到的进程实际上是java的进程。用ps PID查看时得到的是JAVA进程信息。

    logstash的自动加载配置文件是如何工作的?

    当logstash发现配置文件发生更改时,它首先停止当前管道的所有输入,然后尝试根据新的配置文件建立新的管道。在验证了新的配置文件的语法后,logstash还会验证所有的输入和输出能否初始化(比如,要求的端口是否已经打开)。如果所有的检查都通过的话,logstash就会切换当前的管道到新的管道。如果其中的一项检查失败的话,原先的管道继续工作,同时在控制台中输出错误信息。

    在自动加载配置文件过程中,JVM不会重新启动。管道的生成和切换都是在同一个进程中进行。

    只有当配置文件发生变化引发再加载(或是管道重启的时候),grok样式文件的修改才会重新加载。

    展开全文
  • 利用设置环境变量,可以实现springboot在配置文件中加载动态值,配置文件中读取环境变量值的写法 ${环境变量名: 默认值} 例如 在springboot启动加载配置文件application.properties 中 testenv="${myenv:a default...
  • outlook 2013 卡在正在加载配置文件

    千次阅读 2019-11-13 15:24:40
    outlook 2013 升级sp1后,打开就卡在正在加载配置文件 在MSDN找到“Outlook 2013 or Outlook 2010 not responding, hangs, freezes or stopped working”(Outlook 2010\2013停止响应,僵死、冻结或停止工作)的...
  • Springboot加载配置的几种方法

    千次阅读 2019-05-24 15:47:54
    获取配置信息我们使用到的注解:@Value、@ConfigurationProperties、@Property...application.properties、application.yml是springboot的默认配置文件,springboot会从下面两个路径默认加载配置文件 src/main/res...
  • SpringBoot的yml文件如何被加载,以及加载原理
  • Haproxy热加载配置文件。

    千次阅读 2020-05-12 15:30:42
    测试haproxy热加载是否有效: 1.在controller加入代码: @RequestMapping("/check") public String check() throws Exception { Thread.currentThread().sleep(20000); return "OK"; } 2.浏览器发起请求 3.haproxy...
  • yml配置文件,在配置文件中可以看到我连接的是我阿里云的nacos server: port: 8889 spring: application: name: coin-common profiles: active: dev datasource: driver-class-name: ...
  • Cad 启动报错无法加载配置文件,上次任务中保存的某些配置信xxxxx 解决办法: 参考: ... 退出 AutoCAD。 ... 要备份当前设置,请运行名为输出 AutoCAD 20xx 设置的应用,该应用位于可从 Win.
  • Outlook 一直在加载配置文件解决办法

    万次阅读 2020-03-03 11:42:19
    关于Outlook闹妖的情况遇到过不止一次,最后发现一般使用下面的方法中其中一种都可以解决。 结束lync进程。 结束Skype进程。 禁用硬件加速。
  • prometheus 动态加载配置文件 热更新

    千次阅读 2020-11-19 19:41:56
    现通过docker启动prometheus 的时候,需要动态加载新的target,启动的时候需要添加一个配置项 --web.enable-lifecycle 完整的启动命令: docker run -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/...
  • apollo client加载配置

    千次阅读 2019-04-22 20:24:37
    Apollo spring启动加载过程 (图一) Apollo spring启动加载配置可以通过3个入口(Springboot SPI、自定义标签apollo、注解 EnableApolloConf...
  • Java中加载配置文件的三种方式

    万次阅读 2018-09-17 23:31:33
    一、通过文件路径加载 该方式必须知道文件的真实路径。 1、配置文件放置位置 2、具体代码如下 package cn.sunft.day01.reflect; import java.io.FileInputStream; import java.io.InputStream; import java....
  • laravel homestead 重新加载配置文件

    千次阅读 2018-08-07 23:52:36
    laravel 使用homestead的时候,在创建一个新的项目的时候一定要 重新加载 重新加载 重新加载 homestead.yaml 文件,代码如下: cd ~/Homestead &amp;amp;&amp;amp; vagrant provision &amp;amp;&...
  • postgresql数据库重新加载配置

    千次阅读 2019-06-10 11:42:15
    正式库上,修改了数据库配置信息后,如何用命令重新加载配置文件: ./psql -U username -d dbname 重新加载pg配置 切换到postgres用户 ./pg_ctl reload -D /opt/PostgreSQL/8.3/data 整理后的步骤: 1、...
  • 系统遇到这样一个需求,线上环境在配置文件发生变动时,可以不用经过重启,通过刷新接口的方式得到配置文件的加载,主要目的是为了迅速部署,避免因手动重启,处理不及时导致积压的问题 问题 1.程序中如何获取修改后...
  • celery加载配置文件方式

    千次阅读 2019-07-03 17:18:43
    from celery import Celery app = Celery('my_celery') # 实例化celery对象 ...app.config_from_object('celery_app.celery_config') # 配置文件加载 编写Celery配置文件celery_config.py BROKER_UR...
  • uniapp subPackages分包加载配置

    万次阅读 2020-04-09 14:29:34
    1、 分包加载配置 分包加载配置,此配置为小程序的分包加载机制。 subPackages 节点接收一个数组,数组每一项都是应用的子包,其属性值如下: 注意: subPackages 里的pages的路径是 root 下的相对路径,不是全路径...
  • 1.springboot配置文件的加载位置 1.1 springboot启动会扫描一下位置的application.properties或者application.yml作为默认的配置文件 工程根目录:./config/ 工程根目录:./ classpath:/config/ classpath:/ 加载的...
  • 刷新prometheus.yml,重新加载配置文件

    千次阅读 2019-11-11 09:21:13
    Prometheus提供两种重新加载配置文件prometheus.yml的方法: # 第一种,向prometheus进行发信号 kill -HUP pid # 第二种,向prometheus发送HTTP请求 # /-/reload只接收POST请求,并且需要在启动prometheus进程时,...
  • http://localhost:8080/exit //关闭 http://localhost:8080/restart /重启 http://localhost:8080/reload //重新加载配置信息
  • Apache平滑加载配置文件 Linux

    千次阅读 2018-12-06 10:57:40
    ps aux|grep http 此时会有显示文件路径 文件路径path -k graceful
  • /usr/local/nginx/sbin/nginx -s reload重新加载 nginx 更改配置文件后需要重启生效。  1、更改配置重启nginx:   kill -HUP 主进程号或进程号文件路径  或者使用  cd /usr/local/nginx/sbin  ./nginx -s ...
  • 一、今天有个同学问我,为什么明明安装了redis,修改了配置,启动的时候,配置还是不生效。如下图是安装后的redis文件图。 root@iZbp17cj14ulhfrlj02rkaZ:~/redis-4.0.9# ls 00-RELEASENOTES COPYING Makefile ...
  • 但是无法解决加载yml配置文件信息。 1.首先检查maven结构是否正确。 2.如果不是这样的maven结构,请检查并重新构建你的工程。这里不作详解。 3.保证结构和上图一样之后,请如图操作。 这个是idea里面...
  • python中加载配置文件

    千次阅读 2018-04-15 17:57:03
    我们写Python脚本的时候,里面往往会用到许多变量、参数等,有时候这些变量、参数是需要我们动态的赋值的,如果脚本较长逐个查找替换是比较麻烦的,这里就可以使用配置文件,将一些需要...加载配置文件") c...
  • log4j加载配置方式和配置详解

    千次阅读 2017-10-09 13:26:09
    log4j加载配置文件方式大家在刚接触log4j时一定都会疑问。log4j的配置文件应该怎么明明并且文件要放在什么目录下。其实log4j加载配置文件有很多方式,大家只需实现以下中的一种即可,推荐用第一种方法,最简单。src/...
  • nginx重新加载配置(reload)

    万次阅读 2019-04-03 13:32:00
    重新加载配置并启动 /app/soft/nginx/pro/nginx/sbin/nginx -c /app/soft/nginx/pro/nginx/conf/nginx.conf -s reload nginx的安装路径 -c 启动的配置文件 -s reload 启动ng nginx的安装路径 -c...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,495,447
精华内容 598,178
关键字:

加载配置