Java入门到架构师知识点整理 | 异常处理 | 使用Commons Logging
发布日期:2022-05-29 19:50:57 浏览次数:2 分类:技术文章

本文共 2532 字,大约阅读时间需要 8 分钟。

和Java标准库提供的日志不同,Commons Logging是一个第三方日志库,它是由Apache创建的日志模块。

Commons Logging的特色是,它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons Loggin自动搜索并使用Log4j(Log4j是另一个流行的日志系统),如果没有找到Log4j,再使用JDK Logging。

使用Commons Logging只需要和两个类打交道,并且只有两步:

第一步,通过LogFactory获取Log类的实例; 第二步,使用Log实例的方法打日志。

示例代码如下:

import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class Main {    public static void main(String[] args) {        Log log = LogFactory.getLog(Main.class);        log.info("start...");        log.warn("end.");    }}朋友圈 输入:huany6880 添加老师 对于学习Java还有相关的一切疑惑与难题,皆可随时私信我咨询,(Java、人工智能方向)和Java架构师路线图、面试题资料等等

运行上述代码,肯定会得到编译错误,类似error: package org.apache.commons.logging does not exist(找不到org.apache.commons.logging这个包)。因为Commons Logging是一个第三方提供的库,所以,必须先把它[=下载下来。下载后,解压,找到commons-logging-1.2.jar这个文件,再把Java源码Main.java放到一个目录下,例如work目录:

work│├─ commons-logging-1.2.jar│└─ Main.java

然后用javac编译Main.java,编译的时候要指定classpath,不然编译器找不到我们引用的org.apache.commons.logging包。编译命令如下:

javac -cp commons-logging-1.2.jar Main.java

如果编译成功,那么当前目录下就会多出一个Main.class文件:

work│├─ commons-logging-1.2.jar│├─ Main.java│└─ Main.class

现在可以执行这个Main.class,使用java命令,也必须指定classpath,命令如下:

java -cp .;commons-logging-1.2.jar Main

注意到传入的classpath有两部分:一个是.,一个是commons-logging-1.2.jar,用;分割。.表示当前目录,如果没有这个.,JVM不会在当前目录搜索Main.class,就会报错。

如果在Linux或macOS下运行,注意classpath的分隔符不是;,而是:

java -cp .:commons-logging-1.2.jar Main

运行结果如下:

Mar 02, 2019 7:15:31 PM Main mainINFO: start...Mar 02, 2019 7:15:31 PM Main mainWARNING: end.

Commons Logging定义了6个日志级别:

  • FATAL
  • ERROR
  • WARNING
  • INFO
  • DEBUG
  • TRACE

默认级别是INFO

使用Commons Logging时,如果在静态方法中引用Log,通常直接定义一个静态类型变量:

// 在静态方法中引用Log:public class Main {    static final Log log = LogFactory.getLog(Main.class);    static void foo() {        log.info("foo");    }}

在实例方法中引用Log,通常定义一个实例变量:

// 在实例方法中引用Log:public class Person {    protected final Log log = LogFactory.getLog(getClass());    void foo() {        log.info("foo");    }}

注意到实例变量log的获取方式是LogFactory.getLog(getClass()),虽然也可以用LogFactory.getLog(Person.class),但是前一种方式有个非常大的好处,就是子类可以直接使用该log实例。例如:

// 在子类中使用父类实例化的log:public class Student extends Person {    void bar() {        log.info("bar");    }}

由于Java类的动态特性,子类获取的log字段实际上相当于LogFactory.getLog(Student.class),但却是从父类继承而来,并且无需改动代码。

此外,Commons Logging的日志方法,例如info(),除了标准的info(String)外,还提供了一个非常有用的重载方法:info(String, Throwable),这使得记录异常更加简单:

try {    ...} catch (Exception e) {    log.error("got exception!", e);}

练习

使用log.error(String, Throwable)打印异常。

小结

Commons Logging是使用最广泛的日志模块;

Commons Logging的API非常简单;

Commons Logging可以自动检测并使用其他日志模块。

转载地址:https://blog.csdn.net/ITHHH111/article/details/124303119 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java入门到架构师知识点整理 | 异常处理 | 使用JDK Logging
下一篇:Java入门到架构师知识点整理 | 布尔运算

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月14日 19时20分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【Leetcode刷题篇】leetcode88 合并两个有序数组 2021-06-29
【Leetcode刷题篇】剑指offer51 数组中的逆序对 2021-06-29
【Leetcode刷题篇】剑指offer55-平衡二叉树 2021-06-29
【Leetcode刷题篇】leetcode98 判断一棵树是否为二叉搜索树 2021-06-29
Java中arraylist和数组的相互转换 2021-06-29
【Leetcode刷题篇 】leetcode147 对链表进行插入排序 2021-06-29
【Leetcode刷题篇】leetcode148 排序链表 2021-06-29
【面试篇】Java中String、StringBuilder与StringBuffer的区别? 2021-06-29
【面试篇】Java对象的hashCode()相同,equals()一定为true吗? 2021-06-29
【面试篇】Java中static和final关键字的作用是什么? 2021-06-29
【面试篇】Java中接口和抽象类的区别是什么? 2021-06-29
【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流 2021-06-29
【Java网络编程与IO流】Java中BIO、NIO、AIO的区别是什么? 2021-06-29
【Leetcode刷题篇】leetcode136 只出现一次的数字 2021-06-29
spring boot整合thymeleaf,支持JSP和HTML页面开发 2021-06-29
【Java网络编程与IO流】Spring boot整合SSE实现服务器实时推送流信息 2021-06-29
【Java网络编程与IO流】SpringBoot + WebSocket + Netty实现实时的服务器消息推送 2021-06-29
【Leetcode刷题篇】leetcode141 环形链表II 2021-06-29
【Leetcode刷题篇】leetcode160 相交链表 2021-06-29
【Leetcode刷题篇】leetcode169 多数元素 2021-06-29