- 为什么不用logback.xml 名字
加载顺序:logback.xml>application.yml>logback-spring.xml
使用xml中使用到配置文件属性时,就会报错
- 为什么logback中记录不到运行时报错
logback获取不到堆栈错误
解决办法:在全局错误出使用log.error()指定输出
- 为什么打印不出来mybatis-plus的sql日志
配置mq,使用 org.apache.ibatis.logging.stdout.StdOutImpl 使用的是System.out.println(s);
所以打印不出来
控制台打印
正确使用:
配置mq,使用 org.apache.ibatis.logging.slf4j.Slf4jImpl,并且配置项目mapper目录为DEBUG
控制台打印,看前面带有DEBUG
参考文章(博主有源码详细解释):springboot 下mybatis-plus 如何打印sql日志和参数到日志文件_jsqlparsercountoptimize sql=-CSDN博客
当然可以自己定义打印sql,与 StdOutImpl 一样实现org.apache.ibatis.logging.Log,进行编辑
附带logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 生成文件名前缀 -->
<springProperty name="FILE_PREFIX" source="logging.file.name" />
<!-- 输出文件路径 -->
<springProperty name="OPEN_FILE_PATH" source="logging.file.path"/>
<!-- 文件保存时间 这里是7天 -->
<property name="EXIST_TIME" value="7"/>
<!-- 文件输出格式 -->
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<!-- 日志文件最大的大小 -->
<property name="MAX_FILE_SIZE" value="10MB"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到all文件 这里是全部的日志内容 -->
<appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${OPEN_FILE_PATH}/${FILE_PREFIX}_ALL_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>${EXIST_TIME}</MaxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--日志文件最大的大小-->
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!--输出到error文件-->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${OPEN_FILE_PATH}/${FILE_PREFIX}_ERROR_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${MAX_FILE_SIZE}</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>
<!-- 只打印ERROR日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 异步写日志 -->
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<appender-ref ref="ALL"/>
</appender>
<appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<appender-ref ref="error"/>
</appender>
<!-- 默认输出info等级,然后再根据各自的拦截过滤规则去处理 -->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC_FILE"/>
<appender-ref ref="ASYNC_ERROR_FILE" />
</root>
</configuration>