logback和slf4j的使用之encoder和Layout

来源:互联网 发布:淘宝客服对话技巧 编辑:程序博客网 时间:2024/04/29 14:41
一、encoder介绍:
1.encoder:主要工作有两个:①将一个event事件转换成一组byte数组,②将转换后的字节数据输出到文件中。
2.encoder组件是在0.9.19版本之后才引进来的。在以前的版本中,appender是使用layout(将一个event事件转换成一个字符串),然后使用【java.io.writer】对象将字符串写入到文件中。
3.自从0.9.19版本之后,Fileappender和他的子类是期望使用encoder,不再使用layout。
4.其中layout仅仅完成了将一个event事件转换成一个字符串这一个功能。此外,layout不能控制将字符串写出到文件。layout不能整合event事件到一组中。与encoder相比,不仅仅能按照格式进行转化,而且还能将数据写入到文件中。
5.其中patternLayoutEncoder是最常使用encoder,他包含可patternLayout大部分的工作。
6.几个重要的encoder:
6.1.LayoutWrappingEncoder:(不怎么用
6.1.1.在0.9.19版本之前,都是使用layout来控制输出的格式。那就存在大量的layout接口(自定义)的代码。在0.9.19就变成了使用encoder来控制,如果我们想使用以前的layout怎么办?这个LayoutWrappingEncoder就是为了encoder能够操作内部layout存在的。即这个类在encoder与layout之间提供一个桥梁。这个类实现了encoder类,又包含了layout将evnet事件装换成字符串的功能。
6.1.2.原理:使用layout将输入的evnet事件转换成一个字符串,然后将字符串按照用户指定的编码转换成byte数组。最后将byte数据写入到文件中去。
6.1.3.在默认的情况下,输出流是立即刷新的。除非immediateFlush属性值为false,就不会立即刷新,但是为提高logger接入量。
6.2.PatternLayoutEncoder常用。他是LayoutWrappingEncoder的子类
6.2.1.考虑到PatternLayout是layout中最常用的组件,所以logback人员开发出了patternLayoutEncoder类,这个类是LayoutWrappingEncoder的扩展,这个类包含了PatternLayout。
6.2.2.immediateFlush标签与LayoutWrappingEncoder是一样的。默认值为【true】。这样的话,在已存在的项目就算没有正常情况下的关闭,也能记录所有的日志信息到磁盘上,不会丢失任何日志信息。因为是立即刷新。如果将【immediateFlush】设置为【false】,可能就是五倍的原来的logger接入量。但是可能会丢失日志信息在没有正常关闭项目的情况下。
6.2.3.例如:
<appender name="FILE" class="ch.qos.logback.core.FileAppender">   <file>foo.log</file>  <encoder><!--默认就是PatternLayoutEncoder类-->    <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>    <!-- this quadruples logging throughput -->    <immediateFlush>false</immediateFlush>  </encoder> </appender>
6.2.4.如果想在文件的开头打印出日志的格式信息:即打印日志的模式。使用【outputPatternAsHeader】标签,并设置为【true】.默认值为【false】。例如:
<appender name="FILE" class="ch.qos.logback.core.FileAppender">   <file>foo.log</file>  <encoder>    <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>    <outputPatternAsHeader>true</outputPatternAsHeader>  </encoder> </appender>
他就会在foo.log文件的开头有一句【#logback.classic pattern: %d [%thread] %-5level %logger{36} - %msg%n】然后才是打印日志的信息。
6.2.5.patternLayoutEncoder类既有layout将一个事件转化为字符串,又有将字符创写入到文件中的作用。他是encoder标签的默认类实例。
二、layout功能:
1.layout主要的功能就是:将一个event事件转化为一个String字符串。
2.一个重要的Layout实例:PatternLayout
2.1.在所有的layout中,patternLayout是一个灵活的Layout实例,将一个event转化为一个String,而这个String的格式可以有我们自定义的转化模式得到。
2.2.patternLayout的转换模式与C语言的printf函数相类似。
2.3.一个转换模式有两部分组成:①普通的文本、②格式控制表达式(转换说明符)
2.4.转换说明符:
2.4.1.必须以【%】开头。(必须的
2.4.2.【%】后面是一个格式修饰符:用于左对齐,右对齐,前或后截取等等。(可选的
2.4.3.转换的关键字。(必须的)。用于控制转换成什么的数据字段。例如logger的name、level级别、日期、线程的名称等等。
2.4.4.在大括号【{}】中间的范围。(可选的
2.5.在patternLayout中可以使用小括号【()】形成一组转换模式。如果想要【()】作为普通字符,就要转义。
3.下面看看几个重要的转换关键字(第三个):如果在一个表格中,表示是有相同作用的。
4.如果想让【%】作为普通的字符串。需要使用转义字符【\】。即使用【\%】就会变成普通【%】插入
5.注意:限制普通字符串紧跟在【转换说明符】后面。
例如%nhello,就会报错。因为系统找不到nhello的关键字。所以要加上分割符【空格,-,等等】
6.格式说明符:可选的。是转换说明符的第二个
6.1.作用:用于左右对齐(最小宽度问题),左右截取(最大宽度问题),
6.2.位置:在【%】和【转换关键字】之间。
6.3.几个说明符:
6.3.1.默认情况下是【右对齐】,如果想要【左对齐】,就是用减号【-】。然后就是一个十进制的【最小宽度】数字。如果数据内容小于最小宽度的数字,如果没有【-】就在前面填充空格,如果有【-】就在后面填充空格。直到到达最小宽度的值。如果数据内容超过最小宽度,会显示全部内容(在没有执行最大宽度的时候)。
6.3.2.指定最大宽度:使用点号【.】,后面加上一个十进制的数字。如果数据内容超过了【最大宽度】,默认情况下,会从【前面】截取数据。如果数据长度为10,最大宽度为8,就会去掉前面2个字符,以显示后面的8个字符数据。如果想从【后面截取】,就在【.】后面加上一个【-】,就会从后面截取。即【.-8】
6.3.3.注意:在及指定最小宽度,又指定最大宽度的时候,先指定最小宽度,指定最大宽度。
6.3.4.如果以【.】开头,只有最大宽度的时候,就没有左右对齐之说。
6.3.5.总结:数字可以接在一下说明符的后面:
6.3.5.1.【直接写数字】:标识最小宽度并且是右对齐
6.3.5.2.【-数字】:标识最小宽度,并且是左对齐
6.3.5.3.【.数字】:标识最大宽度。如果数据内容超过最大宽度,从前面截取数据
6.3.5.4.【.-数字】:标识最大宽度。如果数据内容超过最大宽度,从后面截取数据
6.4.例子:
0 0