在开发任何的程序或者做自动化,日志都是不可缺少的部分。最近看了下Apache的开源项目log4j。觉得它已经能够完全满足日常工作的需要了。
实例
这里采用的maven的方式,所以首先在pom.xml中配置好log的jar包
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
在src下创建log4j.properties(我们采用读取properties的方式)
log4j.rootLogger = INFO,dev,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Threshold=INFO log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c : %m%n ### INFO 级别以上的日志到./logs/run.log log4j.appender.dev=org.apache.log4j.DailyRollingFileAppender log4j.appender.dev.Append=true log4j.appender.dev.DatePattern='.'yyyy-MM-dd log4j.appender.dev.File=logs/run.log log4j.appender.dev.Threshold=INFO log4j.appender.dev.layout=org.apache.log4j.PatternLayout log4j.appender.dev.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c : %m%n log4j.additivity.dev=false ### INFO 级别以上的日志到./logs/appium.log log4j.logger.appium = INFO,appium log4j.appender.appium=org.apache.log4j.DailyRollingFileAppender log4j.appender.appium.Append=true log4j.appender.appium.DatePattern='.'yyyy-MM-dd log4j.appender.appium.File=logs/appium.log log4j.appender.appium.Threshold=INFO log4j.appender.appium.layout=org.apache.log4j.PatternLayout log4j.appender.appium.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c : %m%n log4j.additivity.appium=false
编写代码
private static Logger logger = Logger.getLogger("dev"); public static void main(String[] args) { PropertyConfigurator.configure(new File("./src/log4j.properties").getAbsolutePath()); logger.info("this is a info "); logger.debug("this is a debug "); logger.warn("this is a warn"); logger.error("this is a error"); }
运行结果:
在控制台以及log目录下的run.log中都显示如下信息
log4j简单使用
讲log4j首先我们得看的懂log4j.properties配置文件
上边的配置文件实际上并不难 我们来简单分析下吧。
log4j.rootLogger = INFO,dev,stdout
这里我们配置了根root 有两个输出目的地 一个是dev,一个stdout。并且Level等级是INFO.即level在INFO的信息才会显示在log中,这也就是为什么我们看到的log里面实际上是没有debug的log信息的。这里首先要说下log4j中Level分别有:
- off 最高等级,用于关闭所有日志记录。
- fatal 指出每个严重的错误事件将会导致应用程序的退出。
- error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
- warn 表明会出现潜在的错误情形。
- info 一般和在粗粒度级别上,强调应用程序的运行全程。
- debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
- all 最低等级,用于打开所有日志记录。
配置好了输出目的地,我们当然要对各个输出目的地进行配置了
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
首先是配置stdou的输出方式:
Log4j提供的appender有以下几种:
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
常用的还是每天产生日志文件的方式
log4j.appender.stdout.Threshold=INFO
过滤器 只有大于INFO的才会输出 这个常常会配置着rootLogger一起使用
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
Log4j提供的输出方式由如下几种:
- org.apache.log4j.HTMLLayout(以HTML表格形式布局),
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
目前常用的还是PatternLayout的方式
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c : %m%n
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息
- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
- %r 输出自应用启动到输出该log信息耗费的毫秒数
- %c 输出所属的类目,通常就是所在类的全名
- %t 输出产生该日志事件的线程名
- %n 输出一个回车换行符,Windows平台为“rn”,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)
讲完这些其实还是有疑问,就是下面的appium的log作用在哪,实际并没有看到它的任何输出呢。这里就要结合代码来讲多个logger的问题了。
代码实现log4j
获取到log记录器
//获取日志记录器,这个记录器将负责控制日志信息 private static Logger logger = Logger.getLogger("dev");
读取配置文件
//读取log4j.properties的配置信息 PropertyConfigurator.configure(new File("./src/log4j.properties").getAbsolutePath());
输出log信息
logger.info("this is a info "); logger.debug("this is a debug "); logger.warn("this is a warn"); logger.error("this is a error");
其实讲完上面的代码实际上就应该明白。如何将上面的getLogger的参数改成appium后,log就会输出到appium.log文件下,并且也不会有控制台的内容输出了。