2019独角兽企业重金招聘Python工程师标准>>>

#1 系列目录#

  • 2种日志接口框架,4种日志实现框架
  • jdk-logging、log4j、logback日志介绍及原理
  • jcl与jul、log4j1、log4j2、logback的集成原理
  • slf4j与jul、log4j1、log4j2、logback的集成原理
  • slf4j、jcl、jul、log4j1、log4j2、logback大总结
  • slf4j + log4j原理实现及源码分析
  • Apache Log4j
  • Log4j架构分析与实战
  • Log4J配置文件详解
  • Apache Commons Logging
  • Commons Logging 架构分析
  • JDK Logging
  • JDK Logging 深入分析
  • Logback
  • 从Log4j迁移到LogBack的理由
  • Logback 深入分析
  • Apache Log4j2
  • Log4j2架构分析与实战
  • Log4j2配置文件详解

#2 Logback介绍# Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback-classic和logback-access。logback-core是其它两个模块的基础模块logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能

本文章用到的组件如下:请自行到Maven仓库下载!

logback-access-1.0.0.jar
logback-classic-1.0.0.jar
logback-core-1.0.0.jar
slf4j-api-1.6.0.jar

maven配置: 这样依赖包全部自动下载了!

    <dependency>  <groupId>ch.qos.logback</groupId>  <artifactId>logback-classic</artifactId>  <version>1.0.11</version>  </dependency>

#3 Logback取代Log4j理由# 具体详情,请参见从Log4j迁移到LogBack的理由。

#4 Logback配置# ##4.1 Logger、Appender及Layout## Logback建立于三个主要类之上:Logger、Appender 和 LayoutLogger类是logback-classic模块的一部分而Appender和Layout接口来自logback-core。作为一个多用途模块,logback-core不包含任何logger。

Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。

Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、 PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。

Layout负责把事件转换成字符串,格式化的日志信息的输出

##4.2 LoggerContext## 各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各 logger。如果 logger的名称带上一个点号后是另外一个 logger的名称的前缀,那么,前者就被称为后者的祖先。如果logger与其后代 logger之间没有其他祖先,那么,前者就被称为子logger 之父。比如,名为"com.foo""的 logger 是名为"com.foo.Bar"之父。root logger 位于 logger 等级的最顶端,root logger 可以通过其名称取得,如下所示:

Logger rootLogger =LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);

其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以 logger 名称为参数。用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用

##4.3 有效级别及级别的继承## Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于 ch.qos.logback.classic.Level类。如果 logger没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别root logger 默认级别是 DEBUG

##4.4 打印方法与基本的选择规则## 打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句 L.info("..")是一条级别为 INFO 的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。

该规则是 logback 的核心。级别排序为: TRACE < DEBUG < INFO < WARN < ERROR

##4.5 Logback默认配置## 如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger 的ConsoleAppender 组成输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 进行格式化root logger 默认级别是 DEBUG

  1. Logback的配置文件

Logback 配置文件的语法非常灵活。正因为灵活,所以无法用 DTD 或 XML schema 进行定义。尽管如此,可以这样描述配置文件的基本结构:以<configuration>开头,后面有零个或多个<appender>元素,有零个或多个<logger>元素,有最多一个<root>元素。

  1. Logback默认配置的步骤

(1). 尝试在 classpath 下查找文件 logback-test.xml

(2). 如果文件不存在,则查找文件 logback.xml

(3). 如果两个文件都不存在,logback 用 BasicConfigurator 自动对自己进行配置,这会导致记录输出到控制台。

  1. Logback.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!--Copyright 2010-2011 The myBatis TeamLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
-->
<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> <!-- 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"/><!-- 日志输出级别 --><root level="INFO"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /></root> <!--日志异步到数据库 -->  <appender name="DB" class="ch.qos.logback.classic.db.DBAppender"><!--日志异步到数据库 --> <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"><!--连接池 --> <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"><driverClass>com.mysql.jdbc.Driver</driverClass><url>jdbc:mysql://127.0.0.1:3306/databaseName</url><user>root</user><password>root</password></dataSource></connectionSource></appender>
</configuration>
<?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"><property name="APP_NAME" value="base-mvc-web" /><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--><property name="LOG_HOME" value="/home/taomk" /><!--每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。--><contextName>${APP_Name}</contextName><!--key:标识此<timestamp> 的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。--><timestamp key="BOOT_SECOND" datePattern="yyyyMMdd'T'HHmmss"/><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!--encoder:对日志进行格式化,未配置class属性时,默认配置为PatternLayoutEncoder--><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><!-- 只输出level级别的日志 --><filter class = "ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><!--<onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch>--></filter></appender><!-- 按照每天生成日志文件 --><appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory></rollingPolicy><!--encoder:对日志进行格式化,未配置class属性时,默认配置为PatternLayoutEncoder--><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><!-- 只输出level级别以上的日志 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter></appender><!-- 日志异步到数据库<appender name="DB" class="ch.qos.logback.classic.db.DBAppender"><connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"><dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"><driverClass>com.mysql.jdbc.Driver</driverClass><url>jdbc:mysql://127.0.0.1:3306/databaseName</url><user>root</user><password>root</password></dataSource></connectionSource></appender>--><!--name:用来指定受此logger约束的某一个包或者具体的某一个类。level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。additivity:是否向上级logger传递打印信息。默认是true。<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。--><logger name="net.paoding" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose.RoseFilter" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose.web.controllers.roseInfo" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose.web.controllers.roseInfo.AccessControlInterceptor" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose.web.controllers.roseInfo.TreeController" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose.web.impl.thread.Rose" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose.web.impl.mapping.MappingNode" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose.controllers.ToolsController" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="net.paoding.rose.jade" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="org.springframework" level="DEBUG"><appender-ref ref="STDOUT" /></logger><logger name="org.apache" level="DEBUG"><appender-ref ref="STDOUT" /></logger><!--<root>:也是<logger>元素,但是它是根logger。只有一个level属性,应为已经被命名为"root".--><root level="DEBUG"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /></root>
</configuration>
  1. LogbackDemo.java
    package logback;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class LogbackDemo {private static Logger log = LoggerFactory.getLogger(LogbackDemo.class);public static void main(String[] args) {log.trace("======trace");log.debug("======debug");log.info("======info");log.warn("======warn");log.error("======error");    String name = "Aub";String message = "3Q";String[] fruits = { "apple", "banana" };  // logback提供的可以使用变量的打印方式,结果为"Hello,Aub!"log.info("Hello,{}!", name); // 可以有多个参数,结果为“Hello,Aub! 3Q!”log.info("Hello,{}!   {}!", name, message);         // 可以传入一个数组,结果为"Fruit:  apple,banana"log.info("Fruit:  {},{}", fruits); }}

#5 Spring中LogbackConfigListener使用# 在Web.xml中,添加如下配置:

    <!-- logback 日志配置 start --><context-param><param-name>logbackConfigLocation</param-name><param-value>classpath:logback.xml</param-value></context-param><listener><listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class></listener><!-- logback 日志配置 end -->

转载于:https://my.oschina.net/xianggao/blog/522590

Logback 深入分析相关推荐

  1. slf4j、jcl、jul、log4j1、log4j2、logback大总结

    2019独角兽企业重金招聘Python工程师标准>>> #1 系列目录# 2种日志接口框架,4种日志实现框架 jdk-logging.log4j.logback日志介绍及原理 jcl ...

  2. Log4j2架构分析与实战

    为什么80%的码农都做不了架构师?>>>    1 系列目录 2种日志接口框架,4种日志实现框架 jdk-logging.log4j.logback日志介绍及原理 jcl与jul.l ...

  3. slf4j + log4j原理实现及源码分析

    2019独角兽企业重金招聘Python工程师标准>>> #0 系列目录# 2种日志接口框架,4种日志实现框架 jdk-logging.log4j.logback日志介绍及原理 jcl ...

  4. 看源码,搞明白Logback是如何自动生效的?

    导语: private static final Logger logger = LoggerFactory.getLogger(ClassName.class); 对于使用Springboot的Ja ...

  5. springboot日志logback配置

    1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 3 scan:当此属性设置为true时,配置文 ...

  6. qt能使用logback_Spring boot使用logback实现日志配置

    欢迎关注头条号:老顾聊技术 精品原创技术分享,知识的组装工 目录 前言 常用日志组件 什么是日志门面和日志实现 常见的日志框架 日志使用 @slf4j注解 日志的配置 logback-spring配置 ...

  7. android AIDL IPC深入分析

    深入分析AIDL原理 博客分类: Android 在上一篇文章(Service使用方式)中,介绍了Android进程间通信(IPC)的使用,并给出了一个示例.但并没有深入分析aidl是怎样可以做到进程 ...

  8. springboot集成logback日志 通用logback.xml模板详解

    先看Spring Boot中依赖的logback,log4j,slf4j相关Jar包 1.最简单的默认打印控制台日志  import org.slf4j.Logger; import org.slf4 ...

  9. error 系统错误 错误码10007_为什么阿里巴巴禁止工程师直接使用日志系统( Log4j 、Logback )中的 API...

    (给ImportNew加星标,提高Java技能) 转自:Hollis 作为Java程序员,我想很多人都知道日志对于一个程序的重要性,尤其是Web应用.很多时候,日志可能是我们了解应用程序如何执行的唯一 ...

  10. slf4j导入那个依赖_学习SPRINGBOOT结合日志门面SLF4J和日志实现LOGBACK的混合使用

    一.此处主要介绍在springboot工程下如何使用 logback + slf4j 进行日志记录. logback主要包含三个组成部分:Loggers(日志记录器).Appenders(输出目的在) ...

最新文章

  1. Ubuntu下CodeBlocks的安装、配置及静态库动态库的简单使用举例
  2. 拟合一条曲线_毕业季:6 款曲线,解决 99% 的 ELISA 数据拟合难题
  3. java的高级特性_java的高级特性_for
  4. AjaxControlTookit中的AutoCompleteExtender位置错位问题 ListSearchExtender不支持中文的问题...
  5. catia 桥接曲面圆角_4.3.7.1-Catia曲面之多桥接曲面_简单构面
  6. 【面试经验分享】Java 面试中的那些潜规则
  7. lua运行外部程序_一起聊聊redis(5)——c#的lua脚本应用实例之高并发抢口罩
  8. duilib入门简明教程 -- 部分bug (11) (转)
  9. 理解SapLocation()
  10. 十行代码实现高仿Promise
  11. 中国石油大学《安全行为学》第三阶段在线作业
  12. 微信公众号开发C#系列-11、生成带参数二维码应用场景
  13. 纯html5单击箭头切换图片,简单的实现点击箭头图片切换的js代码
  14. 卸载一个游戏计算机里还有文件,如何处理pc游戏卸载后留下的残余文件?
  15. PhotoShop纸张大小
  16. 网站的页面该如何去设计与布局
  17. 有道词典Android客户端包体积优化之路
  18. CleanMyMac2023Mac下载排行最好的清理工具
  19. insmod与modprobe命令的区别及其相关命令
  20. java读pdf一行_java 用itext解析一个pdf文件, 一行数据为一个对象,怎么解析

热门文章

  1. 小写的tensor接受数据,大写的Tensor()接受的是shape,数据的维度
  2. android 布局图片缩放,Android中进行图片缩放显示
  3. Jmeter高阶学习,运用NotePad++编写工程,随意复制多个工程到同一个工程
  4. 三星获得加州自动驾驶测试许可,与Google苹果正面刚
  5. Ubuntu 16.04 LTS Final Beta about JAVA
  6. 利用Mahout实现在Hadoop上运行K-Means算法
  7. 微软在Windows 8之后将放弃Windows品牌
  8. stata中计算公式命令_Stata:runby - 一切皆可分组计算!
  9. 去掉a标签下划线_编辑器、HTML基础、编码、基础标签
  10. 初学者怎么自学python编程_编程零基础初学者应当如何开始学习 Python?