logback(日志框架)私人学习笔记

俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步!

此笔记主要是logback-1.2.3版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的地方欢迎大家指正。






1、logback是由log4j创始人Ceki Gülcü设计的又一个开源日志组件,比log4j功能更强大,效率更高。将逐步取代log4j框架。
  logback-1.2.3是目前最新的版本,本笔记都基于此版本。
  官方网址:https://logback.qos.ch/
  使用手册:https://logback.qos.ch/manual/index.html


2、logback当前分成三个模块:
logback-core:是其他两个模块的基础模块,提供基础支持。
logback-classic:是log4j的改良版本,并且实现了sl4j的api,可以更方便的更换成其他日志框架。
logback-access:与servlet容器集成可通过http协议来访问日志的功能。


3、Logback的核心对象:Logger、Appender、Layout。
Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
Logger对象一般多定义为静态常量。
 
Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、 PostreSQL、Oracle
和其他数据库、 JMS和远程UNIX Syslog守护进程等。
 
Layout:负责把事件转换成字符串,格式化的日志信息的输出。具体的Layout通配符,可以直接查看帮助文档。




4、默认情况下,logback框架默认会寻找logback.xml配置文件,如果不存在,则使用默认的配置,将日志打印到console控制台中。



5、logback依赖与slf4j框架,需要引入slf4j.jar包,如果项目或其他框架有使用log4j框架,则可以引入log4j-over-slf4j.jar
  来代替log4j.jar,从而最终统一由logback框架来管理日志。
  
  
  
6、logback日志输出的布局形式是可以定制的,可以自己继承ch.qos.logback.core.LayoutBase类来定制自己的日志输出格式,
  也可以直接使用框架现有的布局实现类,例如XMLLayout、HTMLLayout和PatternLayout等,通常使用PatternLayout就可以满足
  大部分的输出要求。布局的使用可以参考文档地址:https://logback.qos.ch/manual/layouts.html#PatternLayout 
  
  
7、详细的logback.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。 
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration debug="true" scan="true" scanperiod="1800 seconds">
<!-- 定义属性,类似于maven,可以当做变量被引用 -->
<property name="LOG_HOME" value="F:/log" />
<property name="APP_NAME" value="backlog-demo" />


<!-- 这里关闭谨慎模式,如果开启谨慎模式,借助排它文件锁,可以使多个JVM中运行的 多个FileAppender实例,
          安全的写入到同一个日志文件,但日志吞吐率非常低,大概是正常日志输出的1/3左右。 -->
<prudent>false</prudent>


<!-- 定制自己的转换器。默认PatternLayout布局中支持使用。 -->
<conversionRule conversionWord="myCon"
converterClass="cn.cat.converter.MyConverter" />


<!-- 输出到控制台 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<Encoding>UTF-8</Encoding>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<!-- 使用自定义的布局。可以不用encoder标签来包含,直接写layout标签。 -->
<layout class="cn.cat.layout.MyLayout">
<!-- 配置remark属性值的内容,通过set方法自动注入到MyLayout中 -->
<remark>备注内容</remark>
</layout>
</encoder>
</appender>


<!-- 输出到文件,并按日切分文件 -->
<appender name="dayFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<Encoding>UTF-8</Encoding>
<!-- 当前输出的文件路径和名称。路径不存在会自动创建。 -->
<file>${LOG_HOME}/${APP_NAME}.log</file>
<!-- 设置是否马上将日志输出到文件,建议设置为false,等缓存到一定数据量后才写入文件,这样效率更高。 -->
<immediateFlush>true</immediateFlush>
<!-- 是否对日志文件进行追加。默认为true。 -->
<append>true</append>
<!-- 基于时间的滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 保存历史文件路径和名称。路径不存在会自动创建。此文件名的命名方式很重要, 
    TimeBasedRollingPolicy就是根据定义的文件名规则,来推断出文件滚动的策略, 
 例如下面包含%d{yyyy-MM-dd}.log 则表示使用按日滚动文件,
%d{yyyy-ww}.log 则表示每周的第一天滚动。
%d{yyyy-MM-dd_HH}.log 则表示每小时滚动。
%d{yyyy-MM-dd_mm}.log 则表示每分钟滚动。
%d{yyyy/MM}/${APP_NAME}.log 则表示按月滚动。
特殊的,如果想每个月保留最后5个文件,可以使用此文件名规则:
${LOG_HOME}/%d{yyyy/MM, aux}/${APP_NAME}-%d{yyyy-MM-dd}.log
-->
<fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.log
</fileNamePattern>
<!-- 保留文件的数量。当超过保留文件后,会删除之前的旧文件。 -->
<MaxHistory>10</MaxHistory>
<!-- 总文件的大小,如果总文件大小超过3GB,即使文件没有达到10个,也会执行清除。 -->
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>

<!-- 设置过滤器。过滤日志的最低输出级别,必须INFO以上的级别才输出到此输出器中。 -->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
            <level>INFO</level>  
        </filter>
        
<!-- 当layout使用PatternLayout布局时,可以使用<encoder><pattern></pattern></encoder>来简写代替 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!-- %-5 表示最小为5个字符,不足则在右边用空格填充。%logger{50}表示日志输出记录的名称类最长为50个字符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%myCon- %msg%n</pattern>
</layout>
</appender>
    
    <!-- 输出到文件,根据大小和时间来切分,适合每日输出日志非常大的场景 -->
    <appender name="daySizeFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <file>${LOG_HOME}/${APP_NAME}-info.log</file>
   <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
     <!-- 按日滚动,注意%i是必须的,表示文件的索引号,从0开始累加 -->
     <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i-info.log</fileNamePattern>
      <!-- 每个文件最大为100MB,最多保存60个文件数量,并且所有文件总和不能大于20GB。 -->
      <maxFileSize>100MB</maxFileSize>    
      <maxHistory>60</maxHistory>
      <totalSizeCap>20GB</totalSizeCap>
   </rollingPolicy>
        
        <!-- 设置过滤器。仅仅输出INFO级别的日志,其余级别的一律不输出。 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">  
   <level>INFO</level>
   <!-- 如果匹配,则ACCEPT,即接收 -->
   <onMatch>ACCEPT</onMatch> 
   <!-- 如果不匹配,则DENY,即拒绝 --> 
   <onMismatch>DENY</onMismatch>  
</filter>  

   <encoder>
    <!-- 配置日志输出模板  -->
     <pattern>%msg%n</pattern>
   </encoder>
    </appender>
    
    <!-- 输出到邮箱。将日志内容直接通过邮件发送。默认日志级别为ERROR,一个ERROR输出为一封邮件。注意需要引入mail.jar包 -->
    <appender name="email" class="ch.qos.logback.classic.net.SMTPAppender">
        <!-- 设置邮件发送者的邮箱信息 -->
   <smtpHost>smtp.126.com</smtpHost>
   <smtpPort>25</smtpPort>
   <username>
xxx@126.com</username>
        <password>xxxxx</password>
        <!-- 邮件发送者 -->        
   <from>
xxx@126.com</from>
   <!-- 邮件接收者 -->
   <to>
xxx@qq.com</to>
   <!-- 邮件主题 -->
   <subject>%logger{20} - %m</subject>
   <!-- 是否异步发送。默认为true。如果为true,则使用线程池的线程来异步发送邮件。 -->
   <asynchronousSending>false</asynchronousSending>
   <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
</appender>
 
 
<!-- 指定某个包下的日志输出配置。
  additivity=true表示继续可以使用root标签指定的日志级别和输出器。
      日志输出级别为debug,会覆盖root标签设置的级别,以此级别为标准。 -->
<logger name="cn.cat" additivity="true" level="debug">
  <!-- 额外增加指定输出。如果此处指定dayFile输出器,并且additivity="true", 
             同时root标签下又指定dayFile输出器,则会导致日志重复输出的情况 -->
  <appender-ref ref="dayFile" />
</logger>  
 
    


<!-- 配置根节点。指定日志的默认基本和输出方向。 -->
<root level="info">
<appender-ref ref="stdout" />
<appender-ref ref="dayFile" />
<appender-ref ref="daySizeFile" />
<!-- <appender-ref ref="email" /> -->
</root>
</configuration>


   

原文地址:https://www.cnblogs.com/catgwj/p/7604868.html