java之springboot中的日志

logback配置详解:https://www.jianshu.com/p/1ded57f6c4e3

  •  
  • logback-classic:log4j的一个改良版本,同时实现了slf4j的接口;
  1. <!--这个依赖直接包含了 logback-core 以及 slf4j-api的依赖-->
    <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
      
    </dependency>
    

     

springBoot日志处理:日志框架UCL、JUL、slf4j、logback、log4j;springboot默认支持的有slf4j、logback;

springboot默认帮我们配置好了,直接使用就可以了;

springboot默认的日志级别是info,只打印info级别只之后的信息,也可以在配置文件中配置日志级别logging.level.主配置类多所在的包=日志级别;

吧日志保存在文件中:要配置logging.file=保存日志文件的位置,(相对于文件的根路径),也可以设置绝对路径.文件夹用logging.path=文件夹位置,并且默认的文件名叫spring.log;

修改日志的格式:1.日志显示在控制台,logging.pattern.console=%d{yyyy-MM-dd } [%thread] %-5level  %logger{50} -%msg %n;2.日志显示在文件中,logging.pattern.file=%d{yyyy-MM-dd } [%thread] %-5level  %logger{50} -%msg %n。

如果你即想完全掌控日志配置,但又不想用logback.xml作为Logback配置的名字,application.yml可以通过logging.config属性指定自定义的名字:

logging.config=classpath:logging-config.xml

Spring Boot 的日志支持依赖是 spring-boot-starter-logging,默认使用slf4j+logback的方式来记录日志.

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
 </dependency>

在控制台中可看到 spring boot 默认打印出的启动日志,不过默认的打印级别为 INFO.Logback 支持 TRACE, DEBUG, INFO, WARN, ERROR 日志级别,优先级关系为 TRACE < DEBUG < INFO < WARN < ERROR , 我们可以在 application.properties 配置文件中更改打印日志级别.

***通用修改:
logging.level.root=DEBUG
还可以指定包的日志级别:
logging.level.org.springframework=INFO


***代码中使用:
Logger logger= LoggerFactory.getLogger(DemoApplication.getClass());
logger.debug("debug日志");

		logger.info("info日志");

		logger.warn("warn日志");

		logger.error("error日志");


***使用属性 logging.pattern.console 和 logging.pattern.file 可以分别自定义控制台日志和文件日志的格式

#控制台显示日志的格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{5}- %msg%n

#文件显示日志的格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm} [%thread] %-5level %logger- %msg%n

%d: 日期实践
%thread: 线程名
%-5level:级别从左显示5个字符宽度
%logger{5}:表示logger名字最长5个字符,否则按照句点分割。
%msg:日志消息
%n:换行


***日志保存(优先输出 logging.file)
logging.path 可以指定日志保存目录,但不能指定输出的文件名,且默认名为spring.log
logging.path=/Users/HaokeMaster/Desktop/sts 
 logging.file 指定具体的路径:
logging.file=/Users/HaokeMaster/Desktop/sts/my.log

***
# 当文件超过 10Mb 时,归档压缩
logging.file.max-size=10Mb
# 日志文件最多保存3天
logging.file.max-history=3
# 用于滚动的日志文件名的模式
logging.pattern.rolling-file-name=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz


***

日志服务在ApplicationContext 创建之前就被初始化了,并不是采用Spring的配置文件进行控制。

那我们来如何进行自定义配置日志呢。springboot为我们提供了一个规则,按照规则组织配置文件名,就可以被正确加载:

Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties

 

参考:https://blog.csdn.net/weixin_38361347/article/details/86707149

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- 控制台打印日志的相关配置 --> 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- 日志格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] - %m%n</pattern>
    </encoder>
    <!-- 日志级别过滤器 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!-- 过滤的级别 -->
      <level>WARN</level>
      <!-- 匹配时的操作:接收(记录) -->
      <onMatch>ACCEPT</onMatch>
      <!-- 不匹配时的操作:拒绝(不记录) -->
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>

  <!-- 文件保存日志的相关配置 --> 
  <appender name="ERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <!-- 保存日志文件的路径 -->
    <file>/logs/error.log</file>
    <!-- 日志格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n</pattern>
    </encoder>
    <!-- 日志级别过滤器 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!-- 过滤的级别 -->
      <level>ERROR</level>
      <!-- 匹配时的操作:接收(记录) -->
      <onMatch>ACCEPT</onMatch>
      <!-- 不匹配时的操作:拒绝(不记录) -->
      <onMismatch>DENY</onMismatch>
    </filter>
    <!-- 循环政策:基于时间创建日志文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 日志文件名格式 -->
      <fileNamePattern>error.%d{yyyy-MM-dd}.log</fileNamePattern>
      <!-- 最大保存时间:30天-->
      <maxHistory>30</maxHistory>
    </rollingPolicy>
  </appender>

  <!-- 基于debug处理日志:具体控制台或者文件对日志级别的处理还要看所在appender配置的filter,如果没有配置filter,则使用root配置 -->
  <root level="debug">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="ERROR-OUT" />
  </root>
</configuration>

一:根节点<configuration>包含的属性:

scan:

当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。

scanPeriod:

设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <!-- 其他配置省略-->  
</configuration>  

 

onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL

分别介绍这两个配置项的三个属性值:

onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的
 

 logback配置非常详细的解释:https://blog.csdn.net/qq_36850813/article/details/83092051

<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
<!--两个属性 key:标识此<timestamp> 的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。其他地方可以引用-->
 <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/> 
   <!--  用来定义变量值的标签,后面可以通过${app.name}使用-->-->
    <property name="log.path" value="/Users/HaokeMaster/Desktop/sts"/>
    <!-- 配置日志的格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="%yellow%(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%line)"/>


<!-- 输出到控制台 -->
    <appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
        <!--  这里的变量就是上面定义的格式 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </layout>
    </appender>
    
    <!-- 输出到文件 -->
    <!--获取比info级别高(包括info级别)但除error级别的日志-->
    <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来-->
        <!--这里定义了INFO,也就是控制台不会输出比INFO级别小的日志-->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
<!--定义输出格式-->
        <encoder>
       
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
            <!-- 设置字符集 -->
          <charset>UTF-8</charset>
        </encoder>
 
        <!--按时间滚动日志策略,当达到一定条件后重新生成新的日志文件-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--定义文件滚动时的文件名的格式-->
            <fileNamePattern>${log.path}/info/%d.log</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>30</maxHistory>
           <!--  最大存储 -->
           <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
    </appender>
    
    <appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/error/%d.log</fileNamePattern>
            <maxHistory>30</maxHistory>
             <!--  最大存储 -->
           <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!-- 开发环境的日志配置 -->
    <springProfile name="dev">
   <!--对于类路径以 com.example.logback 开头的Logger,输出级别设置为warn,并且只输出到控制台-->
    <!--这个logger没有指定appender,它会继承root节点中定义的那些appender-->
    <logger name="com.example.logback" level="warn"/>

    <!--通过 LoggerFactory.getLogger("mytest") 可以获取到这个logger-->
    <!--由于这个logger自动继承了root的appender,root中已经有stdout的appender了,自己这边又引入了stdout的appender-->
    <!--如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
    <!--additivity表示要不要使用rootLogger配置的appender进行输出-->
    <logger name="mytest" level="info" additivity="false">
        <appender-ref ref="stdout"/>
    </logger>

    <!--由于设置了 additivity="false" ,所以输出时不会使用rootLogger的appender-->
    <!--但是这个logger本身又没有配置appender,所以使用这个logger输出日志的话就不会输出到任何地方-->
    <logger name="mytest2" level="info" additivity="false"/>

    <!-- 必须有的子节点,root是默认的logger 这里设定输出级别是info,日志会通过往这两个appender里面写>root可以包含多个appender,标识这个appender将会添加到这个loger
    <root level="INFO">
        <appender-ref ref="CONSOLE-LOG" />
        <appender-ref ref="INFO-LOG" />
        <appender-ref ref="ERROR-LOG" />
    </root>
    </springProfile>

    
    <springProfile name="pro">
 <!-- 在com.example.config包下面打印WARN级别的日志 -->
    <logger name="com.example" level="WARN"/>
    <root level="info">
        <appender-ref ref="CONSOLE-LOG" />
        <appender-ref ref="INFO-LOG" />
        <appender-ref ref="ERROR-LOG" />
    </root>
    </springProfile>
</configuration>

 

***依赖重复的报错:https://blog.csdn.net/a704397849/article/details/98487404

排除spring-boot-starter-logging依赖,

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
			
		<!-- 排除包引起的冲突 -->
	<exclusions>
        <exclusion>这一个可以不排除
            <artifactId>logback-core</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
        <exclusion>这个必须排除
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
     </exclusions>
		</dependency>
  <!--全局排除spring-boot-starter-logging内的所有依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>*</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

 

如何快速正确的解决类似重复依赖的问题。

  • 1 pom.xml中选中exclusion,右键 -> Maven -> Show Dependencies
  • 2.crtl + f 打开搜索,然后输入搜索内容 logback-classic或者其他需要搜索的内容.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值