什么是log4j?

  • log4j 是一个帮助程序员将日志语句输出到各种输出目标的工具。
  • log4j 包的设计使得日志语句可以保留在已发布的代码中,而不会产生高性能成本。
  • log4j 使用分层记录器可以有选择地控制以任意粒度输出哪些日志语句。
  • log4j 的设计考虑了三个目标:可靠性速度灵活性

log4j是一个可靠的日志系统吗?

  不是。log4j 不可靠。它是一种尽力而为的故障停止记录系统。

  通过失败停止,log4j 不会在运行时抛出意外的异常,从而可能导致应用程序崩溃。

  此外,当 log4j 的指定输出流未打开,不可写或变满时,log4j 将不会恢复为System.outSystem.err。这样可以避免因为日志记录失败而覆盖用户终端而损坏其他工作程序。但是,log4j 将向System.err输出单个消息,指示无法执行日志记录。

log4j有什么特点?

  • log4j 针对速度进行了优化。
  • log4j 基于命名的记录器层次结构。
  • log4j 是失败停止,但并不保证每个日志语句都将传递到其目的地。
  • log4j 是线程安全的,Log4j 组件设计用于大量多线程系统。
  • log4j 配置文件可以是属性文件XML格式。
  • log4j 旨在从一开始就处理 Java Exceptions。
  • log4j 可以将其输出定向到文件控制台java.io.OutputStreamjava.io.Writer使用 TCP 的远程服务器远程 Unix Syslog 守护程序使用 JMS 的远程侦听器NT EventLog电子邮件
  • log4j 使用 6 个级别:即TRACEDEBUGINFOWARNERRORFATAL。等级:DEBUG < INFO < WARN < ERROR < FATAL
  • 通过扩展Layout类可以轻松更改日志输出的格式。
  • 通过Appender接口的实现来更改日志输出的目标以及写入策略 。
  • log4j 支持每个记录器输出多个appender
  • log4j 支持国际化。

是否有使用log4j的示例代码?

  请参阅 examples / 目录。

日志输出是什么样的?

  可以通过多种方式自定义日志输出。此外,可以通过实现自己的布局完全覆盖输出格式。以下是使用PatternLayout的示例输出,其转换模式为:%r [%t]%-5p%c {2}%x - %m%n

176 [main] INFO examples.Sort  - 以相反的顺序填充2个元素的数组。
225 [main] INFO examples.SortAlgo - 输入排序方法。
262 [main] DEBUG SortAlgo.OUTER i = 1 - 外循环。
276 [main] DEBUG SortAlgo.SWAP i = 1 j = 0 - 交换intArray [0] = 1和intArray [1] = 0
290 [main] DEBUG SortAlgo.OUTER i = 0 - 外循环。
304 [main] INFO SortAlgo.DUMP - 整数数组的转储:
317 [main] INFO SortAlgo.DUMP - 元素[0] = 0
331 [main] INFO SortAlgo.DUMP - 元素[1] = 1
343 [main] INFO examples.Sort - 下一个日志语句应该是错误消息。
346 [main] ERROR SortAlgo.DUMP - 尝试转储未初始化的数组。
在org.log4j.examples.SortAlgo.dump(SortAlgo.java:58)
在org.log4j.examples.Sort.main(Sort.java:64)
467 [main] INFO examples.Sort - 退出主要方法。

  第一个字段是自程序启动以来经过的毫秒数。第二个字段是输出日志语句的线程。第三个字段是日志语句的级别。第四个字段是记录器发出日志请求的最右边的两个组件。第五个字段(在' - '之前)是嵌套诊断上下文(NDC)。请注意,嵌套诊断上下文可能为空,如前两个语句中所示。' - '后面的文本是语句的消息。

什么是记录器?

  Lggers 是 log4j 的核心。记录器定义层次结构,并为程序员提供运行时控制,以控制或不打印哪些语句。记录器被分配级别。根据其级别和记录器打印日志语句。

如何在静态块中获取类的完全限定名称?

package a.b.c;

import org.apache.log4j.Logger;

public class Foo {
final static Logger logger = Logger.getLogger(Foo.class);
... other code }

Log4j的三个主要组件

loggersappenderslayouts。这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式以及报告的位置。

Configuration

 import com.foo.Bar;

 import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator; public class MyApp { // 定义静态记录器变量,使其引用
// 名为“MyApp”的记录器实例。
static Logger logger = Logger.getLogger(MyApp.class); public static void main(String [] args) { // 设置在控制台上登录的简单配置。
BasicConfigurator.configure(); logger.info("Entering application.");
Bar bar = new Bar();
bar.doIt()
logger.info("Exiting application.");
}
}

  MyApp 首先导入 log4j 相关类。然后,它定义一个名为 MyApp 的静态记录器变量,该变量恰好是该类的完全限定名称。MyApp 使用com.foo包中定义的 Bar 类。

 package com.foo;
import org.apache.log4j.Logger; public class Bar {
static Logger logger = Logger.getLogger(Bar.class); public void doIt() {
logger.debug("Do it again.");
}
}

  BasicConfigurator.configure方法的调用创建了一个相当简单的 log4j 设置。此方法是硬连线的,以便将根记录器添加到 ConsoleAppender 中。输出将使用 PatternLayout 格式设置为%-4r [%t]%-5p%c%x - %m%n模式。

  请注意,默认情况下,根记录器分配给Level.DEBUG

  MyApp 的输出是:

0 [main] INFO MyApp  - Entering application.
36 [main] DEBUG com.foo.Bar - Do it again.
51 [main] INFO MyApp - Exiting application.

  在 MyApp 的类通过调用配置 log4j 的BasicConfigurator.configure方法。其他类只需要导入org.apache.log4j.Logger类,检索他们希望使用的记录器,然后注销。前面的示例始终输出相同的日志信息。幸运的是,很容易修改 MyApp,以便在运行时控制日志输出。这是一个稍微修改过的版本。

 import com.foo.Bar;

 import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator; public class MyApp { static Logger logger = Logger.getLogger(MyApp.class.getName()); public static void main(String[] args) { // 将 BasicConfigurator 替换为 PropertyConfigurator。
PropertyConfigurator.configure(args[0]); logger.info("Entering application.");
Bar bar = new Bar();
bar.doIt();
logger.info("Exiting application.");
}
}

  此版本的 MyApp 指示 PropertyConfigurator 解析配置文件并相应地设置日志记录。下面是一个示例配置文件,其结果与先前基于 BasicConfigurator 的示例相同。

# 将root logger level设置为DEBUG,将其唯一的appender设置为A1。
log4j.rootLogger=DEBUG, A1 # A1设置为ConsoleAppender。
log4j.appender.A1=org.apache.log4j.ConsoleAppender # A1 使用 PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

  假设我们不再对查看属于 com.foo 包的任何组件的输出感兴趣。以下配置文件显示了实现此目的的一种可能方法。

log4j.rootLogger = DEBUG,A1
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout = org.apache.log4j.PatternLayout #以ISO 8601格式打印日期
log4j.appender.A1.layout.ConversionPattern = %d [%t]%-5p%c - %m%n #在com.foo包中仅打印级别为WARN或更高级别的消息。
log4j.logger.com.foo = WARN

参考手册

log4j 知识点的更多相关文章

  1. commons-logging log4j logback 知识点

    log4j 2,需要导入2个jar包: log4j-core-xx.jar log4j-api-xx.jar log4j 2 的 properties 配置文件名字为: log4j2.properti ...

  2. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  3. Java程序员需要学习的知识点

    Java是全世界最受欢迎的3大编程语言之一,它可以开发出许多实用的WEB应用程序和桌面应用程序,更重要的一点,Java是跨平台的语言——编写一次,可以再任何地方运行.另外,Java也很容易入门,如果你 ...

  4. 日志之再说Log4J

    网上关于LOG4J的使用文章太多了,写这篇文章的目的一方面是为了回顾LOG4J的用法,一方面针对配置的使用自动将日志插入数据库,自动发送邮件,还有就是自定义输入实现.后续文章会总结下从LOG4J到LO ...

  5. (转)log4j(三)——如何控制不同级别的日志信息的输出?

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 package test.log4j.test3; import org.apac ...

  6. (转)log4j(二)——如何控制日志信息的输出?

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 先看栗子再来下结论 import org.apache.log4j.*; import test.log4j.bean ...

  7. Java基础面试知识点总结

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  8. springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用

    log4j 就是log for java嘛,老外都喜欢这样子,比如那个I18n  ---internationalization  不就是i和n之间有18个字母... http://logging.a ...

  9. springmvc 项目完整示例08 前台页面以及知识点总结

    至此已经基本测试成功了,我们稍作完善,让它成为一个更加完整的项目 我们现在重新规划下逻辑 两个页面 一个登录页面 一个欢迎页面 登陆页面输入账号密码,登陆成功的话,跳转登陆成功 欢迎页面 并且,更新用 ...

随机推荐

  1. 1.3 第一个python程序

    使用Pycharm编写第一个python程序 1.打开 Pycharm,选择 Create New Project,创建一个新项目 2.选择Pure Python表示创建一个纯Python程序项目,  ...

  2. 怎样远程访问 MySQL

    比如我在PC上安装有 phpmyadmin, 图形界面很友好,我的MySQL 在一台Centos 7.5服务器上,很自然的想到用phpmyadmin 去登录linux上的MySQL. 但是折腾了很久也 ...

  3. EcustOJ P109跳一跳(离散化+dp)

    题目链接 感觉这道题我看了很多天,胡思乱想啊,一开始觉得记忆化搜索会可能T啊,,可能出题人的数据卡的好就稳T了的感觉..后来想了想,好像离散化一下,记一下位置之后再记忆化搜索就应该稳了吧..(好像直接 ...

  4. js公共弹出窗插件

    /*错误提示框*/ var wr = function() { var wrap = '<div class="wrapBox opacity"> </div&g ...

  5. java时间计算

  6. ionic3安装

    1.安装 1)安装nodejs: 官网下载安装 2)可选安装 cnpm:  //安装了cnpm后,以后用到npm安装的东西都可以把npm替换成cnpm npm install -g cnpm --re ...

  7. 集合-HashMap

    该文章的实践内容来自how2java网站,集合的学习篇章 1.概念: HashMap是以哈希表作为底层数据结构,以一组键值对作为存储单元的Map接口的实现类. 其主要特点是,容器内的元素不以添加顺序排 ...

  8. 20165234 《Java程序设计》第四周学习总结

    第四周学习总结 教材学习内容总结 第5章 子类与继承 子类的继承性 子类和父类在同一包中的继承性:子类继承父类中不是 private 的成员变量和方法作为自己的成员变量和方法 子类和父类不在同一包中的 ...

  9. 【转载】Latex定制章节编号格式和计数器

    原文: http://www.chengkaiblog.com/software-application/latex/customize-section-format-counter.html _1. ...

  10. zxing二维码

    最近二维码用的很多,同时给了个zxing.dll和demo,用着还不错,就想着自己看看源码.于是搜索到一下资料: ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编 ...