java 日志技术汇总(log4j , Commons-logging,.....)

前言

在java 中实现记录日志的方式有很多种,

1. 最简单的方式,就是system.print.out ,err 这样直接在控制台打印消息了。

2. java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写日志了。

3. log4j , 最强大的记录日志的方式。 可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。

4. commons-logging, 最综合和常见的日志记录方式, 经常是和log4j 结合起来使用。

java.util.logging --JDK 记录日志方式

system.print 这就不用多说了,

直接看一下java api 中 logging 日志的使用例子:

[java] view plaincopy

  1. /**
  2. * @author oscar999
  3. * @date 2013-8-1
  4. * @version V1.0
  5. */
  6. package com.oscar999.log;
  7. import java.io.IOException;
  8. import java.util.Date;
  9. import java.util.logging.FileHandler;
  10. import java.util.logging.Formatter;
  11. import java.util.logging.Level;
  12. import java.util.logging.LogRecord;
  13. import java.util.logging.Logger;
  14. public class TestLogJava {
  15. public static void main(String[] args) throws IOException{
  16. Logger log = Logger.getLogger("tesglog");
  17. log.setLevel(Level.ALL);
  18. FileHandler fileHandler = new FileHandler("testlog.log");
  19. fileHandler.setLevel(Level.ALL);
  20. fileHandler.setFormatter(new LogFormatter());
  21. log.addHandler(fileHandler);
  22. log.info("This is test java util log");
  23. }
  24. }
  25. class LogFormatter extends Formatter {
  26. @Override
  27. public String format(LogRecord record) {
  28. Date date = new Date();
  29. String sDate = date.toString();
  30. return "[" + sDate + "]" + "[" + record.getLevel() + "]"
  31. + record.getClass() + record.getMessage() + "\n";
  32. }
  33. }

这里是在eclipse 下code 和测试的。

首先定义一个Logeer的实例,并设置log 的级别,接着添加一个fileHander ,就是把日志写到文件中。在写入文件的时候,定义一个 LogFormatter对日志进行格式的渲染。

默认状况下, 日志会打印到控制台。添加filehandler 后, 会同时写入文件。 如不指定路径,日志文件将位于项目根路径下。

log4j 记录日志方式

log4j 是apache 提供的记录日志的jar 档。

下载路径:

http://logging.apache.org/log4j/1.2/download.html

这里要做的事情稍微要多一些:

1. 下载log4j 的jar 包,放入项目的lib 包中(添加到项目的build path中)。

2.  配置log4j.properties, 并放入项目的根路径下.(也可以放入其他路径,在读的时候需要指定)

看一下一个配置实例:

[html] view plaincopy

  1. log4j.rootLogger=debug,stdout,logfile
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
  5. log4j.appender.logfile=org.apache.log4j.RollingFileAppender
  6. log4j.appender.logfile.File=logfile.log
  7. log4j.appender.logfile.MaxFileSize=512KB
  8. log4j.appender.logfile.MaxBackupIndex=3
  9. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
  10. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

这里指定了日志输出的级别 debug.

stdout, logfile 指定日志输出的目的地。 这两个名字可以随便取,比如 A, 或B都可以。 实际的配置是  org.apache.log4j.ConsoleAppender 和RollingFileAppender  用于指定是控制台还是文件。

另外还指定了输出的格式, 已经产生的file 的规则。

3. 测试java 文件

[java] view plaincopy

  1. /**
  2. * @author oscar999
  3. * @date 2013-8-1
  4. * @version V1.0
  5. */
  6. package com.oscar999.log;
  7. import org.apache.log4j.Logger;
  8. import org.apache.log4j.PropertyConfigurator;
  9. public class TestLog4j {
  10. public static void main(String[] args) {
  11. // 1. create log
  12. Logger log = Logger.getLogger(TestLog4j.class);
  13. // 2. get log config file
  14. PropertyConfigurator.configure("log4j.properties");
  15. // 3. start log
  16. log.debug("Here is some DEBUG");
  17. log.info("Here is some INFO");
  18. log.warn("Here is some WARN");
  19. log.error("Here is some ERROR");
  20. log.fatal("Here is some FATAL");
  21. }
  22. }

配置稍显麻烦,但是code 时就简单多了。

commons-logging写日志方式

Commons-logging 也是Apache 提供的日志jar 档。

下载地址:

http://commons.apache.org/proper/commons-logging/download_logging.cgi

你有可能要问为什么有了log4j还有提供Commons-logging呢? 这两者有什么区别吗?

其实从Commons-logging这个名字就可以看出来, 这应该是一个日志的共用接口。实际上, 它的确是这样一个作用,

使用Commons-logging的LogFactory获取日志处理类时:

1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
如果在Tomact中可以建立一个叫 :CATALINA_OPTS 的环境变量 
给 他的 值 : - Dorg.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog - Dorg.apache.commons.logging.simplelog.defaultlog = warn 
3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

先使用第一种方式来看一个实例,配置commons-logging.properties, 使用log4j来记录日志。

注意, commons-logging 要配合log4j 记录日志,必须把log4j的jar 包也导入到项目中。

1. 导入log4j 和commons-logging的jar 包

2. 配置commons-logging.properties 和 log4j.properties, 放入项目的classpath下(也就是src目录下)

注意: 单独使用log4j 的时候,log4j.properties 默认是放在项目的根目录下。

log4j.properties 的内容和上面完全相同。

看一下commons-logging.properties  的配置

[html] view plaincopy

  1. org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

一句话,指定使用log4j

3. 测试代码:

[java] view plaincopy

  1. /**
  2. * @author oscar999
  3. * @date 2013-8-1
  4. * @version V1.0
  5. */
  6. package com.oscar999.log;
  7. import org.apache.commons.logging.Log;
  8. import org.apache.commons.logging.LogFactory;
  9. public class TestLogCom {
  10. static Log log = LogFactory.getLog(TestLog.class);
  11. public static void main(String[] args) {
  12. log.debug("Here is some DEBUG");
  13. log.info("Here is some INFO");
  14. log.warn("Here is some WARN");
  15. log.error("Here is some ERROR");
  16. log.fatal("Here is some FATAL");
  17. }
  18. }

除了使用log4j 之外, 还可以配置

-org.apache.commons.logging.impl.Jdk14Logger 使用JDK1.4。

-org.apache.commons.logging.impl.Log4JLogger 使用Log4J。

-org.apache.commons.logging.impl.LogKitLogger 使用 avalon-Logkit。

-org.apache.commons.logging.impl.SimpleLog common-logging自带日志实现类。它实现了Log接口,把日志消息都输出到系统错误流System.err 中。

-org.apache.commons.logging.impl.NoOpLog common-logging自带日志实现类。它实现了Log接口。 其输出日志的方法中不进行任何操作。

总结

以上有一条

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

项目同时导入log4j 和commons-logging的jar 包, 不需要配置commons-logging.properties ,只需要在classpath中配置 log4j.properties就可以使用log4j的方式记录日志。这也是目前用的比较多的记录日志的方式。

时间: 2024-11-02 15:33:15

java 日志技术汇总(log4j , Commons-logging,.....)的相关文章

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

MyEclipse运行的时候报错,菜鸟不理解是什么意思,最后找了一些资料才知道是因为缺少commons-logging.jar包 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.apache.commons.httpclient.HttpClient.<clinit>(HttpClient.java:66) at c

struts2与struts1整合,java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

原因:我往项目的WEB-INF/lib中导入了struts2基本的包,还有struts1的core包,以及struts2-strut1-plugin的包,但是没有导入commons-loggin-1.3.1这个包,如下图 我打开commons-loggin-1.3.1这个包看了一下,果然找到了这个组件的class文件 看到这个错误的时候,我感觉就应该i啊是commons-logging这个包没有添加导致的,添加上就好了 struts2与struts1整合,java.lang.NoClassDef

异常记录与处理 - java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

错误信息: 学习Spring,执行简单的单元测试程序时,产生以下异常: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:160) at org.springframework.context.su

Java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 解决方案

Spring3.1启动时报错: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.springframework.core.CollectionFactory.<clinit>(CollectionFactory.java:64) at org.springframework.core.SimpleAliasRegis

Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

1.错误描述 2014-7-12 0:38:57 org.apache.catalina.core.ApplicationContext log 信息: No Spring WebApplicationInitializer types detected on classpath 2014-7-12 0:38:57 org.apache.catalina.core.StandardContext listenerStart 严重: Exception sending context initia

Java日志管理:log4j、Commons-logging、slf4

1.log4j 概述 log4j是Apache的一个开源项目,主要是用来做Java开发中的日志管理工作.主要是由三个重要组件构成的.可管理日志的优先级.输出目的地以及输出格式等.它的配置文件主要有XML和properties两种,当然,也可以在程序里配置,但实际开发中一般使用properties文件. log4j的组件 1.1.日志信息的优先级(Level) 有7个日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL,级别从做到有一次降低. Off:关闭所有的日志记录

MyEclipse8.5集成Tomcat7时的启动错误:Exception in thread “main” java.lang.NoClassDefFoundError org/apache/commons/logging/LogFactory

今天,安装Tomcat7.0.21后,单独用D:\apache-tomcat-7.0.21\bin\startup.bat启动web服务正常.但在MyEclipse8.5中集成配置Tomcat7后,在MyEclipse启动Tomcat服务则出现如下错误提示: Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactoryat org.apache.catalina.star

Java日志介绍(2)-Log4j

Log4j是Apache的一个开源项目,官网地址为http://logging.apache.org/log4j/1.2/index.html.通过使用Log4j,可控制日志信息输出到控制台.文件.数据库等不同的地方:可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,可以更加细致的控制日志的生成过程.Log4j是曾经风靡一时的日志框架,但现在逐渐被新的日志框架所取代:Log4j2.logback.本文主要介绍下Log4j的使用方法,文中所使用到的软件版本:Java 1.8.0_191.

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法

解决方法 第一种方法:导入commons-logging.jar包 第二种方法,如果用的是maven项目,则直接在pom.xml中加入commons-logging依赖包,如下: <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </depend