log4j 知识点
什么是log4j?
- log4j 是一个帮助程序员将日志语句输出到各种输出目标的工具。
- log4j 包的设计使得日志语句可以保留在已发布的代码中,而不会产生高性能成本。
- log4j 使用
分层记录器
可以有选择地控制以任意粒度输出哪些日志语句。 - log4j 的设计考虑了三个目标:
可靠性
、速度
和灵活性
。
log4j是一个可靠的日志系统吗?
不是。log4j 不可靠。它是一种尽力而为的
故障停止记录系统。
通过失败停止,log4j 不会在运行时抛出意外的异常,从而可能导致应用程序崩溃。
此外,当 log4j 的指定输出流未打开,不可写或变满时,log4j 将不会恢复为System.out
或 System.err
。这样可以避免因为日志记录失败而覆盖用户终端而损坏其他工作程序。但是,log4j 将向System.err
输出单个消息,指示无法执行日志记录。
log4j有什么特点?
- log4j 针对
速度
进行了优化。 - log4j 基于命名的记录器层次结构。
- log4j 是失败停止,但并不保证每个日志语句都将传递到其目的地。
- log4j 是
线程安全
的,Log4j 组件设计用于大量多线程系统。 - log4j 配置文件可以是
属性文件
或XML
格式。 - log4j 旨在从一开始就处理 Java Exceptions。
- log4j 可以将其输出定向到
文件
、控制台
、java.io.OutputStream
、java.io.Writer
、使用 TCP 的远程服务器
、远程 Unix Syslog 守护程序
、使用 JMS 的远程侦听器
、NT EventLog
、电子邮件
。 - log4j 使用 6 个级别:即
TRACE
,DEBUG
,INFO
,WARN
,ERROR
和FATAL
。等级: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的三个主要组件
loggers
,appenders
和layouts
。这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式以及报告的位置。
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 知识点的更多相关文章
- commons-logging log4j logback 知识点
log4j 2,需要导入2个jar包: log4j-core-xx.jar log4j-api-xx.jar log4j 2 的 properties 配置文件名字为: log4j2.properti ...
- springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置
Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...
- Java程序员需要学习的知识点
Java是全世界最受欢迎的3大编程语言之一,它可以开发出许多实用的WEB应用程序和桌面应用程序,更重要的一点,Java是跨平台的语言——编写一次,可以再任何地方运行.另外,Java也很容易入门,如果你 ...
- 日志之再说Log4J
网上关于LOG4J的使用文章太多了,写这篇文章的目的一方面是为了回顾LOG4J的用法,一方面针对配置的使用自动将日志插入数据库,自动发送邮件,还有就是自定义输入实现.后续文章会总结下从LOG4J到LO ...
- (转)log4j(三)——如何控制不同级别的日志信息的输出?
一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 package test.log4j.test3; import org.apac ...
- (转)log4j(二)——如何控制日志信息的输出?
一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 先看栗子再来下结论 import org.apache.log4j.*; import test.log4j.bean ...
- Java基础面试知识点总结
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用
log4j 就是log for java嘛,老外都喜欢这样子,比如那个I18n ---internationalization 不就是i和n之间有18个字母... http://logging.a ...
- springmvc 项目完整示例08 前台页面以及知识点总结
至此已经基本测试成功了,我们稍作完善,让它成为一个更加完整的项目 我们现在重新规划下逻辑 两个页面 一个登录页面 一个欢迎页面 登陆页面输入账号密码,登陆成功的话,跳转登陆成功 欢迎页面 并且,更新用 ...
随机推荐
- springboot使用jpa+mongodb时,xxxRepository不能Autowired的问题
springboot启动类: @SpringBootApplication public class MainApp { public static void main(String[] args) ...
- JVM(二)垃圾回收
要弄懂JVM的垃圾回收,首先要知道我们要回收什么,在哪回收,什么时候回收. 一.JVM内存模型 java虚拟机把内存模型分为了这么几部分 (1)程序计数器 程序计数器(Program Counter ...
- jQuery滑动
通过 jQuery,您可以在元素上创建滑动效果. jQuery 拥有以下滑动方法: slideDown(speed,callback):用于向下滑动元素. slideUp(speed,callback ...
- 【blog】MySQL中tinytext、text、mediumtext和longtext详解
参考链接 http://www.cnblogs.com/pureEve/p/6015000.html
- 自定义Banner
Spring Boot项目启动时,默认的打印样式如下 自定义 在/src/main/resources目录下新建banner.txt,在里面输入要打印的文字即可,例如: 图形制作网站:http://w ...
- MVC_Route层层深入
1.前期准备 新建一个MVC项目,并添加Home和About两个控制器 在这两个控制器对应添加index页面 namespace Study_MVC_Route.Controllers { publi ...
- 2017 ACM/ICPC(北京)总结
这个季节的,北京真的很冷. 下午的热身赛,我依然先去敲一道搜索题,但是很不幸这道搜索题坑点还是蛮多的,浪费了好长时间后依然没能A掉,期间Codeblocks崩溃一次使得代码完全丢失,在队友的建议下便暂 ...
- python,魔法方法指南
1.简介 本指南归纳于我的几个月的博客,主题是 魔法方法 . 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加“魔法”的特殊方法. 它们经常是两个下划线包围来命名的 ...
- Linux安装JDK(tar)
我以JDK1.8为例 ⒈下载 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- 【原理】VRRP详解
写在前面 keepalived是一个基于VRRP协议来实现的服务高可用方案,从而可以避免IP单点故障.一般与其他负载均衡技术,如LVS,Nginx等一起来工作来达到集群高可用的目的 关于Keepali ...