介绍 在编写大型项目时,日志输出是极其重要的一部分。而在Java项目中,常用的日志则是log4j和slf4j的组合。
log4j Log For Java,Apache的一个开源项目,可以灵活地记录日志信息,我们可以通过log4j的配置文件灵活配置日志的记录格式、记录级别、输出格式,而不需要修改已有的日志记录代码。
官方网站:http://logging.apache.org/log4j/1.2/
slf4j 简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,slf4j是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
在使用slf4j的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统,slf4j提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
官方网站:http://www.slf4j.org/
先从log4j学起
log4j的使用 配置文件 可以有两种配置方式:log4j.properties(键对的形式), log4j.xml
.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //定义两个INFO级别的appender log4j.rootLogger = INFO,console,logFile //org.apache.log4j.ConsoleAppender 输出到控制台 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.layout =org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern =%d %p [%c] - <%m>%n //org.apache.log4j.FileAppender 输出到一个log文件 //org.apache.log4j.DailyRollingFileAppender 每天自动产生一个日志文件 log4j.appender.logFile = org.apache.log4j.FileAppender log4j.appender.logFile.File =src/log/logging.log log4j.appender.logFile.Append =false //是否追加 log4j.appender.logFile.layout =org.apache.log4j.PatternLayout log4j.appender.logFile.layout.ConversionPattern =%d %p [%c] - <%m>%n
.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j :configuration SYSTEM "log4j.dtd" > <log4j:configuration > <appender name ="myConsole" class ="org.apache.log4j.ConsoleAppender" > <layout class ="org.apache.log4j.PatternLayout" > <param name ="ConversionPattern" value ="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n" /> </layout > </appender > <appender name ="myFile" class ="org.apache.log4j.DailyRollingFileAppender" > <param name ="File" value ="output.log" /> <param name ="Append" value ="true" /> <layout class ="org.apache.log4j.PatternLayout" > <param name ="ConversionPattern" value ="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n" /> </layout > </appender > <category name ="com.zjut.a1" > <priority value ="debug" /> <appender-ref ref ="myFile" /> </category > <root > <priority value ="debug" /> <appender-ref ref ="myConsole" /> <appender-ref ref ="myFile" /> </root > </log4j:configuration >
配置文件存放位置 放在src下,不能是src下面的任一个文件夹下。
否则会报如下错
1 2 3 log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
说明缺少log4j.properties这个文件或者他的存放的位置错误,导致找不到它。
还有另一个比较高阶的办法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public static void initLog () { FileInputStream fileInputStream = null ; try { Properties properties = new Properties(); fileInputStream = new FileInputStream("src/log/log4j.properties" ); properties.load(fileInputStream); PropertyConfigurator.configure(properties); } catch (Exception e) { e.printStackTrace(); } finally { if (fileInputStream != null ) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main (String[] args) { initLog(); Logger logger=LogManager.getLogger(Mylog.class ) ; }
日志输出级别 log4j的日志级别如下表所示,其种从上至下等级越来越高,及配置了某一级别后,表格中处于它下边的位置级别的日志都会打印。
日志级别
说明
ALL
打印所有级别的日志
TRACE
指定细粒度比DEBUG更低的信息事件
DEBUG
指定细粒度信息事件是最有用的应用程序调试
INFO
指定能够突出在粗粒度级别的应用程序运行情况的信息的消息
WARN
指定具有潜在危害的情况
ERROR
错误事件可能仍然允许应用程序继续运行
FATAL
指定非常严重的错误事件,这可能导致应用程序中止
OFF
这是最高等级,为了关闭日志记录
ConversionPattern参数的格式含义 log4j.appender.logFile.layout.ConversionPattern=%d %p [%c] - <%m>%n
%c 输出日志信息所属的类的全名 %d (datetime)输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28 %F 输出日志信息所属的类的类名 %L 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 %m 输出代码中指定的信息,如log(message)中的message %n(new line) 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %p (priority) 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推 %r (runtime) 输出自应用启动到输出该日志信息所耗费的毫秒数 %t 输出产生该日志事件的线程名
使用 使用起来可以说是简单了
1 2 3 4 5 6 7 public static void main (String[] args) { Logger logger=LogManager.getLogger(Mylog.class ) ; logger.info("info" ); logger.warn("warning" ); }
结果
slf4j 待补充