- 浏览: 157933 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (130)
- Database (5)
- JavaSE (23)
- JavaScript (11)
- Struts2 (15)
- Hibernate (11)
- Spring (16)
- Linux (4)
- Jquery (3)
- Tools (12)
- Jsp (7)
- 杂谈 (9)
- WEB Project (10)
- WebService (16)
- maven (2)
- android (1)
- memcache (2)
- 网络通信 (4)
- solr (1)
- cxf (7)
- powerdesigner (1)
- jxls (1)
- springmvc (1)
- nosql (1)
- node.js (0)
- thrift (0)
- REST (1)
- tag (1)
最新评论
1. log4j输出多个自定义日志文件
log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?其实只要在现有的log4j基础上稍加配置即可轻松实现这一功能。
先看一个常见的log4j.properties文件,它是在控制台和myweb.log文件中记录日志:
log4j.rootLogger=DEBUG, stdout, logfile
log4j.category.org.springframework=ERROR
log4j.category.org.apache=INFO
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${myweb.root}/WEB-INF/log/myweb.log
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
如果想对不同的类输出不同的文件(以cn.com.Test为例),先要在Test.java中定义:
private static Log logger = LogFactory.getLog(Test.class );
然后在log4j.properties中加入:
log4j.logger.cn.com.Test = DEBUG, test
log4j.appender.test =org.apache.log4j.FileAppender
log4j.appender.test .File=${myweb.root}/WEB-INF/log/test.log
log4j.appender.test .layout=org.apache.log4j.PatternLayout
log4j.appender.test .layout.ConversionPattern=%d %p [%c] - %m%n
也就是让cn.com.Test 中的logger使用log4j.appender.test 所做的配置。
但是,如果在同一类中需要输出多个日志文件呢?其实道理是一样的,先在Test.java中定义:
private static Log logger1 = LogFactory.getLog("myTest1 ");
private static Log logger2 = LogFactory.getLog("myTest2 ");
然后在log4j.properties中加入:
log4j.logger.myTest1 = DEBUG, test1
log4j.appender.test1 =org.apache.log4j.FileAppender
log4j.appender.test1 .File=${myweb.root}/WEB-INF/log/test1.log
log4j.appender.test1 .layout=org.apache.log4j.PatternLayout
log4j.appender.test1 .layout.ConversionPattern=%d %p [%c] - %m%n
log4j.logger.myTest2 = DEBUG, test2
log4j.appender.test2 =org.apache.log4j.FileAppender
log4j.appender.test2 .File=${myweb.root}/WEB-INF/log/test2.log
log4j.appender.test2 .layout=org.apache.log4j.PatternLayout
log4j.appender.test2 .layout.ConversionPattern=%d %p [%c] - %m%n
也就是在用logger时给它一个自定义的名字(如这里的"myTest1 "),然后在log4j.properties中做出相应配置即可。别忘了不同日志要使用不同的logger(如输出到test1.log 的要用logger1 .info("abc"))。
还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?别急,这里有个开关:
log4j.additivity .myTest1 = false
它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方啦!注意这里的"myTest1 "是你在程序中给logger起的那个自定义的名字!
如果你说,我只是不想同时输出这个日志到log4j.rootLogger所配置的logfile中,stdout里我还想同时输出呢!那也好办,把你的log4j.logger.myTest1 = DEBUG, test1改为下式就OK啦!
log4j.logger.myTest1 =DEBUG, test1, stdout
2.动态配置路径
若程序需要的日志路径需要不断的变化,而又不可能每次都去改配置文件,那就要采取两种方法。
第一种
log4j的配置文件支持windows的环境变量,格式类似velocity:${env},那我们就用环境变量表示可能会变化的路径。上文已使用“log4j.appender.test1 .File=${myweb.root}/WEB-INF/log/test1.log ”。
第二种
这种方法是不用配置文件,而是在程序里用代码配置,代码是活的,所以路径肯定可以写活。示例如下:
- Logger myTest = Logger.getLogger( "myTest" );
- Layout layout = new PatternLayout( "%d %p [%c] - %m%n" );
- Appender appender = new FileAppender(layout, logFilePath);
- myTest.addAppender(appender);
附:ConversionPattern参数的格式含义
%c 输出日志信息所属的类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
%f 输出日志信息所属的类的类名
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名
发表评论
-
Java编程中“为了性能”尽量要做到的一些地方
2012-07-04 14:44 6471.慎用synchronized,尽量减小synchroniz ... -
利用Session防止表单重复提交
2011-12-13 18:36 11771 由于服务器缓慢或者 ... -
java format(MessageFormat)
2011-12-06 17:20 767java.text.Format |__java. ... -
java 主线程等待子线程执行完成后再执行
2011-12-06 09:47 3354原文:http://www.jiacheo.org/blog ... -
Ognl/MVEL/Aviator/JSEL 四种表达式引擎执行效率对比
2011-11-24 10:33 3002http://jindw.iteye.com/blog/732 ... -
java模拟javascript的encodeURI方法
2011-10-27 15:52 2938import java.io.UnsupportedEncod ... -
3种下载文件程序的思考,为何使用NIO进行异步网络通讯
2011-10-08 14:37 694原文链接:http://suhuanzheng7784877 ... -
cglib 动态代理
2011-08-12 10:35 742cglib is a powerful, high perfo ... -
java7 新特性
2011-08-10 10:48 732原文链接:http://www.iteye ... -
Java版短网址(ShortUrl)的算法
2011-06-09 10:42 2746最近,我的项目中需要用到短网址(ShortUrl)的算法,于是 ... -
设计模式学习——适配器模式
2011-06-07 10:30 748某个类拥有我们所 ... -
用spring做一个javaMail功能的例子
2011-05-16 09:37 1220前言:项目中要做一个发送邮件的功能,在网上搜了一些代码,说的都 ... -
UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
2010-10-14 18:38 871今天看到一篇好文,觉得还不错,褪去的记忆被唤醒:http:/ ... -
动态代理
2010-07-13 11:11 740http://www.iteye.com/topic/7103 ... -
ASCLL,Unicode 和 UTF-8
2010-05-15 13:36 14621.Ascll 算是比较早的编码,七位二进制数表示,当然在 ... -
String 详解
2010-05-12 10:29 800解析Java中的String对象的数据类型 1. 首先S ... -
判断数据的类型
2010-05-04 15:24 827// 字符类型 String if (pramets.get( ... -
关于ThreadLocal模式的体会
2010-03-18 11:00 1199本文转至::http://www.iteye.com/topi ... -
javaClassLoader类加载器详解<转>
2010-03-12 14:43 1038由于一个JDBC的基本封装 ... -
properties 文件 读写
2010-03-10 10:18 926import java.io.BufferedInputStr ...
相关推荐
CPU 技术温故而知新.pdf
❀设计模式温故而知新❀
【温故而知新】Document对象
【温故而知新】JavaScript事件循环
【温故而知新】HTML5 WebSocket
【温故而知新】JavaScript数据类型
【温故而知新】JavaScript作用域
【温故而知新】JavaScript的事件模型
【温故而知新】JavaScript的DOM操作
【温故而知新】JavaScript数据结构详解
【温故而知新】JavaScript函数式编程
【温故而知新】HTML5新标签canvas、MathML
【温故而知新】JavaScript的防抖与节流
【温故而知新】JavaScript的类型转换机制
【温故而知新】HTML5 服务器发送事件
【温故而知新】HTML5 应用程序缓存
【温故而知新】HTML5的Web Worker
【温故而知新】JavaScript的继承方式有那些
【温故而知新】HTML5的Video:Audio
【温故而知新】HTML表格table:列表ul