• spring boot--日志、开发和生产环境切换、自定义配置(环境变量)


    Spring Boot日志常用配置:

    # 日志输出的地址:Spring Boot默认并没有进行文件输出,只在控制台中进行了打印
    logging.file=/home/zhou
    # 日志级别 debug-> info -> warning -> error
    # 默认级别为 info
    # 如果设置了debug=true的时候,日志级别会自动降低为debug
    
    # ROOT代表默认全局设置
    logging.level.ROOT=INFO
    # 可以设置指定包的输出级别,这样的话,指定的包,级别以下的日志就不在打印或者写入日志文件
    logging.level.org.springframework=ERROR
    logging.level.org.apache=ERROR

    日志文件默认一天生成一个文件,但是有一个问题,不能分割日志文件。

    小项目可以一天生成一个日志文件,但是像淘宝那种级别的可能每分钟都需要生成一个日志文件,这种情况下,可以使用logback自带的详细的配置文件来开发。

    注释掉刚才配置的,把logback.xml文件放到resource目录下,具体可以去官网:https://logback.qos.ch/

     参考:http://www.cnblogs.com/warking/p/5710303.html

    logback.xml示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
        <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
        <property name="LOG_HOME" value="/home" />
        <!-- 控制台输出 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--按pattern指定的路径格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符,编码为UTF-8-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
        <!-- 定义一个日滚动(每天生成一份)的日志文件 -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件输出的文件名-->
                <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
                <!--日志文件保留天数-->
                <MaxHistory>30</MaxHistory>
            </rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符,编码为UTF-8-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                <charset>UTF-8</charset>
            </encoder>
            <!-- 在日滚动文件中,强制只保存错误INFO级别以上的信息 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
    
            <!--日志文件最大的大小-->
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>10MB</MaxFileSize>
            </triggeringPolicy>
        </appender>
    
        <!-- 定义日志全局最低输出级别,同时向控制台和日滚动文件输出 -->
        <root level="INFO">
            <appender-ref ref="console" />
            <appender-ref ref="STDOUT" />
        </root>
    </configuration>

     参考另一例子:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="60 seconds">
        <property name="LOG_HOME" value="/tmp"/>
    
        <!-- 彩色日志 -->
        <!-- 彩色日志依赖的渲染类 -->
        <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
        <conversionRule conversionWord="wex"
                        converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
        <conversionRule conversionWord="wEx"
                        converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
        <!-- 彩色日志格式 -->
        <property name="CONSOLE_LOG_PATTERN"
                  value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(--){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
        />
    
        <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            </encoder>
        </appender>
    
        <appender name="LOG_INFO"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder>
                <pattern>
                    [%date{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] %logger{96} - %msg%n
                </pattern>
    
                <charset>UTF-8</charset>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/info_log_%d{yyyyMMdd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy
                        class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>200 MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <maxHistory>2</maxHistory>
            </rollingPolicy>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <prudent>false</prudent>
        </appender>
    
        <appender name="LOG_ERROR"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder>
                <pattern>
                    [%date{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] %logger{96} - %msg%n
                </pattern>
    
                <charset>UTF-8</charset>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/error_log_%d{yyyyMMdd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy
                        class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>200 MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <maxHistory>2</maxHistory>
            </rollingPolicy>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <prudent>false</prudent>
        </appender>
    
    
        <appender name="Sentry" class="com.getsentry.raven.logback.SentryAppender">
            <dsn>https://c6fb8bf2a380850a514:1867ceb5621c39b2@sentry.wangjing.cn/15</dsn>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>WARN</level>
            </filter>
        </appender>
    
        <logger name="logback.SentryAppenderIT" level="INFO">
            <appender-ref ref="Sentry"/>
        </logger>
    
        <root level="INFO">
            <appender-ref ref="Console"/>
            <appender-ref ref="Sentry"/>
            <appender-ref ref="LOG_INFO"/>
            <appender-ref ref="LOG_ERROR"/>
        </root>
    </configuration>

    开发、生产环境切换和自定义配置:

    配置文件有properties和yml文件格式,yml格式文件有易读,易修改,自动分类等优点,可以使用yml格式配置文件(看个人喜好)

    application.yml文件示例:

    debug: true
    
    server:
      servlet:
        context-path: app1
    
    spring:
      http:
        encoding:
          charset: utf-8
      thymeleaf:
        cache: true
      datasource:
        username: root
        password: root
        url: jdbc:mysql://127.0.0.1:3306/test
        driver-class-name: com.mysql.jdbc.Driver

    IDEA开发工具会把开头相同的, 自动归类,这样以后修改的时候,就不用吧配置文件从头到尾读一遍,害怕漏了某些配置

    如果properties和yml同时存在,以properties文件为准

    环境配置,dev开发环境和部署环境连接的数据库地址、debug模式等等都是不同的,为了区分dev开发环境配置和生产环境配置,可以创建两个yml文件,什么环境使用相应的配置文件:

    • application.yml:公共配置文件,里面可以通过spring.profiles.active=dev来指定使用哪个配置文件
    • application-dev.yml:开发环境配置文件
    • application-prd.yml:生产环境配置文件

    注意:

    1. 当公共配置文件application.yml和dev.yml(或prd.yml)同时存在同一个配置的时候,以dev.yml(prd.yml)配置文件为主,
    2. 当配置项只在公共application.yml文件中有的时候,以公共配置为主
    3. 可以把公共配置项放到application.yml中

    日志环境配置有点不一样:

    1. 更改默认的logback.xml为logback-spring.xml

      SpringBoot当看到logback-spring.xml文件存在的时候,才会启动日志的环境切换,而logback.xml文件无法做到

    2.在需要切换的环境上,增加springProfile标签

    会根据上面spring.profiles.active指定的值是什么来自动切换

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
        
        <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
        <springProfile name="dev">
            <property name="LOG_HOME" value="/tmp" />
        </springProfile>
        <springProfile name="prd">
            <property name="LOG_HOME" value="/home/log" />
        </springProfile>
        .............................

    spring boot自定义配置:

      Spring Boot 内置的配置项远远不能支撑我们的程序运行,在项目设计的时候,往往因为扩展性的需要,项目需要预留很多自定义设置项,Spring Boot 允许我们配置自定义选项。

    在Spring Boot 中,有两种方式使用自定义选项

    • @Value单个属性注入
    • @ConfigurationProperties类型安全加载

    1. 首先创建一个config.properties配置文件(properties文件一般都是单独保存我们的配置文件信息的),简单的写几个自定义信息

    app.name=淘宝2号店
    app.version=1.0.0
    app.description=这是一家盗版的淘宝店
    # -连接符说明使用的时候,后面的S要大写(pageSize)
    app.page-size=20
    # 是否显示广告
    app.show-advert=true
    app.website=http://www.taobao2.com

    2. 注意,我这里使用了中文,properties文件不支持中文,如果想支持中文,需要设置: 

    file -> settings -> Editor -> File Encodings ,勾选Transparent native-to-ascii conversion选项

    3. 自定义配置信息写好了,但是程序不知道啥玩意啊,需要程序启动时,加载配置配置信息

    @SpringBootApplication
    @PropertySource("classpath:config.properties") // 在入口类启动时,加载config.properties
    public class Test1Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Test1Application.class, args);
        }
    
    }

    4.1:@Value方式: 写一个controller类,测试是否能读取到自定义配置信息

    package com.htmltest.test1.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @RestController
    public class MyController {
    
        @Value("${app.name}")
        private String name;
    
        @Value("${app.page-size}")
        private Integer pageSize;
    
        @RequestMapping(value = "/name")
        public String getAppName(){
            return name;
        }
    }

    搞定!!

    现在发现,如果每个Controller类都重复定义一遍,properties里面那么多配置信息,很麻烦,可以使用另外一种方式:

    4.2:@ConfigurationProperties方式:创建一个自定义AppConfig类,并且设置set和get方法

    package com.htmltest.test1.config;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    @Component  // 这是一个组件类,写上这个注解,Spring Boot启动时会加载它
    @ConfigurationProperties(prefix = "app") // 将所有app前缀的属性,自动赋值给对应的Bean属性
    // 比如:name对应app前缀的app.name赋值,pageSize对应app.page-size赋值
    public class AppConfig {
    
        private String name;
        private Integer pageSize;
        private String description;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(Integer pageSize) {
            this.pageSize = pageSize;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public String getVersion() {
            return version;
        }
    
        public void setVersion(String version) {
            this.version = version;
        }
    
        public Boolean getShowAdvert() {
            return showAdvert;
        }
    
        public void setShowAdvert(Boolean showAdvert) {
            this.showAdvert = showAdvert;
        }
    
        private String version;
        private Boolean showAdvert;
    }

    这样的话,每个Controller类中都可以方便的使用了:

    @RestController
    public class MyController {
    
    
    //    @Resource   和 @Autowired功能一样效果
    //    private AppConfig appConfig;
    
        @Autowired
        private AppConfig appConfig;
    
        @RequestMapping(value = "/name")
        public String getAppName(){
            return appConfig.getName();
        }
    }
  • 相关阅读:
    Java反射研究(3)
    Java反射研究(2)
    Java反射研究(1)
    从百度文库中复制文本的方法
    jdk/bin中的native2ascii.exe使用
    EA经典入门教程
    JSP自定义标签(3)
    JSP自定义标签(1)
    将Java doc转换为chm的方法
    多态性——vptr和vtable
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/10166030.html
Copyright © 2020-2023  润新知