log4j 例子
最近在搞一个项目架设,希望从构建一个项目方方面面都彻底研究透,增长实战经验。 今天先研究一下日志的构建,这里选择了log4j--java方面比较流行的log框架,功能 很强大,使用起来也很方便了
废话少说,先看看一个史上最简单的log例子,看看我是如何用最简洁的设计实现将异常 等信息写入日志文件的。
项目源码去的javaeye 博客下载 http://janeky.javaeye.com
项目文件结构 --------TestLog |----src | |-com/janeky/log/Log.java | |-log4j.properties |----bin | |-com/janeky/log/Log |----lib | |-log4j-1.2.11.jar
Eclipse新建一个java project TestLog 新建一个com.janeky.log包 导入log4j的jar包 包里新建一个Log.java
- package com.janeky.log;
- import org.apache.log4j.Logger;
- import org.apache.log4j.PropertyConfigurator;
- /**
- * @author janeky
- * Log演示程序
- */
- publicclass Log {
- //Logger实例
- private Logger loger;
- //将Log类封装成单实例的模式,独立于其他类。以后要用到日志的地方只要获得Log的实例就可以方便使用
- privatestatic Log log;
- //构造函数,用于初始化Logger配置需要的属性
- private Log()
- {
- //获得当前目录路径
- String filePath=this.getClass().getResource("/").getPath();
- //找到log4j.properties配置文件所在的目录(已经创建好)
- filePath=filePath.substring(1).replace("bin", "src");
- //获得日志类loger的实例
- loger=Logger.getLogger(this.getClass());
- //loger所需的配置文件路径
- PropertyConfigurator.configure(filePath+"log4j.properties");
- }
- static Log getLoger()
- {
- if(log!=null)
- return log;
- else
- returnnew Log();
- }
- //测试函数
- publicstaticvoid main(String args[])
- {
- Log log=Log.getLoger();
- try
- {
- //引发异常
- int a=2/0;
- }catch(Exception e)
- {
- //控制台打印异常信息
- e.printStackTrace();
- //写入到日子文件
- log.loger.error("error", e);
- }
- }
- }
- package com.janeky.log;
- import org.apache.log4j.Logger;
- import org.apache.log4j.PropertyConfigurator;
- /**
- * @author janeky
- * Log演示程序
- */
- publicclass Log {
- //Logger实例
- private Logger loger;
- //将Log类封装成单实例的模式,独立于其他类。以后要用到日志的地方只要获得Log的实例就可以方便使用
- privatestatic Log log;
- //构造函数,用于初始化Logger配置需要的属性
- private Log()
- {
- //获得当前目录路径
- String filePath=this.getClass().getResource("/").getPath();
- //找到log4j.properties配置文件所在的目录(已经创建好)
- filePath=filePath.substring(1).replace("bin", "src");
- //获得日志类loger的实例
- loger=Logger.getLogger(this.getClass());
- //loger所需的配置文件路径
- PropertyConfigurator.configure(filePath+"log4j.properties");
- }
- static Log getLoger()
- {
- if(log!=null)
- return log;
- else
- returnnew Log();
- }
- //测试函数
- publicstaticvoid main(String args[])
- {
- Log log=Log.getLoger();
- try
- {
- //引发异常
- int a=2/0;
- }catch(Exception e)
- {
- //控制台打印异常信息
- e.printStackTrace();
- //写入到日子文件
- log.loger.error("error", e);
- }
- }
- }
package com.janeky.log; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; /** * @author janeky * Log演示程序 */ public class Log { //Logger实例 private Logger loger; //将Log类封装成单实例的模式,独立于其他类。以后要用到日志的地方只要获得Log的实例就可以方便使用 private static Log log; //构造函数,用于初始化Logger配置需要的属性 private Log() { //获得当前目录路径 String filePath=this.getClass().getResource("/").getPath(); //找到log4j.properties配置文件所在的目录(已经创建好) filePath=filePath.substring(1).replace("bin", "src"); //获得日志类loger的实例 loger=Logger.getLogger(this.getClass()); //loger所需的配置文件路径 PropertyConfigurator.configure(filePath+"log4j.properties"); } static Log getLoger() { if(log!=null) return log; else return new Log(); } //测试函数 public static void main(String args[]) { Log log=Log.getLoger(); try { //引发异常 int a=2/0; }catch(Exception e) { //控制台打印异常信息 e.printStackTrace(); //写入到日子文件 log.loger.error("error", e); } } }
在src文件夹中新建一个文本文档 log4j.properties
- #定义DEBUG优先级,R为日志输出目的的
- log4j.rootLogger=DEBUG, R
- #设置日志输出类型,为文件类型
- log4j.appender.R=org.apache.log4j.FileAppender
- #设置日志文件名my.log
- log4j.appender.R.file=my.log
- #每次在文件尾写入新的日志信息
- log4j.appender.R.Append=true
- #日志输出信息格式类型
- log4j.appender.R.layout=org.apache.log4j.PatternLayout
- #日志输出信息格式为 换行、换行、日期、优先级、[类名]、日志信息、换行
- log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n
- #定义DEBUG优先级,R为日志输出目的的
- log4j.rootLogger=DEBUG, R
- #设置日志输出类型,为文件类型
- log4j.appender.R=org.apache.log4j.FileAppender
- #设置日志文件名my.log
- log4j.appender.R.file=my.log
- #每次在文件尾写入新的日志信息
- log4j.appender.R.Append=true
- #日志输出信息格式类型
- log4j.appender.R.layout=org.apache.log4j.PatternLayout
- #日志输出信息格式为 换行、换行、日期、优先级、[类名]、日志信息、换行
- log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n
#定义DEBUG优先级,R为日志输出目的的 log4j.rootLogger=DEBUG, R #设置日志输出类型,为文件类型 log4j.appender.R=org.apache.log4j.FileAppender #设置日志文件名my.log log4j.appender.R.file=my.log #每次在文件尾写入新的日志信息 log4j.appender.R.Append=true #日志输出信息格式类型 log4j.appender.R.layout=org.apache.log4j.PatternLayout #日志输出信息格式为 换行、换行、日期、优先级、[类名]、日志信息、换行 log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n
运行吧,出错了,恭喜你成功了,去TestLog目录下寻找my.log日志信息吧
以后再任何需要记录日志的地方只要使用下面语句就行了 Log log= Log.getLogger(); log.logger.error("something u like to record");
记录日志就是这么简单,不过你可以有其他的需要:
我要将日志发到邮箱 我要将日志写到数据库 我要每天的日志自动归档 ……
这些都可以通过修改配置log4j.properties配置文件来实现 以下是配置文件的语法
1. log4j.rootLogger = [level],appenderName,appenderName... 其中,level是日志记录的优先级,从高到低分别为FATAL ERROR WARN INFO DEBUG 。当 你定义一个级别,只有等于或者高于这个基本的才进行处理。 可选的All打印所有日志,OFF 关闭所有日志输出。 appenderName用于指定日志信息输出目的地,可以指定多个
2.配置appender
类型有以下几种 org.apache.log4j.jdbc.JDBCAppender 存入数据库 org.apache.log4j.net.SMTPAppender 发送到指定邮箱 net.cybercorlin.util.logger.appender.IMAppender 自定义类型 org.apache.log4j.ConsoleAppender 控制台 org.apache.log4j.FileAppender 文件 org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件 org.apache.log4j.RollingFileAppender 文件达到指定大小的时候产生一个新的文件 org.apache.log4j.WriterAppender 将日志信息以流格式发送到任意指定的地方 *************可以参照文章后面从网上摘抄的例子************
3.配置日志信息格式Layout 有以下几种 org.apache.log4j.HTMLLayout HTML表格形式 org.apache.log4j.PatternLayout 自定义的布局(下面将见到这么自定义配置) org.apache.log4j.SimpleLayout 只包含日志信息基本和信息的字符信息 org.apache.log4j.TTCCLayout 包括日志产生时间、线程、类别等信息
4.自定义的布局中用到的格式化日志信息 采用跟C语言中printf的方式,参数有 %m 输出代码中指定的信息 如 log.error("error") %p 输出优先级 就是上面提到的DEBUG,INFO等 %c 输出所在类的全名 %r 输出自应用启用到输出该log信息耗费的时间(毫秒) %t 输出产生该日子事件的线程名 %n 输出换行符号 Windows平台为 "rn",unix平台“n" %d 输出日志时间点 默认格式是ISO8601 可以自定义格式,比如%d{yyy MM dd hh:mm:ss,sss}
在程序中使用log4j 记住,很简单,就两步骤,相信我,没错的:)
1.导入包 import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator;
2.获取log实例 Logger logger = Logger.getLogger