原文:https://blog.csdn.net/cw_hello1/article/details/51923814

一、logger标签描述:(了解logger标签之前先看看两个重要概念)

	1.主要概念:★★级别继承(level inheritance)
		1)root标签是所有logger的祖先元素,所有的logger都继承与root元素,相当于java中的object对象。
		2)每一个logger标签都可以指定一个级别(TRACE,DEBUG,INFO,WARN,ERROR五种,他们是在ch.qos.logback.classic.Levelclass中定义的)。
		3)如果一个指定的logger标签没有指定规则的话,就会继承离他最近的祖先的级别。
		4)因为所有的logger都是继承root标签,所以为了确保所有的logger都有一个级别,root标签有一个默认的级别,默认值为DEBUG
		5)看看下面四个例子:


	
	2.重要概念:★★基本选择规则(base selection rule):
		1)任何一个logger对象都有五种级别,所以就对应有五种打印日志方法:logger.info(字符串),logger.debug(字符串)
		2)如果使用logger.info(字符串)的话,那么logger打印级别就是INFO。
		3)看看一个logger能不能打印出日志主要看两个因素:①打印方法时使用的级别(logger.info()),②logger对象的有效级别。第一个
		重要概念所讲。
		4)如何判断是否打印出日志:规则如下:
		A log request of level p issued to a logger having an effective level q, is enabled if p >= q.
		一个logger打印级别为P,而他的有效级别为q。如果p>=q的话,p对应的信息能打印出来。否则就不能打印出对应的信息。
		记住:有效级别是最低级别,高于有效级别的信息都能打印出来,低于有效级别都不能打印出来。
		5)级别大小规则:TRACE<DEBUG<INFO<WARN<ERROR。
		6)例如:
	
	3.logger结构:
		1)一个logger标签包含:一个强制的name属性,一个可选的level属性和一个可选的additivity属性(additivity的值有true和false)
		2)level属性的值:可以是TRACE,DEBUG,INFO,WARN,ERROR,OFF,ALL中任何一个,并且不区分大小写。如果没有写
		的话就会继承离他最近的祖先的级别,就是第一个概念的内容。
		3)其中name的值,很重要,并且是必须的。它主要是指定包名或者类名的全路径(包含包名)。所有的logger对象都是通过这个来确定
		祖先关系的。
		4)logger标签可以包含0个或者多个appender-ref标签,所以每一个appender标签都可以关联到指定的logger中。

		5)level默认是以覆盖的方式继承的。而appender-ref是附加的形式继承的。
			1)覆盖方式:如果父亲的级别是DEBUG,如果在这个logger中设置了INFO,最终这个logger的级别就是INFO
			2)附加方式:如果在父亲中有一个appender-ref(关联一个appender标签),在当前这个logger中也设置一个appender-ref,
			那么当前的logger就有两个appender-ref的关联。如果想要改变默认的附加形式,那就要使用addtivity属性值。

二、logger中appender附加方式:
 
1.在默认情况下:appender是累加的方式进行操作的。即:一个logger对象将会记录:①与这个logger对象直接关联的appender日志格式,
 
 
②是当前logger对象的祖先对象(所有祖先)的logger相关联的appender日志格式。因此:同一个appender对象绑定到多个logger
对象上,就会造成日志输出多份。
 
2.例如:

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>   <logger name="chapters.configuration">
    <appender-ref ref="STDOUT" /><!--STDOUT绑定到chapters.configuration上,这个logger的祖先是root-->
  </logger>   <root level="debug"><!--在root上也绑定STDOUT的appender对象到root上。-->
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
 
如果在charpters.configuration的类的日志打印的话,就会打印两份。因为一份是charpters.configuration
的,一份是root的。所以就会打印两次:如下所示:
14:25:36.343 [main] INFO chapters.configuration.MyApp3 - Entering application.
14:25:36.343 [main] INFO chapters.configuration.MyApp3 - Entering application.
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] INFO chapters.configuration.MyApp3 - Exiting application.
14:25:36.359 [main] INFO chapters.configuration.MyApp3 - Exiting application.
这个名字为STDOUT附加到两个logger对象上,root是任何logger对象的祖先。而chapters.configuration
又是MyApp3和Foo的祖先,所有打印两次。
 
3.appender的累加功能不想想对新用户造成困扰。而是对于日志记录非常的灵活。
1)例如:如果你想要配置日志文件以便形成:①对于所有的logger对象的日志信息都打印到控制台上。
②并且只有一部分的logger对象打印到日志文件中。那就如下配置logback文件
<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>myApp.log</file>
    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
  </appender>   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>   <logger name="chapters.configuration">
    <appender-ref ref="FILE" />
  </logger>   <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
对于所有的日志对象都会打印日志信息到控制台上,但是对于chapters.configuration的日志对象还会记录到
文件中。
 
4.覆盖默认的appender的累加行为:
如果默认的累加行为不符合你的要求, 你可以通过设置【activity=false】来取消默认的行为(累加)。
1)例如:

<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>foo.log</file>
    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
    </encoder>
  </appender>   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>   <logger name="chapters.configuration.Foo" additivity="false">
    <appender-ref ref="FILE" />
  </logger>   <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
上面那个例子中:一个名字叫FILE的appender附加到chapters.configuration.Foo的logger对象上,
并且这个logger对象的activity的属性为false。这就意味着:Foo的日志信息将会按照名字叫FILE的
appender的样式输出,而不会附加任何一个祖先上的appender对象。但是,其他日志对象(不属于
chapters.configuration.Foo及其子类的logger)仍然以附加的形式继承appender对象。

logback和slf4j的使用之logger使用的更多相关文章

  1. logback:logback和slf4j中的:appender、logger、encoder、layout

    (1)appender 1.appender标签是logback配置文件中重要的组件之一.在logback配置文件中使用appender标签进行定义.可 以包含0个或多个appender标签. 2.a ...

  2. log4j 、logback 以及slf4j三者之间的关系

    在项目的开发中由于对于log4j.logback以及slf4j之间的关系和相关的知识不能清晰掌握,在业余时间进行记录. 1.三者之间的关系 1) 简答的讲就是slf4j是一系列的日志接口,而log4j ...

  3. Getting logback and slf4j to work in JBoss AS 7

    As usual, it has to do with classloading and that JBoss internally also uses slf4j and logback. As e ...

  4. Logback,SLF4J,Log4J2。了解它们并学习如何使用。(翻译)

    背景 如果您正在或在任何Java项目上工作,则可能已记录了一些debug,error或info语句以进行调试或跟踪.通过将库记录到磁盘或其他某种介质上的文件中来写这些语句. 日志记录是任何项目的关键方 ...

  5. Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2

    先说结论 建议优先使用logback 或 log4j2.log4j2 不建议和 slf4j 配合使用,因为格式转换会浪费性能. 名词:jcl 和 jul 标题中的 jcl 是 apache Jakar ...

  6. 转:Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2

    先说结论 建议优先使用logback 或 log4j2.log4j2 不建议和 slf4j 配合使用,因为格式转换会浪费性能. 名词:jcl 和 jul 标题中的 jcl 是 apache Jakar ...

  7. 【转】logback logback.xml常用配置详解(一)<configuration> and <logger>

    原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...

  8. logback 配置详解(一)——logger、root

    1.根节点<configuration>包含的属性 scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文件 ...

  9. logback + slf4j + jboss + spring mvc

    logback.log4j.log4j2 全是以同一个人为首的团伙搞出来的(日志专业户!),这几个各有所长,log4j性能相对最差,log4j2性能不错,但是目前跟mybatis有些犯冲(log4j2 ...

随机推荐

  1. FFmpeg软硬解和多线程解码

    一. AVCodecContext解码上下文 1.avcodec_register_all() : 注册所有的解码器 2.AVCodec *avcodec_find_decoder(enum AVCo ...

  2. C++类模板 template <class T>

    C++在发展的后期增加了模板(template )的功能,提供了解决这类问题的途径.可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数. 比如: class Compare_int class ...

  3. JS 对象 合并

    来自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Sy ...

  4. 查询改写(Query Rewrite)方法总结

    为何需要Query改写 Query分析是搜索引擎的一个重要模块,对搜索结果的覆盖率和相关性至关重要.搜索引擎的检索过程包含了两个重要的阶段:匹配和排序.匹配也叫召回,表示根据用户的查询条件,尽可能多地 ...

  5. java保留小数点两位的4种方法

    import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public c ...

  6. 前端小例子 基础js css html练习

    前情提要: 学前端也有一阵了,个人感觉前端还是重要的. html 学习教程 https://www.cnblogs.com/baili-luoyun/p/10466040.html css 教程 js ...

  7. 剑指offer四十一之和为S的连续正数序列

    一.题目   题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数 ...

  8. 监督学习——随机梯度下降算法(sgd)和批梯度下降算法(bgd)

    线性回归 首先要明白什么是回归.回归的目的是通过几个已知数据来预测另一个数值型数据的目标值. 假设特征和结果满足线性关系,即满足一个计算公式h(x),这个公式的自变量就是已知的数据x,函数值h(x)就 ...

  9. 移植C/C++代码的十个技巧

    这篇文章是我翻译自Top 10 tips for code porting c/c++的一篇小短文,以下是翻译全文,如有错误请留言或查阅原文. 代码的可移植性基本上是指使得源代码能够在不同的平台上编译 ...

  10. Spring Security构建Rest服务-1000-使用SpringSocial开发第三方登录之大白话OAuth协议

    OAuth协议简介 OAuth协议要解决的问题    OAuth协议中的各种角色 OAuth协议运行流程 OAuth协议,在网上也看了一些资料,意思就是给你颁发一个临时的通行证,你拿着这个通行证可以访 ...