# re: log4j和commons.logging日志记录的使用方法

2008-03-11 14:08

芦苇

一 最好与commons-logging一起用,why?

1.标准接口,即使将来脱离了log4j也一样用

2.简化了编码,减少耦合度:不需在代码中指定log4j配制文件位置,代码中不需要引用log4j的包

3.基本所有框架都是这么用的。。。。。。(我相信群众)

附加提供一下commons-logging寻找配置文件的顺序(从别人那抄的)

1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;

2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;

3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;

4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);

5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

二 具体实现

1.把commons-logging的jar加到classpath中

2.把log4j的jar加到classpath中

3.在classpath的根目录下,建立log4j.properties(必须是这个地方,必须叫这个名,才不用特殊配置),可以直接复制后边的模板

4.在需要log的类中:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

private static Log log = LogFactory.getLog(xxxx.class);

为什么要使用static?因为避免产生多个实例

为什么不使用this.class?因为是static不能用this(我经常犯这个错误。。。)

为什么不使new XXXX().getClass()?因为。。。。你猜呢?

5.根据实际需要log.debug()、log.info()、log.warn()、log.error()、log.fatal() 就可以输出不同等级的log

三 log的等级

1.为什么需要等级?写代码的时候可能需要很多调试信息,运行的时候可能需要显示提示信息,如果在服务器上发生严重错误的时候,可能需要给管理员发邮件。这种:调试,提示,错误就是等级。

2.都有什么等级? 调试(DEBUG)

3.怎么用? log.debug() log.info() log.warn() log.error() log.fatal()依次对应上边的等级

四 log4j的配制

1.基本参数解释:

⑴全局配制

log4j.rootLogger = [ level ] , appenderName, appenderName,..........appenderName

★log4j.rootLogger的意思可以理解为:根log或者所有的log

★level就是输出级别,只能设置一个值。

·关于等级,前边已经说过了有5种,他们之间的关系可以理解为:

调试(DEBUG):包含调试(DEBUG)、信息(INFO)、警告(WARN)、错误(ERROR)、致命错误(FATAL)

信息(INFO):包含信息(INFO)、警告(WARN)、错误(ERROR)、致命错误(FATAL)

警告(WARN):包含警告(WARN)、错误(ERROR)、致命错误(FATAL)

错误(ERROR):包含错误(ERROR)、致命错误(FATAL)

致命错误(FATAL):只有他自己

这样,如果log4j.rootLogger = INFO,那么 INFO,WARN,ERROR,FATAL就全部会被输出

如果log4j.rootLogger = ERROR,那么ERROR,FATAL就全部会被输出

★appenderName就是记录的目标,目标可以多个,中间用『,』分割,appenderName是自己定义的,换句话说,名字是随便起的,起了名之后,就需要在下边设定具体配制

总结一下这部分,比如说有这么一句log4j.rootLogger = INFO , F1,F2那么就以为着要将所有INFO,WARN,ERROR,FATAL的log全部输出到F1,F2上。F1,F2是什么?往下看。。。。

⑵具体配制

log4j.appender.F1=org.apache.log4j.ConsoleAppender

log4j.appender.F1.layout=org.apache.log4j.PatternLayout

log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

★log4j.appender.F1=org.apache.log4j.ConsoleAppender的意思就是:将F1设置为控制台输出

·还可以设置成什么?

org.apache.log4j.ConsoleAppender(控制台),

org.apache.log4j.FileAppender(文件),

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

★log4j.appender.F1.layout=org.apache.log4j.PatternLayout的意思就是:将F1的输出布局设置为自定义输出布局。

·还可以设置成什么?

org.apache.log4j.HTMLLayout(以HTML表格形式布局)

org.apache.log4j.xml.XMLLayout(以XML形式布局)

org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

★log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n既然上边定义的是自定义输出布局,那么就要定义一下具体输出什么样了~~上边的%c %p %m 等以%开头的都是模式字符串,除了模式字符串外[]-空格等这些字符会按照原样显示。

·模式字符串解释:

%m:消息本身

%p:消息的级别INFO,WARN,ERROR。。。

%r:从程序开始执行到当前日志产生时的时间间隔(微秒)

%c:输出当前日志动作所在的category名称。例如:如果category名称是"a.b.c","%c{2}"将会输出"b.c". {2}意谓着输出“以点分隔开的category名称的后两个组件”,如果 {n}没有,将会输出整个category名称.

%t:输出当前线程的名称

%x:输出和当前线程相关联的NDC,尤其用到像java servlets这样的多客户多线程的应用中。

%n:输出平台相关的换行符。

%%:输出一个"%"字符

%d:输出日志产生时候的日期,当然可以对日期的格式进行定制。例如:%d{HH:mm:ss,SSSS}或者是%d{dd MMM yyyy HH:mm:ss,SSSS},如果没有指定后面的格式,将会输出ISO8601的格式。

%l:输出位置信息,相当于%C.%M(%F:%L)的组合。

%C:输出日志消息产生时所在的类名,如果类名是“test.page.Class1”%C{1}表示输出类名"Class1",%C{2}输出"page.Class1",而%C则输出"test.page.Class1"。

%M:输出日志消息产生时的方法名称

%F:输出日志消息产生时所在的文件名称

%L:输出代码中的行号

·可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。

2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。

3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。

4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

总结一下,现在来我们所配制的F1的全部内容

·我们把它配制成了屏幕输出

·输出的布局为:自定义布局

·我们又定义了自定义布局的格式:日期时间(格式为:yyyy-MM-dd HH:mm:ss,SSS)[产生该日志的包名类名方法名] [等级] 信息+回车

如果想配制F2为每天产生一个日志文件,并且保存为xml,就这么写:

log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender

log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout

这样就可以了吗?当然不是,既然保存为文件。。至少要指定一个文件名吧

log4j.appender.F2.File=c:/logs/log.xml

可以了吗?可以运行了。。。但是。。既然每天都产生一个文件,那么前一天的怎么办呢?

log4j.appender.F2.DatePattern=yyyyMMdd'.xml.back'

这样log4j会在第一次产生今天的log的同时,将昨天的log备份为 log文件名.扩展名yyyyMMdd.xml.back。对应我们这个文件,今天的log到明天有新log产生的时候,就会变为log.xml20070420.xml.back

这样的参数到底有多少?常用的有:

★ConsoleAppender选项

·Threshold=WARN:指定日志消息的输出最低层次。

·ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

·Target=System.err:默认情况下是:System.out,指定输出控制台

★FileAppender 选项

·Threshold=WARN:指定日志消息的输出最低层次。

·ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

·File=mylog.txt:指定消息输出到mylog.txt文件。

·Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

★RollingFileAppender 选项

·Threshold=WARN:指定日志消息的输出最低层次。

·ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

·File=mylog.txt:指定消息输出到mylog.txt文件。

·Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

·MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。

·MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

★DailyRollingFileAppender 选项

·Threshold=WARN:指定日志消息的输出最低层次。

·ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

·File=mylog.txt:指定消息输出到mylog.txt文件。

·Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

·DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:

1)'.'yyyy-MM: 每月

2)'.'yyyy-ww: 每周

3)'.'yyyy-MM-dd: 每天

4)'.'yyyy-MM-dd-a: 每天两次

5)'.'yyyy-MM-dd-HH: 每小时

6)'.'yyyy-MM-dd-HH-mm: 每分钟

★PatternLayout 选项

·ConversionPattern=%m%n :指定怎样格式化指定的消息。

★HTMLLayout 选项

·LocationInfo=true:默认值是false,输出java文件名称和行号

·Title=my app file: 默认值是 Log4J Log Messages.

★XMLLayout 选项

·LocationInfo=true:默认值是false,输出java文件和行号

现在来看一下我们完整的第一个配制文件:

========================================================================================

log4j.rootLogger = INFO,F1,F2

log4j.appender.F1=org.apache.log4j.ConsoleAppender

log4j.appender.Threshold=DEBUG

log4j.appender.F1.Target=System.out

log4j.appender.F1.layout=org.apache.log4j.PatternLayout

log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender

log4j.appender.F2.File=c:/logs/log.xml

log4j.appender.F2.DatePattern=yyyyMMdd-HH'.xml.back'

log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout

========================================================================================

编段代码看看效果

========================================================================================

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class Main{

private static Log log = LogFactory.getLog(Main.class);

public static void main(String[] args) throws Exception{

log.info("info");

log.debug("debug");

log.warn("warn");

log.error("error");

}

}

========================================================================================

运行效果

========================================================================================

2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[INFO] info

2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[WARN] warn

2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[ERROR] error

========================================================================================

并且在c:/logs/下有log.xml生成,里边的内容为:

========================================================================================

========================================================================================

仔细看一下会发现,虽然我们在代码里写了log.debug("debug")但是debug并没有出现在log中,这是因为我们配置文件中,定义了log的等级为INFO,debug的等级小于info,所以不会显示,而warn,error的大于info,所以也会被显示出来

2.根据package生成不同的log文件

⑴配置

log4j.logger.cn.yyun.test.abc=INFO,abc2,abc1

log4j.appender.abc2=org.apache.log4j.ConsoleAppender

log4j.appender.abc2.layout=org.apache.log4j.PatternLayout

log4j.appender.abc2.layout.ConversionPattern=abc:[%p] %m%n

log4j.appender.abc1=org.apache.log4j.DailyRollingFileAppender

log4j.appender.abc1.File=C:/logs/abc.log

log4j.appender.abc1.DatePattern='.'yyyyMMdd

log4j.appender.abc1.layout=org.apache.log4j.PatternLayout

log4j.appender.abc1.layout.ConversionPattern=%d %r [%t] %5p - %m%n

log4j.logger.cn.yyun.test.def=INFO,def

log4j.appender.def=org.apache.log4j.ConsoleAppender

log4j.appender.def.layout=org.apache.log4j.PatternLayout

log4j.appender.def.layout.ConversionPattern=def: [%p] %m%n

把logger.cn.yyun.test.abc换成需要的package就可以了(整个log4j配制文件中只有这些就可以了 )。但是这样会有另一个问题,如果cn.yyun.test.Main这个类中,如果有log操作,会报告:log4j:WARN No appenders could be found for logger (cn.yyun.test.Main).所以要加上log4j.rootCategory=INFO,F1 这样所有的log都会被纪录了。。但是这样又做之后:cn.yyun.test.def里的log,会同时出现在def和F1中,cn.yyun.test.abc里的log,会同时出现在abc1,abc2和F1中。。。。。所以定义的时候一定要规划好。

⑵制定package的log等级

log4j.logger.org.hibernate=DEBUG

回复  更多评论

java common log使用,log4j和commons.logging日志记录的使用方法相关推荐

  1. 操作系统服务:logging日志记录模块

    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪. 在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4c ...

  2. 获取mysql可行方法_Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法...

    <Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法>要点: 本文介绍了Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法,希望对您有用.如果有 ...

  3. apache log4j_Apache log4j是领先的日志记录框架

    apache log4j 根据 零周转的调查中, Apache log4j是领先的Java日志记录框架. 这实际上是一个非常有趣的调查. 它显示SLF4J最常用作伐木外墙,占61%. 但是,它似乎最常 ...

  4. Apache log4j是领先的日志记录框架

    根据 从零周转开始的调查中, Apache log4j是领先的Java日志记录框架. 这实际上是一个非常有趣的调查. 它显示SLF4J最常用作伐木外墙,占61%. 但是,它似乎最常与Apache Lo ...

  5. java 核型技术 卷2 pdf_SpringBoot 的 slf4j日志记录

    需求:项目中我们必然会使用日志记录,哪个日志框架更好用? 1.强烈推荐SLF4J: SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案, ...

  6. python Logging日志记录模块详解

    写在篇前   logging是Python的一个标准库,其中定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统.Python logging 的配置由四个部分组成:Logger.Handl ...

  7. java gc log调优_Java 开启 gc 日志

    构建一个 jar 包程序 使用 Spring Boot 构建一个简单的 web 程序,可以直接使用 java -jar 来启动. @RestController @RequestMapping(&qu ...

  8. jmeter里看java的log,(jmeter笔记)打印日志

    Bean Shell常用内置变量 JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log ...

  9. Java日志记录函数调用栈方法

    关于getStackTrace() public StackTraceElement[] getStackTrace() 返回一个表示该线程堆栈转储的堆栈跟踪元素数组.如果该线程尚未启动或已经终止,则 ...

最新文章

  1. 图片验证码识别 python web_Python web中实现验证码图片
  2. linux(Ubuntu)查看环境变量指向的路径
  3. ID3决策树中连续值的处理+周志华《機器學習》图4.8和图4.10绘制
  4. JAM - get self detail information
  5. Jerry Wang的CRM中间件培训 Middleware
  6. 《Head First设计模式》第七章-适配器模式、外观模式
  7. java while语句_Java while循环
  8. 网页静态服务器-3-使用类
  9. Git笔记(10) 别名
  10. 【英语学习】【Level 07】U07 Stories of my Life L5 I shouldn't have said that
  11. php单独输出每个单词,PHP:在特定短语/单词之后搜索文本文件并输出
  12. Ambari架构源码解析
  13. 文件标准标准IO与文件IO 的区别
  14. 分享插件 Web前端助手、Restlet Client、Adblock-Plus
  15. 4万字长文全面解读数据中台、数据仓库和数据湖
  16. 派森诺细菌完成图标准分析轻松发文
  17. 关于 Google play 上架的缺失 64 位版本问题
  18. JTAG、SBW、BSL 三种接口的区别
  19. TRIMMEAN函数实例:评委打分计算最后得分
  20. Python实现手机号自动判断男女性别

热门文章

  1. 低代码开发平台是什么?
  2. 腾讯游戏运营总监酒后吹批:运维工程师这些知识点都不会?赶紧找个地埋了吧!
  3. FSL处理DTI数据详细流程(本人亲身经历的流程)
  4. 强大的文件管理利器-恒辉通用文件管理工具
  5. Linux系统制作ios镜像Mondo Rescue工具安装及使用
  6. 【微信小程序开发】缓存Storage的存入与获取
  7. 机器人编程和少儿编程哪个难
  8. 四平方和python_成都房价现在多少?和北京差距很大吗?Python爬取了四万套房源!...
  9. 使用hibernate映射oracle两个表空间的表,Hibernate每个具体类一张表映射(使用XML)
  10. 尼康d3200与智能设备 (android) 连接,,尼康D3200有WIFI功能吗