SpringBoot+logback默认日志的配置和使用

记录一下SpringBoot2.0.x使用默认logback日志的配置和常见使用

SpringBoot的默认日志是logback,在SpringBoot2.0.x版本中使用logback很方便而且内存开销小,速度快,还不需要去单独的配置maven的jar包,因为已经集成整合了的。作为专门写代码来应用的,不需要知道logback到底怎么实现的,什么底层,什么抽象层,反正用SpringBoot默认的就对了,有特殊要求使用其他的 ,查找博客就能解决导包这些问题。

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.5.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

从这里点进去

<!--web模块的启动器 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

可以看到这个starter 继续点进去查看

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.0.5.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
  <version>2.0.5.RELEASE</version>
  <scope>compile</scope>
</dependency>

myw

配置文件的位置

在项目的/src/main/resources目录下,新建logback的默认日志配置文件logback-spring.xml(配置默认就能生效)

myw
注意:当然也可以直接logback.xml直接测试也是能生效的

如果说我不喜欢他的默认文件名 我非要自定义呢?

自定义配置文件名 myw-logback-test.xml

单独加一个配置在application.properties

#配置文件
logging.config=classpath:myw-logback-test.xml

myw

配置文件内容

logback的配置文件内容 这个还真的逐字逐句的了解其真意,这对使用来说特别有用的,最常用的文件类型格式如下

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="60 seconds" debug="false">
	
	<!--不设置的话默认名称是default,contextName标签能设置成其他名称,用于区分不同程序应用-->
    <contextName>spring-boot-logging-myw</contextName>
    
    <!--配置日志文件的输出路径-->
    <property name="log.path" value="myw-log/" />  
    
    <!--输出到控制台或者文件-->
    <appender name="xxxxxx" class="ch.qos.logback.core.xxxxxxxxx">
    	<!--内容-->
    </appender>
    
	<!-- 用来设置某一个包或者具体的某一个类的日志打印 -->
	<logger level="xxxx" name="xxxxx">
		<!--内容-->
	</logger>

    <!--指定基础控制台的日志输出级别,level属性指定级别 必须配置的-->
    <root level="xxx">
    	<!--内容-->
    </root>

</configuration>

configuration标签

scan=“true” scan属性默认就是true 意思是说配置文件发生改变后,将会重新加载,默认值为true 实际使用默认就可以。
scanPeriod=“60 seconds” 这个是设置检测配置文件是否修改的时间间隔,时间单位默认是毫秒,默认1分钟,但是给了秒的单位后就是秒,一般大家都是是60 seconds这样配置。
debug=“false” 这个属性默认是false 如果需要查看logback内部日志,可以设置为true时,这样可以实时查看logback运行状态数据,实际上没用过也没测试过 不关心这个点儿。

contextName标签

这个标签默认名字是default 如果需要可以改成其他名字,一般没用

<!--不设置的话默认名称是default,contextName标签能设置成其他名称,用于区分不同程序应用-->
<contextName>spring-boot-logging-myw</contextName>

在idea的控制台会显示设置的名称
myw
但是在log日志文件里没有这个属性值
myw
property标签
用法是在当前根目录下创建日志文件夹

<!-- 当前根目录下创建路径 -->
<property name="log.path" value="myw-log/" />

也可以使用绝对路径 在linux中用绝对路径反而更美,一般放在linux的data目录下面,这样不管是直接启动还是使用脚本启动还是服务方式开机启动 都在data下面 当然也可以用相对路径 但是在加了开机启动service方式可能日志路径在/根目录下面。

<property name="log.path" value="/data/myw-log/" />

在项目中运行的话这个日志文件在
myw

appender标签

<!--输出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名 -->
    <file>${log.path}/log_info.log</file>
    <!--日志输出格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset> <!-- 此处设置字符集 -->
    </encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/sys_log-info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
        <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
		<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			<maxFileSize>50MB</maxFileSize>
		</timeBasedFileNamingAndTriggeringPolicy>
        <!-- 日志保存周期  天数-->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    
    <!-- 级别过滤 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

appender标签的name和class name可以根据需要定义 class就给ch.qos.logback.core.rolling.RollingFileAppender搞定,滚动记录文件,目的是当符合某个条件时,将日志记录到特殊的日志文件,其他方式也有,具体调整具体配置,写入文件用这个就够了,无需多学。
file标签用来定义文件名字,encoder标签用来定义日志记录格式和编码的,没啥好说的。
rollingPolicy标签,用来移动和重命名日志文件的,使用class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"就可以了,里面的标签有配置日志保存天数 日志文件大小等,也都直接用,要对日志的配置研究深入再说吧。

filter标签,class属性有临界值过滤和级别过滤

class=“ch.qos.logback.classic.filter.LevelFilter”
根据日志级别进行过滤,如果日志级别等于配置级别,过滤器会根据onMath(用于配置符合过滤条件的操作) 和 onMismatch(用于配置不符合过滤条件的操作)接收或拒绝日志,一般用这种。

 <!-- 级别过滤 -->
 <filter class="ch.qos.logback.classic.filter.LevelFilter">
     <level>INFO</level>
     <onMatch>ACCEPT</onMatch>
     <onMismatch>DENY</onMismatch>
 </filter>

class=“ch.qos.logback.classic.filter.ThresholdFilter”
过滤掉低于指定临界值的日志,当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。

<!-- 级别过滤 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>INFO</level>
</filter>

DENY:日志将立即被抛弃不再经过其他过滤器。
NEUTRAL:有序列表里的下个过滤器过接着处理日志。
ACCEPT:日志会被立即处理,不再经过剩余过滤器。

日志级别

日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL
TRACE 和 FATAL 忽略 那么只关心日志级别 DEBUG < INFO < WARN < ERROR

那么我需要把debug info warn error分开写入不同的文件的配置

<!--输出到文件-->
<appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名 -->
    <file>${log.path}/log_debug.log</file>
    <!--日志输出格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset> <!-- 此处设置字符集 -->
    </encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/sys_log-debug-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
        <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
		<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			<maxFileSize>50MB</maxFileSize>
		</timeBasedFileNamingAndTriggeringPolicy>
        <!-- 日志保存周期  天数-->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    
    <!-- 级别过滤 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>DEBUG</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

<!--输出到文件-->
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名 -->
    <file>${log.path}/log_error.log</file>
    <!--日志输出格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset> <!-- 此处设置字符集 -->
    </encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/sys_log-error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
        <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
		<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			<maxFileSize>50MB</maxFileSize>
		</timeBasedFileNamingAndTriggeringPolicy>
        <!-- 日志保存周期  天数-->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    
    <!-- 级别过滤 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

<!--输出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名 -->
    <file>${log.path}/log_info.log</file>
    <!--日志输出格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset> <!-- 此处设置字符集 -->
    </encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/sys_log-info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
        <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
		<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			<maxFileSize>50MB</maxFileSize>
		</timeBasedFileNamingAndTriggeringPolicy>
        <!-- 日志保存周期  天数-->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    
    <!-- 级别过滤 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

<!--输出到文件-->
<appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名 -->
    <file>${log.path}/log_warn.log</file>
    <!--日志输出格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset> <!-- 此处设置字符集 -->
    </encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/sys_log-warn-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
        <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
		<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			<maxFileSize>50MB</maxFileSize>
		</timeBasedFileNamingAndTriggeringPolicy>
        <!-- 日志保存周期  天数-->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    
    <!-- 级别过滤 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>WARN</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
    

我们在开发的时候 控制台也是需要打印日志的,因此需要配置

<!--输出到控制台-->
<appender name="console_debug" class="ch.qos.logback.core.ConsoleAppender">
	
	<!--日志输出格式 -->
    <encoder>
        <pattern>%d{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">
        <level>DEBUG</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

</appender>

<!--输出到控制台-->
<appender name="console_info" class="ch.qos.logback.core.ConsoleAppender">

    <!--日志输出格式 -->
    <encoder>
        <pattern>%d{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">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

</appender>

<!--输出到控制台-->
<appender name="console_warn" class="ch.qos.logback.core.ConsoleAppender">

    <!--日志输出格式 -->
    <encoder>
        <pattern>%d{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">
        <level>WARN</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

</appender>

<!--输出到控制台-->
<appender name="console_error" class="ch.qos.logback.core.ConsoleAppender">

    <!--日志输出格式 -->
    <encoder>
        <pattern>%d{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">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

</appender>

root标签
用来指定控制台的输出级别和记录日志的级别,一般使用info级别

 <root level="debug">
 	<appender-ref ref="file_debug" />
 	<appender-ref ref="file_info" />
 	<appender-ref ref="file_warn" />
     <appender-ref ref="file_error" />
     <appender-ref ref="console_debug" />
     <appender-ref ref="console_info" />
     <appender-ref ref="console_warn" />
     <appender-ref ref="console_error" />
 </root>

写一个控制层LogBackController

package boot.example.logback.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value="/logback")
public class LogBackController {
	
	private final Logger log =  LoggerFactory.getLogger(this.getClass());
	
	@RequestMapping(value="/hello")
	public String hello() {
		System.out.println("System.out.println 打印");
		log.info("log info 日志");
		log.error("log error 日志");
		log.warn("log warn 日志");
		log.debug("log debug 日志");

		return "hello world";
	}
}

root标签的level属性设置debug

启动的时候控制台会显示很多信息,然后访问接口可以看到四种级别的日志都有,甚至还有调试日志
myw
在查看file文件的日志
myw
root标签的level属性设置info

设置info后可以看到debug日志没有了,相对来说好的多了 info也是推荐的设置,因为他能显示info warn和error的日志数据
控制台 -已经没有了debug的数据
myw

文件的日志
myw
myw

root标签的level属性设置warn

控制台 只有error和warn 至于上面的debug是main的 无需关心
myw
文件日志
myw
myw
至于error 不测试了

完整的logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="60 seconds" debug="false">

    <!--不设置的话默认名称是default,contextName标签能设置成其他名称,用于区分不同程序应用-->
    <contextName>spring-boot-logging-myw</contextName>

    <!-- 当前根目录下创建路径 -->
    <property name="log.path" value="myw-log/" />
    
    <!--输出到控制台-->
    <appender name="console_debug" class="ch.qos.logback.core.ConsoleAppender">
    	
    	<!--日志输出格式 -->
        <encoder>
            <pattern>%d{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">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

    </appender>

    <!--输出到控制台-->
    <appender name="console_info" class="ch.qos.logback.core.ConsoleAppender">

        <!--日志输出格式 -->
        <encoder>
            <pattern>%d{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">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

    </appender>

    <!--输出到控制台-->
    <appender name="console_warn" class="ch.qos.logback.core.ConsoleAppender">

        <!--日志输出格式 -->
        <encoder>
            <pattern>%d{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">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

    </appender>

    <!--输出到控制台-->
    <appender name="console_error" class="ch.qos.logback.core.ConsoleAppender">

        <!--日志输出格式 -->
        <encoder>
            <pattern>%d{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">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

    </appender>

    <!--输出到文件-->
    <appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
    	<!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_debug.log</file>
        <!--日志输出格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/sys_log-debug-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>50MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
            <!-- 日志保存周期  天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        
        <!-- 级别过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--输出到文件-->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
    	<!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_info.log</file>
        <!--日志输出格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/sys_log-info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>50MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
            <!-- 日志保存周期  天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        
        <!-- 级别过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!--输出到文件-->
    <appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
    	<!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_warn.log</file>
        <!--日志输出格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/sys_log-warn-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>50MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
            <!-- 日志保存周期  天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        
        <!-- 级别过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--输出到文件-->
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_error.log</file>
        <!--日志输出格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/sys_log-error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过50M,若超过50M,日志文件会以索引0开始, 命名日志文件,例如xxx-2023-07-16.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 日志保存周期  天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <!-- 级别过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <root level="info">
    	<appender-ref ref="file_debug" />
    	<appender-ref ref="file_info" />
    	<appender-ref ref="file_warn" />
        <appender-ref ref="file_error" />
        <appender-ref ref="console_debug" />
        <appender-ref ref="console_info" />
        <appender-ref ref="console_warn" />
        <appender-ref ref="console_error" />
    </root>

</configuration>

在java中最简单的使用

	private final Logger log =  LoggerFactory.getLogger(this.getClass());

在静态类里面

package boot.example.logback.controller;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class StaticUtils {
    public static final Logger log =  LoggerFactory.getLogger(StaticUtils.class);

    public static void testLog(){
        log.info("log info");
    }
}

还可以借助lombok

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>RELEASE</version>
	<scope>compile</scope>
</dependency>
package boot.example.logback.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController
@RequestMapping(value="/logback")
public class LogBackController2 {

	@RequestMapping(value="/hello2")
	public String hello() {
		System.out.println("System.out.println2 打印");
		log.info("log info2 日志");
		log.error("log error2 日志");
		log.warn("log warn2 日志");
		log.debug("log debug2 日志");

		StaticUtils2.testLog();

		return "hello world";
	}


}

package boot.example.logback.controller;


import lombok.extern.slf4j.Slf4j;

@Slf4j
public class StaticUtils2 {

    public static void testLog(){
        log.info("log info");
    }
}

至于logback里的其他标签 不是真正的刚需就不需要去花时间记录了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/59500.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《吐血整理》高级系列教程-吃透Fiddler抓包教程(21)-如何使用Fiddler生成Jmeter脚本-上篇

1.简介 我们知道Jmeter本身可以录制脚本&#xff0c;也可以通过BadBoy&#xff0c;BlazeMeter等工具进行录制&#xff0c;其实Fiddler也可以录制Jmter脚本&#xff08;而且有些页面&#xff0c;由于安全设置等原因&#xff0c;使用Jmeter直接无法打开录制时&#xff0c;这时就…

数据结构 10-排序4 统计工龄 桶排序/计数排序(C语言)

给定公司名员工的工龄&#xff0c;要求按工龄增序输出每个工龄段有多少员工。 输入格式: 输入首先给出正整数&#xff08;≤&#xff09;&#xff0c;即员工总人数&#xff1b;随后给出个整数&#xff0c;即每个员工的工龄&#xff0c;范围在[0, 50]。 输出格式: 按工龄的递…

第126天:内网安全-隧道技术SSHDNSICMPSMB上线通讯LinuxMac

知识点 #知识点&#xff1a; 1、入站规则不出网上线方案 2、出站规则不出网上线方案 3、隧道技术-SMB&ICMP&DNS&SSH 4、控制上线-Linux&Mac&IOS&Android-连接方向&#xff1a;正向&反向&#xff08;基础课程有讲过&#xff09; -内网穿透&#xf…

JMeter 4.x 简单使用

文章目录 前言JMeter 4.x 简单使用1. 启动2. 设置成中文3. 接口测试3.1. 设置线程组3.2. HTTP信息请求头管理器3.3. 添加HTTP请求默认值3.4. 添加HTTP cookie 管理3.5. 添加http请求3.5.1. 添加断言 3.6. 添加监听器-查看结果树3.7. 添加监听器-聚合报告 4. 测试 前言 如果您觉…

eeglab(自用)

目录 1.加载、显示数据 2.绘制脑电头皮图 3.绘制通道光谱图 4.预处理工具 5.ICA去除伪迹 5. 提取数据epoch 1.加载、显示数据 观察事件值(Event values)&#xff1a;该数据集中包含2400个事件&#xff0c;每个事件指定了EEG.event结构的字段Type(类型)、position(位置)和…

macOS 环境变量加载探究

使用 macOS 安装环境&#xff0c;见到过很数种环境变量配置方法&#xff0c;每次也都是按照别人的代码&#xff0c;人家配置在哪 我就配置在哪&#xff0c;其实不太清楚有什么区别&#xff0c;决定记录下。 本机 macOS 13.3&#xff0c;从 macOS Catalina(10.15) 开始&#xf…

Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

文章目录 一、图像平移二、图像旋转2.1 求旋转矩阵2.2 求旋转后图像的尺寸2.3手工实现图像旋转2.4 opencv函数实现图像旋转 三、图像翻转3.1左右翻转3.2、上下翻转3.3 上下颠倒&#xff0c;左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…

【IDEA+Spark Streaming 3.4.1+Dstream监控套接字流统计WordCount保存至MySQL8】

【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】 把DStream写入到MySQL数据库中 Spark 3.4.1MySQL 8.0.30sbt 1.9.2 文章目录 【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】前言一、背景说明二、使用步骤1.引入库2…

某东详情页h5st 算法分析

文章目录 声明目标地址h5st 算法四大入参分析1. z值生成2. v值生成3. b值生成4. r值生成风控浅谈往期逆向文章推荐声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 目标地址 aHR0cHM6Ly…

IO进程线程day7(2023.8.4)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;创建两个线程&#xff1a;其中一个线程拷贝前半部分&#xff0c;另一个线程拷贝后半部分。 只允许开一份资源&#xff0c;且用互斥锁方式实现。 提示&#xff1a;找临界区--->找临界资源。 #includ…

单例模式和工厂模式

目录 今日良言&#xff1a;关关难过关关过&#xff0c;步步难行步步行 一、单例模式 1.饿汉模式 2.懒汉模式 二、工厂模式 今日良言&#xff1a;关关难过关关过&#xff0c;步步难行步步行 一、单例模式 首先来解释一下&#xff0c;什么是单例模式。 单例模式也就是单个…

linux 文件的权限

修改文件的权限 我这里有一个test.txt 文件&#xff0c;我们ll 查看一下该文件相应的属性信息 其中&#xff0c;权限的位置是相对固定的即&#xff1a; 第一个位置是r 权限&#xff0c;代表可读权限。 第二个位置是w权限&#xff0c;代表可修改权限。 第三个位置是x权限&…

一百四十一、Kettle——kettle8.2在Windows本地开启carte服务以及配置子服务器

一、目的 在kettle建好共享资源库后&#xff0c;为了给在服务器上部署kettle的carte服务躺雷&#xff0c;先在Windows本地测试一下怎么玩carte服务 二、Kettle版本以及在Windows本地安装路径 kettle版本是8.2 pdi-ce-8.2.0.0-342 kettle本地安装路径是D:\j…

linuxARM裸机学习笔记(2)----汇编LED灯实验

MX6ULL 的 IO IO的复用功能 这里的只使用了低五位&#xff0c;用来配置io口&#xff0c;其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的&#xff0c;GPIO1_IO00 一共可以复用为 9种功能 IO&#xff0c;分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…

拦截器在SpringBoot中使用,HandlerInterceptor,WebMvcConfigurer

拦截器在Controller之前执行。 用于权限校验&#xff0c;日志记录&#xff0c;性能监控 在SpringBoot中使用 创建拦截器类&#xff1a;首先&#xff0c;创建一个Java类来实现拦截器逻辑。拦截器类应该实现Spring提供的HandlerInterceptor接口。实现拦截器方法&#xff1a;拦…

Unity数字可视化学校_昼夜(二)

1、时间设置&#xff1a; 2、新建夜晚 3、新建侧置球&#xff08;BOX&#xff09;,测试灯光强度 降低亮度 色调&#xff1a;冷色调 4、自发光 新建shader 灯光控制 道路线&#xff1a; 建筑&#xff1a; 夜晚加灯光&#xff1a; 玻璃&#xff1a; 加大灯光数量&#xff1a; 边缘…

uni-ajax网络请求库使用

uni-ajax网络请求库使用 uni-ajax是什么 uni-ajax是基于 Promise 的轻量级 uni-app 网络请求库,具有开箱即用、轻量高效、灵活开发 特点。 下面是安装和使用教程 安装该请求库到项目中 npm install uni-ajax编辑工具类request.js // ajax.js// 引入 uni-ajax 模块 import ajax…

服务端高并发分布式结构演进之路

目录 一、常见概念 1.1基本概念 二、架构演进 2.1单机架构 2.2应用数据分离架构 2.3应用服务集群架构 2.4读写分离 / 主从分离架构 2.5引入缓存 —— 冷热分离架构 2.6垂直分库 2.7业务拆分 —— 微服务 一、常见概念 1.1基本概念 应用&#xff08;Application&am…

Grafana集成prometheus(1.Prometheus安装)

下载docker镜像 docker pull prom/prometheus docker pull prom/node-exporter启动 node-exporter 该程序用以采集机器内存等数据 启动脚本 docker run -d -p 9100:9100 prom/node-exporter ss -anptl | grep 9100启动截图 prometheus 启动脚本 # 3b907f5313b7 为镜像i…

C++数据结构之平衡二叉搜索树(一)——AVL的实现(zig-zag/左右双旋/3+4重构)

目录 00.BBST——平衡二叉搜索树01.AVL树02.AVL的插入2.1单旋——zig 与 zag2.2插入节点后的单旋实例2.3手玩小样例2.4双旋实例2.5小结 03.AVL的删除3.1单旋删除3.2双旋删除3.3小结 04.34重构05.综合评价AVL5.1优点5.2缺点 00.BBST——平衡二叉搜索树 本文是介绍众多平衡二叉搜…
最新文章