slf4j由log4j作者Ceki开发,逐步取代apahce commons-logging
logback由log4j作者Ceki开发,逐步取代log4j。
关系:
slf4j=====commons-logging
*.各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库。
logback====log4j *.日志实现类
日志管理:slf4j(commons-logging)+logback(log4j)
二:logback简介
1、Logback为取代log4j而生
Logback是由log4j创始人Ceki Gülcü设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。
2、Logback的核心对象:Logger、Appender、Layout
Logback主要建立于Logger、Appender 和 Layout 这三个类之上。
Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。Logger对象一般多定义为静态常量,如:
1 package com.logs;
2
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory; 5
6 public class MyApp {
7 final static Logger logger = LoggerFactory.getLogger(\"MyApp.class\"); 8 public static void main(String[] args) { 9
10 logger.trace(\"trace\"); 11 logger.debug(\"debug str\"); 12 logger.info(\"info str\"); 13 logger.warn(\"warn\"); 14 logger.error(\"error\"); 15 } 16 }
Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、 PostreSQL、Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。
Layout:负责把事件转换成字符串,格式化的日志信息的输出。具体的Layout通配符,可以直接查看帮助文档。
3、Level 有效级别
Logger可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN和ERROR,定义于ch.qos.logback.classic.Level类。程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。如果设置级别为INFO,则优先级高于等于INFO级别(如:INFO、 WARN、ERROR)的日志信息将可以被输出,小于该级别的如DEBUG将不会被输出。为确保所有logger都能够最终继承一个级别,根logger总是有级别,默认情况下,这个级别是DEBUG。
4、 三值逻辑
Logback的过滤器基于三值逻辑(ternary logic),允许把它们组装或成链,从而组成任意的复合过滤策略。过滤器很大程度上受到Linux的iptables启发。这里的所谓三值逻辑是说,过滤器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一个。 如果返回DENY,那么记录事件立即被抛弃,不再经过剩余过滤器; 如果返回NEUTRAL,那么有序列表里的下一个过滤器会接着处理记录事件;
如果返回ACCEPT,那么记录事件被立即处理,不再经过剩余过滤器。
5、Filter 过滤器
Logback-classic提供两种类型的过滤器:常规过滤器和TuroboFilter过滤器。Logback整体流程:Logger 产生日志信息;Layout修饰这条msg的显示格式;Filter过滤显示的内容;Appender具体的显示,即保存这日志信息的地方。
6、Logback的使用
要在工程里面使用logback需要以下jar文件:
slf4j-api-1.6.1.jar
官网网址:http://www.slf4j.org/
下载地址:http://www.slf4j.org/dist/slf4j-1.6.1.zip
logback-access-0.9.29.jar logback-classic-0.9.29.jar logback-core-0.9.29.jar
官网网址:http://logback.qos.ch/
下载地址:http://logback.qos.ch/dist/logback-0.9.29.zip
在工程src目录下建立logback.xml 注:
1.logback首先会试着查找logback.groovy文件; 2.当没有找到时,继续试着查找logback-test.xml文件; 3.当没有找到时,继续试着查找logback.xml文件; 4.如果仍然没有找到,则使用默认配置(打印到控制台)。
在工程src目录下建立logback包,然后在包下建立LogbackDemo.java用于测试,代码如 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\
// logback提供的可以使用变量的打印方式,结果为\"Hello,Aub!\" log.info(\"Hello,{}!\
// 可以有多个参数,结果为“Hello,Aub! 3Q!” log.info(\"Hello,{}! {}!\ // 可以传入一个数组,结果为\"Fruit: apple,banana\" log.info(\"Fruit: {},{}\ } }
三:Logback配置详解
1:根节点 scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 例如: Xml代码 2:根节点 2.1设置上下文名称: 每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用 Xml代码 2.2设置变量: 用来定义变量值的标签, 例如使用 Xml代码 2.3获取时间戳字符串: 两个属性 key:标识此 Xml代码 2.4设置loger 用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 用来指定受此loger约束的某一个包或者具体的某一个类。 level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。 addtivity: 是否向上级loger传递打印信息。默认是true。 也是 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。 默认是DEBUG。 例如: LogbackDemo.java类 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\"); } } logback.xml配置文件 第1种:只配置root Xml代码 1. 3. 4. 5. 6. 9. 10. 14. 其中appender的配置表示打印到控制台(稍后详细讲解appender ); 当执行logback.LogbackDemo类的main方法时,root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台; 打印结果如下: 13:30:38.484 [main] INFO logback.LogbackDemo - ======info 13:30:38.500 [main] WARN logback.LogbackDemo - ======warn 13:30:38.500 [main] ERROR logback.LogbackDemo - ======error 第2种:带有loger的配置,不指定级别,不指定appender, Xml代码 其中appender的配置表示打印到控制台(稍后详细讲解appender ); 没有设置addtivity,默认为true,将此loger的打印信息向上级传递; 没有设置appender,此loger本身不打印任何信息。 当执行logback.LogbackDemo类的main方法时,因为LogbackDemo 在包logback中,所以首先执行 root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台; 打印结果如下: Xml代码 13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug 13:19:15.406 [main] INFO logback.LogbackDemo - ======info 13:19:15.406 [main] WARN logback.LogbackDemo - ======warn 13:19:15.406 [main] ERROR logback.LogbackDemo - ======error 第3种:带有多个loger的配置,指定级别,指定appender Xml代码 其中appender的配置表示打印到控制台(稍后详细讲解appender ); 没有设置addtivity,默认为true,将此loger的打印信息向上级传递; 没有设置appender,此loger本身不打印任何信息。 additivity属性为false,表示此loger的打印信息不再向上级传递, 指定了名字为“STDOUT”的appender。 当执行logback.LogbackDemo类的main方法时,先执行 打印结果如下: 14:05:35.937 [main] INFO logback.LogbackDemo - ======info 14:05:35.937 [main] WARN logback.LogbackDemo - ======warn 14:05:35.937 [main] ERROR logback.LogbackDemo - ======error 如果将 为 没错,日志打印了两次,想必大家都知道原因了,因为打印信息向上级传递,logger本身打印一次,root接到后又打印一次 打印结果如下: 14:09:01.531 [main] INFO logback.LogbackDemo - ======info 14:09:01.531 [main] INFO logback.LogbackDemo - ======info 14:09:01.531 [main] WARN logback.LogbackDemo - ======warn 14:09:01.531 [main] WARN logback.LogbackDemo - ======warn 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error 2.5设置 1.ConsoleAppender: 把日志添加到控制台,有以下子节点: Xml代码 2.FileAppender: 把日志添加到文件,有以下子节点: 例如: Xml代码 3.RollingFileAppender: 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点: TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。 rollingPolicy: TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点: 必要节点,包含文件名及“%d”转换符, “%d”可以包含一个 java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。 RollingFileAppender 的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\\”会被当做目录分隔符。 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且 FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点: 必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip triggeringPolicy: SizeBasedTriggeringPolicy: 查看当前活动文件的大小,如果超过指定大小会告知 RollingFileAppender 触发当前活动文件滚动。只有一个节点: 例如:每天生成一个日志文件,保存30天的日志文件。 Java代码 例如:按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大 小是1到3,当保存了3个归档文件后,将覆盖最早的日志。 Xml代码 4.另外还有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、 SiftingAppender,并不常用,这些就不在这里讲解了,大家可以参考官方文档。当然大家可以编写自己的Appender。 负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。 目前PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个 例如: Xml代码 可选的格式修饰符位于“%”和转换符之间。 第一个可选修饰符是左对齐 标志,符号是减号“-”;接着是可选的最小宽度 修饰符,用十进制数表示。如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。如果字符大于最小宽度,字符永远不会被截断。最大宽度 修饰符,符号是点号\".\"后面加十进制数。如果字符大于最大宽度,则从前面截断。点符号“.”后面加减号“-”在加数字,表示从尾部截断。 例如:%-4relative 表示,将输出从程序启动到创建日志记录的时间 进行左对齐 且最小宽度为4。 3:过滤器 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志将立即被抛弃不再经过其他过滤器;返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。 过滤器被添加到 LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。有以下子节点: 例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。 Xml代码 %-4relative [%thread] %-5level %logger{30} - %msg%n ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。 例如:过滤掉所有低于INFO级别的日志。 Xml代码 %-4relative [%thread] %-5level %logger{30} - %msg%n EvaluatorFilter: 求值过滤器,评估、鉴别日志是否符合指定条件。需要额 外的两个JAR包,commons-compiler.jar和janino.jar有以下子节点: 鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。evaluator有个子标签 与记录请求相关联的原始记录事件,下面所有变量都来自event,例如, event.getMessage()返回下面\"message\"相同的字符串 日志的原始消息,例如,设有logger mylogger,\"name\"的值是\"AUB\",对于 mylogger.info(\"Hello {}\\"Hello {}\"就是原始消息。 日志被各式话的消息,例如,设有 logger mylogger,\"name\"的值是\"AUB\",对于 mylogger.info(\"Hello {}\\"Hello Aub\"就是格式化后的消息。 logger 名。 日志所属的logger上下文。 级别对应的整数值,所以 level > INFO 是正确的表达式。 创建日志的时间戳。 与日志请求相关联的Marker对象,注意“Marker”有可能为null,所以你要确 event LoggingEvent message String formatedMessage logger loggerContext level timeStamp marker String String LoggerContextVO int long Marker 保它不能是null。 包含创建日志期间的MDC所有值得map。访问方法是: mdc.get(\"myKey\") 。mdc.get()返回的是Object不是 String,要想调用String的方法就要强转,例如, ((String) mdc.get(\"k\")).contains(\"val\") .MDC可能为null,调用时注意。 如果没有异常与日志关联\"throwable\" 变量为 null. 不幸的是, \"throwable\" 不能被序列化。在远程系统上永远为 null,对于与位置无关的表达式请使用下面的变量throwableProxy 与日志事件关联的异常代理。如果没有异常与日志事件关联,则变量 \"throwableProxy\" 为 null. 当异常被关联到日志事件时,\"throwableProxy\" 在远程系统上不会为null mdc Map throwable java.lang.Throwable throwableProxy IThrowableProxy 例如:过滤掉所有日志消息中不包含“billing”字符串的日志。 Xml代码 %-4relative [%thread] %-5level %logger - %msg%n 匹配器,尽管可以使用String类的matches()方法进行模式匹配,但会导致每次调用过滤器时都会创建一个新的Pattern对象,为了消除这种开销,可以预定义一个或多个matcher对象,定以后就可以在求值表达式中重复引用。 例如: Xml代码 其他Filter不太常用我这里就不讲了,大家可以参见官网。 四:log4j配置详解 配置实例: 在工程目录src下创建名为 “log4j.properties” 文件,内容如下: Properties代码 五:配置实例 1.logback 1 2 4 5 7 11 12 15 21 24 28 29 38 41 45 46 50 52 56 58 61 65 66 72 76 79 82 85 88 91 94 97 100 104 105 112 2.log4j 在日常的开发中经常需要通过输出一些信息进行程序的调试,如果到处都用 system.out.println()则在项目发布之后要逐一删除,而log4j提供了一种新的调试输出机制以解决输出的问题。log4j的原理是使用一个配置文件log4j.properties进行管理,在调试的时候可以把输出级别调低,项目正式发布之后把级别调高,这样以前的一些输出就可以屏蔽了,不用到程序当中再进行逐一删除。我们可以结合了commons-logging和log4j来进行日常的输出调试信息和记录系统运行的信息日志 在spring的项目中,spring为我们提供了管理log4j的类, 如果项目中使用了spring我一般都会通过spring提供的类来管理日志信息 一,首先我们来看看非spring环境中使用log4j 使用步骤。 1.添加必须jar包 a。commons-logging.jar b. log4j-1.2.14.jar 2.在web目录的src目录下面添加两个文件:commons-logging.properties和 log4j.properties a.commons-logging.properties(文件名必须是此指定文件名),通用日志接口从此属性文件中获取实现日志添加内容如下: #通过Log4J日志器来实现日志记录功能 org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger b.log4j.properties ,为log4j指定相应的属性 #指定日志的级别为DEBUG,log4j共有OFF(关闭),FATAL(严重的错误),ERROR(一般性错误),WARN(警告),INFO(信息),DEBUG(调试信息),TRACE(追踪)和ALL等8个基本 #并配置了两个输出目的地为e1(输出在控制台上),e2(输出在日志文件中) log4j.rootLogger=DEBUG,e1,e2 #指定e1日志信息输出在控制台 log4j.appender.e1=org.apache.log4j.ConsoleAppender #指定e1日志信息输出格式为简单格式,它打印级别 Level,然后跟着一个破折号“-“ ,最后是日志消息。也可以自己定义格式 log4j.appender.e1.layout=org.apache.log4j.SimpleLayout #指定e2日志信息输出在指定文件中 log4j.appender.e2=org.apache.log4j.FileAppender log4j.appender.e2.layout=org.apache.log4j.SimpleLayout #指定e2日志信息输出在logging.txt文件中,默认生成的logging.txt文件在tomcat的bin目录下 log4j.appender.e2.File=logging.txt 如果自己定义输出的日志,如下 log4j.rootLogger=DEBUG,e1,e2 log4j.appender.e1=org.apache.log4j.ConsoleAppender #log4j.appender.e1.layout=org.apache.log4j.SimpleLayout #指定布局模式格式 log4j.appender.e1.layout=org.apache.log4j.PatternLayout #定义自己的输出格式 log4j.appender.e1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%- 5p][%c] - %m%n log4j.appender.e2=org.apache.log4j.FileAppender log4j.appender.e2.layout=org.apache.log4j.PatternLayout log4j.appender.e2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c] - %m%n log4j.appender.e2.File=logging.txt 详细配置信息 配置Appender组件 配置日志消息输出目的地Appender,有以下几种 org.apache.log4j.ConsoleAppender(控制台) org.apache.log4j.FileAppender(文件) org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) org.apache.log4j.RollingFileAppender(文件大小达到指定尺寸的时候产生一个新文件) org.apache.log4j.WriterAppender(将日志信息以流个格式发送到任意指定的地方) 例如以下代码定义了一个名了file的Appender,它把日志信息输出到log.txt文件 log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=log.txt 配置Layout组件 Log4j提供下面几种Layout org.apache.log4j.HTMLLayout(以html表格形式布局) org.apache.log4j.PatterLayout(可以灵活的指定布局模式) org.apache.log4j.SimpleLayout(包含日志消息的级别和信息字符串) org.apache.log4j.TTCCLayout(包含日志产生的时间线程和类别) Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息 Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“\\r\\n”,Unix平台为“\\n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) 二、在spring的项目中使用log4j 首先需要在web.xml进行声明: 这里的ssh是http://localhost:8080/ssh/ 而root是系统开发目录中ssh/root 这样配置文件以及日志文件可以在spring的帮助下,放到开发环境中的任意位置 在这里定位配置文件,需要的是从root开始的绝对路径 之后我们就可以配置log4j配置文件了,内容如上的log4j.properties 我找了一个格式,copy如下 #先设置级别 log4j.rootLogger=INFO, file log4j.appender.file=org.apache.log4j.RollingFileAppender #在这里设置日志需要存放的位置,这里的变量就是我们在web.xml里设置的 log4j.appender.file.File=${ssh.root}/WEB-INF/logs/subject.log log4j.appender.file.MaxFileSize=100KB log4j.appender.file.MaxBackupIndex=0 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[ssh] %p %t %c - %m%n logback相比较log4j的优势 slf4j支持参数化的logger.error(\"帐号ID:{}不存在\告别了if(logger.isDebugEnable()) 时代。 另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j。 因篇幅问题不能全部显示,请点此查看更多更全内容