什么是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. centos6.5配置redis服务 很好用谢谢

    1.下载Redis3.2.5安装包               wget http://download.redis.io/releases/redis-3.2.5.tar.gz   2.解压.编译. ...

  2. Oracle 数据库监听配置和服务

    -- 补充说明 如果要远程连接192.168.10.44上的oracle,那么192.168.10.44服务器必须启动TNSListener.(配置文件 listener.ora) PLSQL Dev ...

  3. Docker 添加环境系统文件配置

    在 docker 启动文件添加默认环境系统配置 " /etc/default/docker ": 添加  Environment File 配置: # vi /usr/lib/sy ...

  4. windows 检测进程pid

    根据端口查进程: netstat -ano |find " netstat -ano | findstr 2018 a 显示所有连接和侦听的端口n 以数字形式显示地址和端口号o 显示关联的进 ...

  5. 搭建单机版的FastDFS服务

    一,原理讲解 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的 ...

  6. 采用shell脚本定时清理Tomcat日志

    1 Shell脚本案例 删除超过30天的日志文件 #!/bin/bash log_path=/mnt/software/apache-tomcat-.M22/logs d=`date +%Y-%m-% ...

  7. 【译】第五篇 SQL Server安全架构和安全

    本篇文章是SQL Server安全系列的第五篇,详细内容请参考原文. 架构本质上是一个数据库对象,其他对象的一个容器,在复杂的数据库中它能够很容易的管理各组对象.架构具有重要的安全功能.在这一篇你会学 ...

  8. android页面渲染速度提升的常用方法

    参考文档:http://blog.csdn.net/vector_yi/article/details/24402101 当activity中用到的布局较多较为复杂时,页面渲染就会变得复杂,现汇总以下 ...

  9. CF1102F Elongated Matrix

    题目地址:CF1102F Elongated Matrix 没想到Div.3里还有这么好的题 其实就是求Hamilton路径 预处理 \(d\) 数组: \(d1_{i,j}\) 表示第 \(i,j\ ...

  10. ARMCC和GCC编译ARM代码的软浮点和硬浮点问题 【转】

    转自:http://houh-1984.blog.163.com/blog/static/31127834201211112129167/ 本文介绍了ARM代码编译时的软浮点(soft-float)和 ...