
# 日志配置
spring-boot-starter-huawei中默认使用slf4j作为日志门面，log4j2作为日志实现框架。
当项目中的依赖可能存在有关logback日志框架的时候需要将其排除，否则可能会有spring-boot-starter-huawei中配置的slf4j（使用log4j-slf4j-impl桥接slf4j的日志）的日志框架相冲突。
org.springframework.boot:spring-boot-starter-logging使用的也是logback的日志框架，所以当项目的依赖中存在对spring-boot-starter-logging的依赖时需要将其排除，例如：
```
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
```
对于开发时简单的日志配置，直接在application.yml中使用yml方式进行配置，该配置简单易于理解；但也只能进行简单的配置，滚动策略无法配置。
- **在application.yml中配置简单的日志。**
  ```
  #日志配置
  logging:
    charset:
      file: UTF-8
      console: UTF-8
    file:
      name: /opt/cloud/log/{服务名}/{服务名}.log #日志文件的位置及名称
    pattern:
      file: "[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%X{apm-traceid}] [%X{apm-gtraceid}] [%logger{15}] - [%msg]%n" #日志记录格式
      console: "[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%X{apm-traceid}] [%X{apm-gtraceid}] [%logger{15}] - [%msg]%n" #日志记录格式
    level:
      root: INFO
      org.mybatis: DEBUG
      org.springfrmework: INFO
      com.example.demo.controller: INFO
  ```
  以上日志配置适合开发时本地配置，较为简单。当以上配置无法满足要求的时候，可以使用单独的日志配置文件来进行日志配置。
  
- **使用yml文件进行日志配置** 。
  ```
  #日志配置
  #配置log4j2日志文件时使用yml方式配置,在项目资源路径下添加log4j2.yml文件(或在application.yml中使用logging.config=log4j2-xxx.yml指定位置)配置内容如下示例:
  Configuration:
    status: warn
    Properties: # 变量定义
      Property: #
    - name: microservice### DONE: 增加配置
  value: default
        - name: log.path #日志路径,推荐配置:此路径
          value: /opt/cloud/log/${microservice}
    - name: log.pattern #日志格式,推荐此格式
          value: "[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%X{apm-traceid}] [%X{apm-gtraceid}] [%logger{15}] - [%msg]%n"###DONE LC:paas规范 刷新减掉 timestamp , 与apm集成
    Appenders:
      Console:  # 输出到控制台
        name: CONSOLE
        target: SYSTEM_OUT
        ThresholdFilter: #过滤条件
          level: info###DONE: LC:Console只输出info级别就即可， 详细debug日志记录到文件
          onMatch: ACCEPT
          onMismatch: DENY
        PatternLayout:
          pattern: "${log.pattern}" # 控制台输出格式
      RollingFile: # 输出到文件
        - name: ROLLING_FILE
          ignoreExceptions: false
          fileName: "${log.path}/${microservice}.log" #日志文件名称###DONE LC： ${}} demo?  应用名？
          filePattern: "${log.path}/${microservice}-%d{yyyy-MM-dd}.%i.zip" #压缩后日志文件名称###DONE 看规范是否要更新建议
          append: true
          PatternLayout:
            pattern: "${log.pattern}" # 文件输出格式
          Policies:
  #          TimeBasedTriggeringPolicy:  #按天分类
  #            modulate: true
  #            interval: 1
            SizeBasedTriggeringPolicy: #按大小分类
              size: 100MB #大小,超过此大小后压缩打包日志文件,单位:KB,MB,GB###DONE -> 刷新规范是50MB
          DefaultRolloverStrategy: #最大保存文件个数
            max: 100###DONE -> LC: 刷新规范是40 -> 100
            Delete: # 删除策略
      basePath: ${log.path} # 删除基本路径
              maxDepth: 2 # 目录检索深度,当前${log.path}指定的目录深度为0
              IfFileName: # 匹配文件名称删除
    glob: "*${microservice}-*zip" # 文件名称  ###DONE LC： demo被hardcode了
                IfLastModified: # 删除文件条件定义
                  age: 7d # 7天或以上
                  ifAny: # 附件的一些条件,可不定义
                    IfAccumulatedFileSize: # 文件大小,当前满足age设定的条件时,并且达到该条件则删除(保留10G过期文件)
                      exceeds: 10GB
                    IfAccumulatedFileCount: # 文件个数,当前满足age设定的条件时,并且达到该条件则删除(保留100个过期文件)
                      exceeds: 100
    Loggers:
      Root:
        level: info
        AppenderRef:
          - ref: CONSOLE
          - ref: ROLLING_FILE
      Logger:
        - name: com.huaweicloud.sample.core.controller
          level: debug
          additivity: false # 是否向父logger传递,否:false
          AppenderRef:
            - ref: CONSOLE
            - ref: ROLLING_FILE
  ```
  
- **使用xml文件进行日志配置** 。
  ```
  <?xml version="1.0" encoding="UTF-8"?>
  <!--配置log4j2日志文件时使用xml方式配置,在项目资源路径下添加log4j2.xml文件(或在application.yml中使用logging.config=log4j2-xxx.xml指定位置)配置内容如下示例:-->
  <Configuration status="debug" strict="true" name="XMLConfigTest" packages="org.apache.logging.log4j.test">
    <Properties>
      <Property name="microservice">default</Property>
      <Property name="log.path">/opt/cloud/log/${microservice}</Property>
      <Property name="log.pattern">[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%X{apm-traceid}] [%X{apm-gtraceid}] [%logger{15}] - [%msg]%n</Property>
    </Properties>
    <Appenders>
      <Appender type="Console" name="CONSOLE">
        <Layout type="PatternLayout" pattern="${log.pattern}" />
        <Filters>
          <Filter type="ThresholdFilter" level="info" onMatch="ACCEPT" onMismatch="DENY" />
        </Filters>
      </Appender>
      <RollingFile name="ROLLING_FILE">
        <FileName>${log.path}/${microservice}.log</FileName>
        <FilePattern>${log.path}/${microservice}-%d{yyyy-MM-dd}.%i.zip</FilePattern>
        <Layout type="PatternLayout">
          <Pattern>${log.pattern}</Pattern>
        </Layout>
        <Policies>
          <SizeBasedTriggeringPolicy size="100MB" />
        </Policies>
        <DefaultRolloverStrategy max="100">
  <Delete basePath="${log.path}" maxDepth="2">
    <IfFileName glob="*${microservice}-*zip">
  <IfLastModified age="7d">
                <IfAny>
                  <IfAccumulatedFileSize exceeds="10GB" />
                  <IfAccumulatedFileCount exceeds="100" />
                </IfAny>
              </IfLastModified>
            </IfFileName>
          </Delete>
        </DefaultRolloverStrategy>
      </RollingFile>
    </Appenders>
    <Loggers>
      <Root level="info">
        <AppenderRef ref="CONSOLE" />
        <AppenderRef ref="ROLLING_FILE" />
      </Root>
      <Logger name="org.mybatis" level="debug" additivity="false">
        <AppenderRef ref="CONSOLE" />
        <AppenderRef ref="ROLLING_FILE" />
      </Logger>
      <Logger name="com.example.demo.controller" level="info" additivity="false">
        <AppenderRef ref="CONSOLE" />
        <AppenderRef ref="ROLLING_FILE" />
      </Logger>
    </Loggers>
  </Configuration>
  ```
  
更多配置，请参考[log4j2官方文档](https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-configuration.html)配置。
