Logback logs are output to different files according to type

background

The company wants to divide the project's logs into different categories, such as all logs, request logs, error logs, and SQL logs.

The currently used logging framework is slf4j + logback.

train of thought

To divide logs into different categories, you can use Logback's log levels and filters.

Then, different log levels and filters can be set for specific log types.

Pre-realization knowledge preparation

Logback appender tags

In Logback, <appender>used to define a destination for log output. Logback provides multiple types of appenders that can output log records to different targets, such as consoles, files, databases, etc.

The following are the commonly used appender types for Logback:

ConsoleAppender: Output the log to the console.

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">     
	<encoder>
   		<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
	 </encoder>
 </appender>

FileAppender: Output the log to a file.

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
	<file>/path/to/logfile.log</file>    
 	<encoder> 
         <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   
 	</encoder>
 </appender>

RollingFileAppender: Output the log to a rolling file, and the log file can be split according to certain rules (such as time and file size).

<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">     <file>/path/to/logfile.log</file>
	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
		<fileNamePattern>/path/to/logfile-%d{yyyy-MM-dd}.log</fileNamePattern>   
		<maxHistory>30</maxHistory>
	</rollingPolicy>
	<encoder>
		<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
	</encoder> 
</appender>

These are just some commonly used appender types. Logback also provides more appenders, such as SyslogAppender, SMTPAppender, etc., and you can choose a suitable appender according to your actual needs.

In the Logback configuration file, you can <appender-ref>refer to the corresponding appender and associate it with a specific logger to realize the log output target configuration.

Logback's logger tag

Logback <logger>tags are used to define loggers, which can be used to distinguish different loggers based on package names or class names, and set corresponding log levels and output targets.

Here is an example <logger>tag configuration:

<configuration> 
    <!-- 其他配置 --> 
      <logger name="com.example.package" level="DEBUG">  
           <appender-ref ref="CONSOLE"/> 
           <appender-ref ref="FILE"/> 
      </logger>   
 <!-- 其他配置 -->
  </configuration>

In the above example, <logger>the tag's nameattribute specifies the package or class name to match (usually using the package name), and levelthe attribute specifies the log level.

Tags can <logger>be used inside tags <appender-ref>to refer to defined <appender>ones to log to the corresponding output targets (such as console, file, etc.).

Note that Logback will match according to the order of Logger configuration, so in the configuration file, generally put the Logger with high priority first.

Wildcards can be used to match multiple package or class names, for example:

<logger name="com.example.package.*" level="DEBUG">   
  <!-- 配置 -->
 </logger>

The above configuration will match all classes starting with "com.example.package."

<logger>In addition, other properties of can also be configured , such as additivitythe property is used to specify whether to pass the log event to a higher-level Logger.

In summary, <logger>tags are used to define different loggers, and control the logging behavior of logs by setting levels and output targets.

Implementation

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 日志文件目录 -->
    <property name="LOG_PATH" value="logs"/>
    <!-- 日志文件名称 -->
    <property name="LOG_NAME" value="report"/>

    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}}/${LOG_NAME:-application}"/>
    <property name="LOG_FILE_ERROR" value="${LOG_FILE_ERROR:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}}/${LOG_NAME:-application}-error"/>
    <property name="LOG_FILE_REQUEST" value="${LOG_FILE_REQUEST:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}}/${LOG_NAME:-application}-request"/>
    <property name="LOG_FILE_SQL" value="${LOG_FILE_SQL:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}}/${LOG_NAME:-application}-sql"/>
    <property name="LOG_FILE_SUFFIX" value="${LOG_FILE_SUFFIX:-${LOG_NAME_EXTENSION:-gz}}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <!-- 所有日志 Appender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.${LOG_FILE_SUFFIX}</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-20MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-14}</maxHistory>
            <totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-1GB}</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- ERROR日志 Appender -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE_ERROR}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_ERROR}.%d{yyyy-MM-dd}.%i.${LOG_FILE_SUFFIX}</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-20MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-14}</maxHistory>
            <totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-1GB}</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 请求日志 Logger -->
    <appender name="FILE_REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE_REQUEST}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${LOG_FILE_REQUEST}.%i.${LOG_FILE_SUFFIX}</fileNamePattern>
            <minIndex>${LOG_FILE_MIN_INDEX:-1}</minIndex>
            <maxIndex>${LOG_FILE_MAX_INDEX:-3}</maxIndex>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>${LOG_FILE_MAX_SIZE:-20MB}</maxFileSize>
        </triggeringPolicy>
    </appender>
    <!-- 显示请求URL -->
    <logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_REQUEST" />
    </logger>
    <!-- 显示请求映射Controller -->
    <logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_REQUEST" />
    </logger>
    <!-- 显示请求返回内容 -->
    <logger name="org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_REQUEST" />
    </logger>

    <!-- SQL日志 Logger -->
    <appender name="FILE_SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE_SQL}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${LOG_FILE_SQL}.%i.${LOG_FILE_SUFFIX}</fileNamePattern>
            <minIndex>${LOG_FILE_MIN_INDEX:-1}</minIndex>
            <maxIndex>${LOG_FILE_MAX_INDEX:-3}</maxIndex>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>${LOG_FILE_MAX_SIZE:-20MB}</maxFileSize>
        </triggeringPolicy>
    </appender>
    <logger name="SQL" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_SQL" />
    </logger>

    <logger name="com.shsnc" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="FILE_ERROR" />
    </logger>

    <root level="WARN">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="FILE_ERROR" />
    </root>

</configuration>

Guess you like

Origin blog.csdn.net/qq_29917503/article/details/131802556