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");
}
commons-logging日志系统的更多相关文章
- Python logging日志系统
写我小小的日志系统 配置logging有以下几种方式: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件, ...
- Python logging(日志)模块
python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...
- pyhton——logging日志模块的学习
https://www.cnblogs.com/yyds/p/6901864.html 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模 ...
- 函数式编程(logging日志管理模块)
本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日 ...
- 廖雪峰Java3异常处理-2断言和日志-3使用Commons Logging
Commons Logging是Apache创建的日志模块: 可以挂接不同的日志系统 可以通过配置文件指定挂接的日志系统 自动搜索并使用Log4j 如果Log4j不存在,使用JDK Logging(J ...
- Spring 使用 SLF4J代替 Commons Logging 写日志 异常
项目的日志更换成slf4j和logback后,发现项目无法启动.错误提示 Caused by: java.lang.NoClassDefFoundError: Lorg/apache/commons/ ...
- java日志框架与日志系统
日志框架:提供日志调用的接口,实际的日志输出委托给日志系统实现. JCL(Jakarta Commons Logging):比较流行的日志框架,很多框架都依赖JCL,例如Spring等. SLF4j: ...
- 配置Tomcat的日志系统
成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格 ...
- 实战3--项目开始--准备:::资源分类, 日志系统, 写BaseDao
项目资源分类: 1. package: base, dao, dao.impl, domain, service, service.impl, util, view.action 2. co ...
随机推荐
- asp.net导入Excel表
一.导入Excel的界面这个界面很简单,代码就不列出来了.二.导入的代码我分了两部分,第一部分是点击查看数据的代码,这个是将数据导入到DataTable里面,但是还没有导入到数据库里.这里需要注意的是 ...
- 每日一九度之 题目1043:Day of Week
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7336 解决:2563 题目描述: We now use the Gregorian style of dating in Russia. ...
- Wireless Network
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 19626 Accepted: 8234 De ...
- 关于接收json以及使用json
Common: FileIO.cs using System; using System.Collections.Generic; //using System.Linq; using System. ...
- 实现multbandblend
一.首先实现 laplacian金字塔的分割和重构 #include "stdafx.h" #include <iostream> #include <vecto ...
- 通过PowerShell查询本机IP地址
脚本内容如下: Write-Host "本机IP地址为:"(ipconfig|findstr "IPv4")[1].split(":")[1 ...
- if for case 及多参数同时传递
#!/bin/bash in 'start') echo "start server..." ;; 'stop') echo "stop server..." ...
- myeclipse页面编辑框空格、回车符、对齐出现特殊字符
myeclipse页面编辑框空格.回车符.对齐出现特殊字符 解决办法:window-preferences-general-editors-Text Editors 把show whitespa ...
- pt-query-digest怎么分析慢查询日志分析数据
在进行使用linux系统作为服务器的情况,那几需要进行对linux的服务器进行性能上数据进行抓取之后,就需要对数据中内容进行分析,看数据库中内容是否存在瓶颈上的问题,在进行获取到的数据的慢查日志,将使 ...
- mysql 用sql语句查询一个表中的所有字段类型、注释
SELECT column_name,column_comment,data_type FROM information_schema.columns WHERE table_name='表名' AN ...