logback使用学习

引用: https://www.cnblogs.com/warking/p/5710303.html
参考官方使用文档:https://logback.qos.ch/manual/index.html

Logback官方网站: http://logback.qos.ch。它当前分为下面下个模块

  • logback-core:其它两个模块的基础模块
  • logback-classic:logback-classic 包含了logback-core和slf4j的依赖,可以通过它来轻松的实现与 log4j或者 java.util.logging (JUL)的切换.
  • logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

使用

maven依赖

<logback.version>1.2.3</logback.version>

<dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
     <version>${logback.version}</version>
 </dependency>

测试用例

public class AppTest {
	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@Test
	public void testEmptyConfig() {
		logger.debug("==DEBUG==");
		logger.info("==INFO==");
		logger.warn("==WARN==");
		logger.error("==ERROR==");
	}
}

打印结果:
在这里插入图片描述

默认加载步骤

logback使用如下步骤进行初始化:

  1. 尝试从classpath中寻找logback-test.xml
  2. 如果没有找到文件,则尝试从classpath中寻找logback.groovy
  3. 如果没有找到文件,则尝试从classpath中寻找logback.xml
  4. 如果仍然没有找到,则通过SPIMETA-INF\services\ch.qos.logback.classic.spi.Configurator中找到Configurator的具体实现类
  5. 如果上述都没有找到,则使用BasicConfigurator生成一个简单的ConsoleAppender

BasicConfigurator

//ch.qos.logback.classic.BasicConfigurator 
public class BasicConfigurator extends ContextAwareBase implements Configurator {

   public void configure(LoggerContext lc) {       
       ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
       ca.setContext(lc);
       ca.setName("console");
       LayoutWrappingEncoder<ILoggingEvent> encoder = new LayoutWrappingEncoder<ILoggingEvent>();
       encoder.setContext(lc);
       

       // same as 
       // PatternLayout layout = new PatternLayout();
       // layout.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
       TTLLLayout layout = new TTLLLayout();

       layout.setContext(lc);
       layout.start();
       encoder.setLayout(layout);
       
       ca.setEncoder(encoder);
       ca.start();
       
       Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
       rootLogger.addAppender(ca);
   }
}

等同于:

<configuration>

 <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
   <!-- encoders are assigned the type
        ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
   <encoder>
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
   </encoder>
 </appender>

 <root level="debug">
   <appender-ref ref="console" />
 </root>
</configuration>

logback常用配置

结构

结构图
在这里插入图片描述
demo

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property name="app_name" value="study_logback"/>
    <contextName>${app_name}</contextName>

    <include resource="logback-01.xml"/>

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

    <logger name="cn.jhs" level="INFO"/>
    
    <root level="info">
        <appender-ref ref="console_01"/>
        <appender-ref ref="sdout"/>
    </root>

</configuration>

解释

  • <configuration>: 根节点
  • <property>: 设置全局属性,可以通过${XXX}获取属性值
  • <contextName>: 用来设置上下文名称,默认上下文名称为default。上图中的%contextName就使用上下文。
  • <appender>:负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名.
  • <loger>: 用来设置某一个包具体的某一个类的日志打印级别、以及指定<appender>
  • <root>: 它也是一个<logger>元素,但是它是根loger,是所有<loger>的上级。只有一个level属性,
  • <include>: 引用其它的配置文件。被引用的配置如下,

logback-01.xml,使用<included>包裹。

<?xml version="1.0" encoding="UTF-8"?>
<included>
   <!--输出到控制台-->
   <appender name="console_01" class="ch.qos.logback.core.ConsoleAppender">
       <encoder>
           <pattern>【%contextName-01】 %d{yyyy-MM-dd HH:mm:ss.SSS}  [%thread] %-5level %logger{36} - %msg%n</pattern>
       </encoder>
   </appender>
</included>

<configuration>

<configuration scan="true" scanPeriod="60 seconds" debug="false">
</configuration >
  • scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
  • scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
  • debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

<appender>

ConsoleAppender

负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。

**ConsoleAppender **
ConsoleAppender 把日志输出到控制台,有以下子节点

  • <encoder>:对日志进行格式化。
  • <target>:字符串System.out(默认)
 <property name="default_pattern"
              value="【%contextName】 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
              
 <appender name="sdout" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
          <pattern>${default_pattern}</pattern>
      </encoder>
  </appender>

FileAppender

把日志添加到文件,有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true
  • <encoder>:对记录事件进行格式化。
  • <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>testFile.log</file>
   <append>true</append>
    <encoder>
      <pattern>${default_pattern}</pattern>
    </encoder>
  </appender>

RollingFileAppender

滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:
<file>
略。

<append>
略。

<rollingPolicy>
当发生滚动时,决定RollingFileAppender的行为,涉及文件移动重命名。

  • TimeBasedRollingPolicy:最常用的滚动策略,它根据时间来制定滚动策略。它有如下属性:
    • <fileNamePattern>: 必要节点,包含文件名及“%d”转换符. “%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是yyyy-MM-dd
    • <maxHistory>: 可选节点。控制保留的归档文件的最大数量,超出数量就删除旧文件。单位是,即保留<maxHistory>月以内的文件。
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>

  • FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点
    • <minIndex>:窗口索引最小值
    • <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
    • <fileNamePattern>:必须包含“%i”.
 <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
          <fileNamePattern>tests.%i.log.zip</fileNamePattern> 
          <minIndex>1</minIndex> 
          <maxIndex>3</maxIndex> 
      </rollingPolicy> 

在这里插入图片描述

SizeBasedTriggeringPolicy
查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:<maxFileSize>:这是活动文件的大小,默认值是10MB。

<!--日志文件最大的大小-->
   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
       <MaxFileSize>100MB</MaxFileSize>
   </triggeringPolicy>

<logger>

<logger>

<loger>:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>

  • 一个必写的name属性:用来指定受此loger约束的某一个包或者具体的某一个类。
  • 一个可选的leve:用来设置打印级别,大小写无关
  • 一个可选的addtivity属性:是否向上级loger传递打印信息。如果当前<logger>不打印日志,但是设置了addtivity=true,则向<root>传递,最终由<root>的日志级别来判断是否打印。
  • 零个或多个<appender-ref>:标识这个appender将会添加到这个logger

<root>

<root>:它也是<logger>元素,但是它是根loger,是所有<loger>上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。


其他

常用logger配置

mybatis打印sql

<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>

<!-- springboot 打印sql,必须指定到每一个Mapper-->
 <logger name="cn.jhs.xxx.dao.XXXMapper" level="DEBUG" />

springboot-mybatis 可以使用配置:
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl 配置,全局的打印sql

也可以用:配置文件中使用配置:logging.level. cn.jhs.xxx.dao.XXXMapper: DEBUG //包路径为mapper文件包路径


logback.xml样例

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/home" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>

<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>

pattern

%contextName 上下文名称
%d 表示日期,可用 %d{yyyy-MM-dd HH:mm:ss.SSS}
%thread 表示线程名,
%-5level:从左显示5个字符宽度,显示日志级别
%msg:日志消息,
%n 是换行符

spring扩展profile支持

 <!-- 测试环境+开发环境. 多个使用逗号隔开.
     想要spring扩展profile支持,必须要以logback-spring.xml命名
     -->
    <springProfile name="test,dev">
    
        <logger name="com.apache.ibatis" level="TRACE"/>
      <logger name="java.sql.Connection" level="DEBUG"/>
      <logger name="java.sql.Statement" level="DEBUG"/>
      <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    </springProfile>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值