服务器之家

服务器之家 > 正文

spring boot使用logback日志级别打印控制操作

时间:2021-08-17 11:44     来源/作者:Solyutian

因为公司业务需要,需要把性能日志和业务日志分开打印,用elk收集处理,所以需要对不同的业务的日志,打印到不同文件。

使用的是spring boot自带的logback。

首先在yml文件配置logback.xml文件,默认会从resources下找logback.xml文件,找不到会从yml文件中找logging.config下的指定文件。

?
1
2
3
logging:
 level: DEBUG
 config: classpath:logback.xml

logback.xml是logback的配置文件,可以设置打印文件的路径,格式,过滤打印的级别等等,我们来看一下logback.xml文件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?xml version="1.0" encoding="UTF-8"?>
<!--根标签-->
<configuration>
  <!--设置变量,name为变量名,value为值,可以使用${变量名}方式使用-->
  <property name="APPDIR" value="log" />
  <property name="LOG_HOME" value="/var/app/logs" />
  <property name="APPNAME" value="app_test" />
  <property name="MDC_LOG_PATTERN"
  value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %p app_test %t %logger{50} [line:%L %msg]%n"></property>
 
  <!-- 性能日志记录器,日期滚动记录 -->
  <!--当一个记录日志的事件被发起时,logback 会将这个事件发送给 appender-->
  <!--RollingFileAppender,滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件-->
  <appender name="performanceAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 记录的日志文件的路径及文件名 -->
    <file>${LOG_HOME}/${APPNAME}/performanceLog/${APPNAME}.log</file>
    <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
    <!--TimeBasedRollingPolicy 实现的是基于时间的分包策略,分包间隔是根据fileNamePattern中指定的事件最小单位-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 归档的日志文件的路径,例如今天是2018-12-19日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
        而2018-12-01的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
      <fileNamePattern>${LOG_HOME}/${APPNAME}/performanceLog/${APPNAME}-%d{yyyyMMdd}.%i.log</fileNamePattern>
      <!-- 除按日志记录之外,还配置了日志文件不能超过50Mb,若超过50Mb,日志文件会以索引0开始, 命名日志文件,例如app_test-20181219.0.log -->
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!--最大50mb-->
        <maxFileSize>50MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <!-- 追加方式记录日志 -->
    <append>true</append>
    <!-- 日志文件的格式和编码 -->
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%d{yyyy/MM/dd' 'HH:mm:ss.SSS} %X{req.requestId}[line:%L %msg] %n</pattern>
      <charset>utf-8</charset>
    </encoder>
     <!--此日志文件只记录info级别的-->
    <!--filter是日志过滤器-->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!--过滤级别-->
      <level>info</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!-- 运行日志记录器,日期滚动记录 -->
  <appender name="bizAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 正在记录的日志文件的路径及文件名 -->
    <file>${LOG_HOME}/${APPNAME}/bizLog/${APPNAME}.log</file>
    <!-- 日志记录器的滚动策略,按日期,按大小记录-->
 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      
      <fileNamePattern>${LOG_HOME}/${APPNAME}/bizLog/${APPNAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如bizlog-biz-20181219.0.log -->
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>50MB</maxFileSize>
        <!--保存时间3天-->
        <!--<MaxHistory>3</MaxHistory>-->
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <!-- 追加方式记录日志 -->
    <append>true</append>
    <!-- 日志文件的格式 -->
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%d{yyyy/MM/dd' 'HH:mm:ss.SSS} %X{req.requestId}[line:%L %msg] %n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <!-- 此日志文件只记录info级别的 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>info</level>
      <level>error</level>
      <!--<onMatch>ACCEPT</onMatch>-->
      <!--<onMismatch>DENY</onMismatch>-->
    </filter>
  </appender>
 
  <!--ConsoleAppender是打印到控制台的-->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!--encoder 默认配置为PatternLayoutEncoder-->
    <encoder>
      <pattern>${MDC_LOG_PATTERN}</pattern>
      <charset>utf-8</charset>
    </encoder>
    <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>all</level>
    </filter>
  </appender>
 
  <!--使用LoggerFactory.getLogger("performanceLogger") 使用这个logger-->
  <logger name="performanceLogger" additivity="false">
    <!--使用哪一个Appender-->
    <appender-ref ref="performanceAppender" />
 
  </logger>
  <!--根loger。只有一个level属性,应为已经被命名为"root".-->
  <root level="info">
    <appender-ref ref="bizAppender" />
    <appender-ref ref="STDOUT" />
 
  </root>
</configuration>

<configuration>:根标签,所有标签都在里面。

<property>:属性标签,设置变量,name为变量名,value为值,可以使用${变量名}方式使用。

<appender>:当一个记录日志的事件被发起时,logback 会将这个事件发送给 appender,经常使用的有ch.qos.logback.core.ConsoleAppender和ch.qos.logback.core.rolling.RollingFileAppender,ConsoleAppender是打印到控制台的,RollingFileAppender是滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。

<file>:在<appender>中使用,记录的日志文件的路径及文件名。

<rollingPolicy>:分包策略,就是前一天日志的存储文件名,大小,压缩格式,存放天数。ch.qos.logback.core.rolling.TimeBasedRollingPolicy:实现的是基于时间的分包策略,分包间隔是根据<fileNamePattern>中指定的事件最小单位。

<fileNamePattern>:存放日志的路径和名称。

<maxFileSize>:每个文件最大文件。

<encoder>:日志文件的格式和编码。

<charset>:日志编码格式。

<pattern>:设置日志打印格式。

<filter>:日志过滤器。

<level>:日志过滤级别,TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF。

<logger>:使用LoggerFactory.getLogger("performanceLogger") 使用这个logger。

<root>:根loger。只有一个level属性,应为已经被命名为"root"。

%d{yyyy/MM/dd' 'HH:mm:ss.SSS}:是对时间格式化,2018/12/19 17:31:17.126

%X{ req.requestId}:在MDC类中添加req.requestId参数,即可在logback.xml中使用,后面讲MDC类。

%p:打印出日志级别信息,如:INFO,ERROR等错误级别。

%t:是打印出线程或者哪个类打印出的日志。

%L:打印出当前行数。

%msg:就是日志信息啦。就是logger.info("xxx"),xxx就是%msg。

%n:换行。

MDC

是为了便于我们诊断线上问题而出现的方法工具类。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MDC {
 //Put a context value as identified by key
 //into the current thread's context map.
 public static void put(String key, String val);
 
 //Get the context identified by the key parameter.
 public static String get(String key);
 
 //Remove the context identified by the key parameter.
 public static void remove(String key);
 
 //Clear all entries in the MDC.
 public static void clear();
}

基本使用

?
1
2
3
MDC.put("req.requestId", uuid);
MDC.put("req.remoteHost", request.getRemoteHost());
<pattern>%d{yyyy/MM/dd' 'HH:mm:ss.SSS} %X{req.requestId}[line:%L %msg] %n</pattern>

在logback.xml中可使用%X{req.requestId},得到uuid。

打印到不同文件

?
1
private final static Logger performanceLogger = LoggerFactory.getLogger("performanceLogger");

这样就可以使用logback.xml里<logger>里的performanceLogger,performanceLogger引用的是performanceAppender。

?
1
private static final Logger logger = LoggerFactory.getLogger(Class.class);

这样使用的就是logback.xml里的<root>标签里的bizAppender。

这样就基本实现了分不同业务逻辑打印到不同文件了。

补充:Springboot 使用logback将各级别日志分别输出到不同路径

SpringBoot默认已经依赖了部分日志框架(如Logback),且其中推荐使用的也是Logback,所以本次项目中我们将通过新增Logback日志的配置,将各级别日志分别输出到不同路径。

SpringBoot已经依赖了Logback,所以不需要手动添加依赖。

SpringBoot会自动识别和读取resources目录下新建logback-spring.xml,所以不需要在application.yml进行其他的配置了。

配置文件具体如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- 项目名称 -->
  <property name="PROJECT_NAME" value="XXXXX" />
 
  <!-- 文件输出格式 -->
  <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
  <!-- 输出文件路径 -->
  <property name="OPEN_FILE_PATH" value="logs/manager"/>
 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>${PATTERN}</pattern>
      <charset>UTF-8</charset>
    </encoder>
  </appender>
 
  <!-- ch.qos.logback.core.rolling.RollingFileAppender 文件日志输出 -->
  <appender name="OPEN-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--不能有这项配置!!!!!-->
    <!--<Encoding>UTF-8</Encoding>-->
    <!--<File>${OPEN_FILE_PATH}/zqread.log</File>-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!--日志文件输出的文件名-->
      <FileNamePattern>${OPEN_FILE_PATH}/all/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <!--日志文件保留天数-->
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!--日志文件最大的大小-->
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
 
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>${PATTERN}</pattern>
    </layout>
  </appender>
 
  <!--输出到debug-->
  <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${OPEN_FILE_PATH}/debug/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
      <level>DEBUG</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!--输出到info-->
  <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${OPEN_FILE_PATH}/info/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!--输出到error-->
  <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${OPEN_FILE_PATH}/error/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
      <level>ERROR</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!--输出到warn-->
  <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${OPEN_FILE_PATH}/warn/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印WARN日志 -->
      <level>WARN</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <root level="info">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="OPEN-FILE"/>
    <appender-ref ref="debug" />
    <appender-ref ref="info" />
    <appender-ref ref="error" />
    <appender-ref ref="warn" />
  </root>
</configuration>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/Solyutian/article/details/85102695

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部