commons-logging日志系统

日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息    是寸步难行的。所以在系统加入日志是必须的。

  • 最原始的日志方式,就是在程序的适当地方添加System.out.println()方法,但是带来    的问题是,系统稳定后,日志太大,如果要减少日志量,就需要重新修改程序,虽然只    是注释掉System.out.println()方法。但是万一系统再次出错,又要改。
  • commons-logging提供分级日志功能,相当于把System.out.println()方法加强了,原来    是一定输出到控制台,现在commons-logging有6级日志,但是apache建议使用4级,即    ERROR、WARN、INFO、DEBUG。什么情况下输出日志由程序中写日志的方法决定,输出什    么级别以上的日志和输出到哪里由配置文件决定。
  • 使用commons-logging如下:
//导入类
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestLog
{
    //获取以当前类为参数的日志对象
    private static Log log = LogFactory.getLog(TestLog.class);
    public static void main(String[] args){
        //输出4种不同级别的日志
        log.debug("111");
        log.info("222");
        log.warn("333");
        log.error("444");
    }
}
  • 当然还要配置commons-logging.properties文件,其中定义输出哪个级别以上的日志。
  • 好像这就完了,和log4j没啥关系。那么为什么一般系统都会使用commons-logging和    log4j两个包来记录日志呢?
  • 原因就是commons-logging的输出功能比较弱,也就是输出格式和输出设备选择有限,只    有原生输出类org.apache.commons.logging.impl.SimpleLog。但是它提供了一个通用的    日志接口org.apache.commons.logging.log,让其他的包来实现复杂的输出。其中就有    Jdk14Logger, Log4JLogger,前面是jdk1.4之后加入的,后面就是log4j中的类。
  • log4j也可以直接像commons-logging一样在程序中定义输出信息,然后再配置文件中定    义输出级别,但是这样做就会使程序唯一的和log4j绑定(如果你一定要单独使用    log4j,那么也是可以的),而且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;
  • 所以,在前面程序的基础上,只要导入log4j的包,则commons-logging会自动使用    log4j作为输出类,程序不需要任何改动,但是注意:log4j的配置文件    log4j.properties对Log4j来说是必须的。如果classpath中没有该配置文件,或者配置    不对,将会引发运行时异常。所以下面介绍log4j.properties的配置。

使用commons-logging和log4j记录日志

commons-logging下载
commons-logging是Apache下的开源项目。commons-logging.jar的下载地址为:http://commons.apache.org/proper/commons-logging/download_logging.cgicommons-logging。commons-logging的目的是为“所有的Java日志实现”提供一个统一的接口,使项目与日志实现工具解耦。

为什么要使用commons-logging+log4j?
commons-logging和log4j都是Apache下的开源项目。commons-logging的目的是为“所有的Java日志实现”提供一个统一的接口,使项目与日志实现工具解耦,它自身的日志功能比较弱(只有一个简单的 SimpleLog),所以一般不会单独使用它。Log4j的功能非常强大,是目前最主流的java日志工具。结合使用两者可以避免使项目与log4j紧密耦合,用户可以轻松切换到其他日志工具,同时又可以使用log4j的强大功能。

commons-logging如何自动选择适当的日志实现工具?
我们在使用commons-logging+日志实现工具时,我们的代码只需要和commons-logging打交道,由commons-logging去选择适当的日志实现工具。这里我们看一下commons-logging是如何去选择实现工具的:
-首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
上面这个配置,commons-logging会使用commons-logging的SimpleLog
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
这个配置,commons-logging就会选择使用log4j
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
这个配置,commons-logging会选择jdk的logger
-如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类
-否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类。
-否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类)。
-否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog。
可见,commons-logging总是能找到一个日志实现类,并且尽可能找到一个最合适的日志实现类。
为了简化配置,我们可以不使用commons-logging的配置文件,也不设置commons-logging相关的环境变量,只需将log4j的包放入classpath就可以了,这样就可以完成commons-logging与log4j的结合。如果以后不想使用log4j,只需将log4j的包 从classpath中移除就可以了。

如何在代码中输出日志?
-导入所需commons-logging的类
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类变量
private static Log log = LogFactory.getLog(ClassName.class);
-使用静态类变量输出日志信息
为了方便的控制日志输出,把日志分成了不同的级别,从低到高分别是调试,信息,警告,错误,致命错误。这样我们可以通过log4j的配置决定只输出某个级别以上的日志。例如,在开发时我们将debug(调试)及以上的日志全部输出,而在项目正常运行时,设置为只输出warn(警告)及以上的日志。
//输出调试级别的日志信息
log.debug("debug");
//输出信息级别的日志信息
log.info("information");
//输出警告级别的日志信息
log.warn("warning");
//输出错误级别的日志信息
log.error("error");
//输出致命错误级别的日志信息

log.fatal("fatal");
正因为我们可以通过配置文件来设置日志输出的级别,所以写代码时我们并不知道某条日志是不是会真正输出,比如
log.debug("debug");
在设置了日志输出级别为info(信息)或以上的情况下,是不会被真正输出的。这种情况下,为了节省资源,我们可以在输出一条日志前加一个判断语句,判断该日志确实会被输出的情况下才去执行输出代码,如下所示
//输出调试级别的日志信息
if(log.isDebugEnabled()){
log.debug("debug");
}
//输出信息级别的日志信息
if(log.isInfoEnabled()){
log.info("information");
}
//输出警告级别的日志信息
if(log.isWarnEnabled()){
log.warn("warning");
}
//输出错误级别的日志信息
if(log.isErrorEnabled()){
log.error("error");
}
//输出致命错误级别的日志信息
if(log.isFatalEnabled()){
log.fatal("fatal");
}

时间: 2024-08-06 03:39:54

commons-logging日志系统的相关文章

日志组件系列:(2)commons logging和log4j实战

(1).下载组件,引入jar包 (2).配置 (3).使用API 1.下载组件,引入jar包 jar包 下载地址 log4j-1.2.17.jar http://logging.apache.org/log4j/1.2/ commons-logging-1.2.jar http://commons.apache.org/proper/commons-logging/download_logging.cgi 2.配置 在项目的src目录下添加log4j.properties文件,配置如下: log

Spring使用SLF4J代替Commons Logging写日志

项目的日志更换成slf4j和logback后,发现项目无法启动.错误提示java.lang.ClassNotFoundException: org.apache.commons.logging.Log,如图所示.原因是Spring默认使用commons logging写日志,需要桥接工具把日志输入重定向到slf4j.在项目中添加commons logging到slf4j的桥接器jcl-over-slf4j即可解决该问题. <dependency> <groupId>org.slf4

Java日志系统

0. 概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界中,有很多的日志工具库来实现日志功能,避免我们重复造轮子,下面我们就来逐一了解日志工具. 1. 最原始的日志记录方式 最早期的Java程序中,使用System.out.println()把需要显示的内容打印到屏幕,这种方式使用起来非常简单,但是缺点却是非常多的: - 输出内容不可控 - 可读性差 - 大量的IO操作使程序变慢 public class SystemOutPrintln { public s

java日志框架与日志系统

日志框架:提供日志调用的接口,实际的日志输出委托给日志系统实现. JCL(Jakarta Commons Logging):比较流行的日志框架,很多框架都依赖JCL,例如Spring等. SLF4j:提供新的API,初衷是配合Logback使用,但同时兼容Log4j. 日志系统:负责输出日志 Log4j:较早的日志系统,可以单独使用,也可配合日志框架JCL使用 Logback:Log4j的替代产品,需要配合日志框架SLF4j使用 JUL(java.util.logging):JDK提供的日志系统

Apache Commons logging简介和使用

本章节内容主要来自网络和整理. Apache Commons Logging,又叫做JakartaCommons Logging (JCL),他提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具.它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具.用户被假定已熟悉某种日志实现工具的更高级别的细节.JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK等,进行了

配置Tomcat的日志系统

成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格式,而且是每天以yyyy-mm-dd日期格式命名的日志文件. 这个以前让自己费神了一段时间,近期花了两天时间总算配置成功了!只是配置成功的是tomcat的,不是单个webapp的,现把步骤记录下来,晚上再配置webapp的.先写一步一步的操作,后面再解说一些log4j的关键知识点. 二.一步一步配置

面试题:应用中很多jar包,比如spring、mybatis、redis等等,各自用的日志系统各异,怎么用slf4j统一输出?

一.问题概述 如题所说,后端应用(非spring boot项目)通常用到了很多jar包,比如spring系列.mybatis.hibernate.各类连接数据库的客户端的jar包.可能这个jar包用的是logback.那个用的是log4j.那个又是log4j2, 这时候,怎么才能保证各jar包的日志都能输出,且能以统一的格式输出呢? 为什么要强调非spring boot项目,可参考第四节. 二.几种日志框架的简单介绍 来源:https://juejin.im/post/5a7c5d5751882

【转】 为什么阿里巴巴禁止直接使用日志系统中的 API?

作为Java程序员,我想很多人都知道日志对于一个程序的重要性,尤其是Web应用.很多时候,日志可能是我们了解应用程序如何执行的唯一方式. 所以,日志在Java Web应用中至关重要,但是,很多人却以为日志输出只是一件简单的事情,所以会经常忽略和日志相关的问题. 在接下来的几篇文章中,我会来介绍介绍这个容易被大家忽视,但同时也容易导致故障的知识点. Java语言之所以强大,就是因为他很成熟的生态体系.包括日志这一功能,就有很多成熟的开源框架可以被直接使用. 首先,我们先来看一下目前有哪些框架被广泛

SpringBoot 日志系统

日志框架 开发一个大型系统的简易步骤: system.out.println("..") 将关键的数据在控制台输出 框架记录系统的一些运行时的信息,---日志框架. 牛逼的功能---异步模式,自动归档等等... 进一步发展,卸掉旧得框架,并且修改之前的API, JDBC 数据库驱动,JDC 数据库驱动: 写一个统一的接口层: 日志门面,(日志的一个抽象层) 给项目导入具体的日志实现,之前的框架都是实现的抽象层 主流的日志框架 JUL.JCL.Jboss-logging.logback.