LogBack的简单使用

落日映苍穹つ 2022-05-07 23:38 177阅读 0赞

文章目录

      1. 为什么要使用logback
      1. logback的pom 文件导入
      1. logback的配置
      1. logback文件的解释

0. 为什么要使用logback

官方文档介绍

  • 更快的实施

基于我们之前关于log4j的工作,已经重写了logback内部,以便在某些关键执行路径上执行大约十倍的速度。不仅logback组件更快,而且内存占用更少。

  • 大量的测试

Logback包含了在几年和无数小时工作中开发的大量测试。虽然log4j也经过测试,但logback将测试带到了完全不同的水平。在我们看来,这是优先于log4j进行logback的最重要原因。您希望您的日志框架即使在不利条件下也能够坚如磐石且可靠。

  • logback-classic本身就说SLF4J

由于Loggerlogback-classic中的类本身实现了SLF4J API,因此在调用带有logback-classic作为底层实现的SLF4J记录器时,会产生零开销。此外,由于logback-classic强烈鼓励使用SLF4J作为其客户端API,如果需要切换到log4j或jul,则可以通过将一个jar文件替换为另一个jar文件来实现。您无需通过SLF4J API触摸代码记录。这可以大大减少切换日志框架所涉及的工作。

参考优先于log4j进行logback的原因


1. logback的pom 文件导入

  1. <dependency>
  2. <groupId>org.slf4j</groupId>
  3. <artifactId>slf4j-api</artifactId>
  4. <version>1.7.7</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>ch.qos.logback</groupId>
  8. <artifactId>logback-classic</artifactId>
  9. <version>1.1.3</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.slf4j</groupId>
  13. <artifactId>log4j-over-slf4j</artifactId>
  14. <version>1.7.7</version>
  15. </dependency>

注意你的项目,之前是log4j配置的话,需要将原来log4j引入的pom文件都移除掉,并且需要移除项目中其他第三方框架引入的log4j。

  • 如果使用的IDEA可以使用Maven Project 中提供的查看依赖视图界面
    在这里插入图片描述
    将其中包含的log4j 都排除掉
    在这里插入图片描述
    其中在我的项目排除的有:


    com.alibaba
    dubbo


    log4j
    log4j




    org.apache.zookeeper
    zookeeper


    log4j
    log4j


    slf4j-log4j12
    org.slf4j




    com.github.sgroschupf
    zkclient


    log4j
    log4j



2. logback的配置

在这里插入图片描述
将我们之前的log4j.properties 删除,新建一个logback.xml 文件
项目之前的使用log4j.properties可以用http://logback.qos.ch/translator/转换到等价的logback配置文件。PS:转换后的配置文件,pattern参数需要修改。
如log4j的pattern配置 %-d{yyyy-MM-dd HH:mm:ss,SSS} [%c:%L]-[%p] %m%n 在logback里面不在起效。
我把它调整为 %date [%level] [%thread] %logger{80} [%file : %line] %msg%n
另外按日期产生日志文件策略的pattern也需要修改(具体查看下文的logback.xml配置文件)。
参数 含义
%date 表示日期格式(yyyy-MM-dd HH:mm:ss,SSS)
%level 表示日志的级别
%thread 表示输出产生该日志的线程名
%logger{80} 表示logger名字最长80个字符,否则按照句点(.)分割
%file 表示文件名
%line 表示第几行
%msg 表示输出信息
%n 表示换行
参考log4j迁移到logback
转换界面
在这里插入图片描述
这个是我项目里面配置的

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--根节点-->
  3. <configuration>
  4. <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
  5. <property name="LOG_HOME" value="F:/ELK/newlog/logback" />
  6. <!--滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件-->
  7. <appender name="DC" class="ch.qos.logback.core.rolling.RollingFileAppender">
  8. <File>${LOG_NAME}/logs/devicecontrol.log</File>
  9. <encoder>
  10. <pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
  11. </encoder>
  12. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  13. <fileNamePattern>${LOG_NAME}/logs/devicecontrol.log.%d{yyyy-MM-dd}</fileNamePattern>
  14. </rollingPolicy>
  15. </appender>
  16. <!--写入日志到控制台-->
  17. <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
  18. <!--输出标志-->
  19. <Target>System.out</Target>
  20. <encoder>
  21. <pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
  22. </encoder>
  23. </appender>
  24. <!--写入日志到文件-->
  25. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  26. <File>${LOG_HOME}/logs/vod.log</File>
  27. <encoder>
  28. <pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
  29. </encoder>
  30. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  31. <fileNamePattern>${LOG_HOME}/logs/vod.log.%d{yyyy-MM-dd}</fileNamePattern>
  32. </rollingPolicy>
  33. </appender>
  34. <!--用来设置某一个包或具体的某一个类的日志打印级别、以及指定appender-->
  35. <logger name="org.springframework" level="error"/>
  36. <logger name="com.thunisoft.crs" level="error"/>
  37. <logger name="jdbc.connection" level="OFF"/>
  38. <logger name="com.thunisoft.artery" level="error"/>
  39. <logger name="com.thunisoft.cas.service.devicecontrol" level="debug">
  40. <appender-ref ref="DC"/>
  41. </logger>
  42. <logger name="org.apache" level="error"/>
  43. <logger name="jdbc.resultset" level="OFF"/>
  44. <logger name="com.thunisoft.summer" level="warn"/>
  45. <logger name="org.hibernate" level="error"/>
  46. <logger name="jdbc.audit" level="OFF"/>
  47. <logger name="com.thunisoft.test" level="error"/>
  48. <logger name="jdbc.sqlonly" level="INFO"/>
  49. <logger name="jdbc.sqltiming" level="DEBUG"/>
  50. <logger name="org.quartz.simpl" level="error"/>
  51. <logger name="com.alibaba.dubbo" level="INFO"/>
  52. <root level="info">
  53. <appender-ref ref="Console"/>
  54. <appender-ref ref="FILE"/>
  55. <appender-ref ref="DC"/>
  56. </root>
  57. </configuration>

3. logback文件的解释

  1. 四、logback的默认配置
  2. 如果配置文件 logback-test.xml logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n PatternLayoutEncoder 进行格式化。root logger 默认级别是 DEBUG
  3.  1Logback的配置文件:
  4. Logback 配置文件的语法非常灵活。正因为灵活,所以无法用 DTD XML schema 进行定义。尽管如此,可以这样描述配置文件的基本结构:以<configuration>开头,后面有零个或多个<appender>元素,有零个或多个<logger>元素,有最多一个<root>元素。
  5.  2Logback默认配置的步骤:
  6.   (1). 尝试在 classpath下查找文件logback-test.xml
  7.   (2). 如果文件不存在,则查找文件logback.xml
  8.   (3). 如果两个文件都不存在,logbackBasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。
  9. 五、logback.xml常用配置详解
  10. 1.根节点<configuration>包含三个属性:
  11. scan:默认为true。作用:当设置为true时,如果配置文件发生改变,将会被重新加载。
  12. scanPeriod:默认时间间隔为1分钟,默认单位是毫秒,当scantrue时,此属性生效。作用:检测配置文件是否有修改时间间隔。
  13. debug:默认为false。作用:当此属性为true时,将打印出logback内部日志信息,实时查看logback运行状态。
  14.    例如:
  15. <configuration scan="true" scanPeriod="60 seconds" debug="false">
  16. <!--其他配置省略-->
  17. </configuration>
  18. 2.子节点<contextName>:用来设置上下文名称。
  19. 每个logger都关联到logger上下文,默认上下文名称为default
  20. 可以使用<contextName>设置成其他名字,用于区分不同的应用程序的记录。一旦设置,不能修改。
  21. 例如:
  22. <configuration scan="true" scanPeriod="60 seconds" debug="false">
  23. <contextName>myAppName</contextName>
  24. <!--其他配置省略-->
  25.   </configuration>
  26. 3.子节点<property>:用来定义变量值,有两个属性namevalue
  27. 通过<property>定义的值被插入到logger上下文中,可以使"${}"来使用变量。
  28. name:变量的名字
  29. value:变量名字对应的数值
  30. 例如:
  31. <configuration scan="true" scanPeriod="60 seconds" debug="false">
  32. <property name="APP_Name" value="myAppName"></property>
  33. <contextName>${APP_Name}</contextName>
  34. <!--其他配置省略-->
  35. </configuration>
  36. 4.子节点<timestamp>:获取时间戳字符串,有两个属性keydatePattern
  37. key:标识此<timestamp>的名字
  38. datePattern:设置将当前时间(即解析配置文件的时间)转换为字符串,遵循java.txt.SimpleDateFormat的格式。
  39. 例如:
  40. <configuration scan="true" scanPeriod="60 seconds" debug="false">
  41. <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"></timestamp>
  42. <contextName>${bySecond}</contextName>
  43. </configuration>
  44. 5.子节点<appender>:负责写日志的组件,有两个必要属性nameclass
  45. name:指定appender名称
  46. class:指定appender的全限定名
  47. 5.1 class="ch.qos.logback.core.ConsoleAppender":把日志输出到控制台,有以下子节点。
  48. <encoder>:对日志进行格式化。(具体参数稍后讲~~~~~~~~~~~~~)
  49. <target>:字符串System.out(默认)或者System.err
  50. 例如:
  51. <configuration scan="true" scanPeriod="60 seconds" debug="false">
  52. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  53. <encoder>
  54. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
  55. </encoder>
  56. </appender>
  57. <root level="DEBUG">
  58. <appender-ref ref="STDOUT"></appender-ref>
  59. </root>
  60. </configuration>
  61. 上述配置表示把>=DEBUG级别的日志都输出到控制台
  62. 5.2 class="ch.qos.logback.core.FileAppender":把日志添加到文件,有以下子节点:
  63. <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  64. <append>:默认为true。如果是true,日志被追加到文件结尾,如果是false,清空现存文件。
  65. <encoder>:对记录事件进行格式化。(具体参数稍后讲~~~~~~~~~~~)
  66. <prudent>:默认为false。如果是true,日志会被安全的写入文件,即其他的FileAppender也在向此文件做写入操作,效率低。
  67. 例如:
  68. <configuration scan="true" scanPeriod="60 seconds" debug="false">
  69. <appender name="FILE" class="ch.qos.logback.core.FileAppender">
  70. <file>testFile.log</file>
  71. <append>true</append>
  72. <encoder>
  73. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
  74. </encoder>
  75. </appender>
  76. <root level="DEBUG">
  77. <appender-ref ref="FILE"/>
  78. </root>
  79. </configuration>
  80. 上述配置表示把>=DEBUG级别的日志都输出到testFile.log
  81. 5.3 class="ch.qos.logback.core.rolling.RollingFileAppender":滚动记录文件,先将日志文件指定到文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:
  82.   <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  83.   <append>:默认为true。如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件。
  84.   <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类。  
  85.   <triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。
  86.   <encoder>:对记录事件进行格式化。负责两件事:1)是把日志信息转换成字节数组,2)是把字节数组写入到输出流。
  87.   PatternLayoutEncoder 是唯一有用的且默认的encoder。有一个节点:
  88.   <pattern>节点,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“\%”进行转义。
  89. class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy" 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
  90. <fileNamePattern>:必要节点,包含文件名及"%d"转换符,"%d"可以包含一个java.text.SimpleDateFormat指定的时间格式,默认格式是 yyyy-MM-dd。也可以设置其他格 式,如:%d{yyyy-MM}。
  91. <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。
  92. 注:删除旧文件时,那些为了归档而创建的目录也会被删除。
  93. 注:(RollingFileAppender的<file>子节点可有可无,通过设置<file>,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变; 如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。)
  94.    class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
  95.     <maxFileSize>:活动文件的大小,默认值是10MB
  96.     <prudent>:当为true时,不支持FixedWindowRollingPolicy,支持TimeBasedRollingPolicy。但是有两个限制:1)不支持也不允许文件压缩,2)不能设置file属性,必须留空。
  97.    
  98.   class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" :根据固定窗口算法重命名文件的滚动策略。有以下子节点:
  99.    <minIndex>:窗口索引最小值
  100.    <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12
  101.    <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为12,命名模式为 mylog%i.log,会产生归档文件mylog1.logmylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
  102.   例如:
  103.   <configuration scan="true" scanPeriod="60 seconds" debug="false">
  104.     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  105.       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  106.         <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
  107.         <maxHistory>30</maxHistory>
  108.       </rollingPolicy>
  109.       <encoder>
  110.         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
  111.       </encoder>
  112.     </appender>
  113.     <root level="DEBUG">
  114.       <appender-ref ref="FILE"/>
  115.     </root>
  116.   </configuration>
  117. 上述配置表示每天生成一个日志文件,保存30天的日志文件。
  118.   <configuration scan="true" scanPeriod="60 seconds" debug="false">
  119.     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  120.       <file>test.log</file>
  121.       <roollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
  122.         <fileNamePattern>tests.%i.log.zip</fileNamePattern>
  123.         <minIndex>1</minIndex>
  124.         <maxIndex>3</maxIndex>
  125.       </roollingPolicy>
  126.       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  127.         <maxFileSize>5MB</maxFileSize>
  128.       </triggeringPolicy>
  129.       <encoder>
  130.         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
  131.       </encoder>
  132.     </appender>
  133.     <root level="DEBUG">
  134.      <appender-ref ref="FILE" />
  135.     </root>
  136.   </configuration>
  137. 上述配置表示按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大小是13,当保存了3个归档文件后,将覆盖最早的日志。
  138. 5.4 还有SocketAppenderSMTPAppenderDBAppenderSyslogAppenderSiftingAppender,并不常用,这里就不详解了。
  139. 大家可以参考官方文档(http://logback.qos.ch/documentation.html),还可以编写自己的Appender。
  140. 6. 子节点<logger>:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。
  141. <logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger
  142.    name: 用来指定受此logger约束的某一个包或者具体的某一个类。
  143.    level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALLOFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。
  144.    addtivity: 是否向上级logger传递打印信息。默认是true。同<logger>一样,可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger
  145. 7. 子节点<root>:它也是<logger>元素,但是它是根logger,是所有<logger>的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。有一个属性:
  146.    level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALLOFF,不能设置为INHERITED或者同义词NULL 默认是DEBUG
  147. 六、常用logger配置
  148. <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
  149. <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
  150. <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
  151. <logger name="org.hibernate.SQL" level="DEBUG" />
  152. <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
  153. <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
  154. <!--myibatis log configure-->
  155. <logger name="com.apache.ibatis" level="TRACE"/>
  156. <logger name="java.sql.Connection" level="DEBUG"/>
  157. <logger name="java.sql.Statement" level="DEBUG"/>
  158. <logger name="java.sql.PreparedStatement" level="DEBUG"/>
  159. 七、使用例子
  160. logback.xml配置文件
  161. 复制代码
  162. <?xml version="1.0" encoding="UTF-8"?>
  163. <configuration debug="false">
  164. <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
  165. <property name="LOG_HOME" value="/home" />
  166. <!-- 控制台输出 -->
  167. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  168. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  169. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
  170. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  171. </encoder>
  172. </appender>
  173. <!-- 按照每天生成日志文件 -->
  174. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  175. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  176. <!--日志文件输出的文件名-->
  177. <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
  178. <!--日志文件保留天数-->
  179. <MaxHistory>30</MaxHistory>
  180. </rollingPolicy>
  181. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  182. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
  183. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  184. </encoder>
  185. <!--日志文件最大的大小-->
  186. <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  187. <MaxFileSize>10MB</MaxFileSize>
  188. </triggeringPolicy>
  189. </appender>
  190. <!-- 日志输出级别 -->
  191. <root level="INFO">
  192. <appender-ref ref="STDOUT" />
  193. </root>
  194. </configuration>
  195. 复制代码
  196. 测试类,日志在控制台输出:
  197. 复制代码
  198. private final static Logger logger = LoggerFactory.getLogger(SpringbootStudyLoggerApplicationTests.class);
  199. @Test
  200. public void log() {
  201. logger.info("==============================================");
  202. logger.error("==============================================");
  203. logger.debug("==============================================");
  204. }
  205. 复制代码
  206. 八、总结
  207. logback的配置,需要配置输出源appender,打日志的loger(子节点)和root(根节点),实际上,它输出日志是从子节点开始,子节点如果有输出源直接输入,如果无,判断配置的addtivity,是否像上级传递,即是否向root传递,传递则采用root的输出源,否则不输出日

参考logback配置详解和使用


参考log4j迁移到logback
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,177人围观)

还没有评论,来说两句吧...

相关阅读