`
banxi1988
  • 浏览: 154173 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

Java日志系统学习之log4j!

    博客分类:
  • java
阅读更多
尽管slf4j+logback看起来很不错。但是,由于自己熟悉的很多项目都还是用log4j。而且springmvc默认使用log4j。所以 自己还是学习总结下。
     我习惯到官网去看资料学习使用。我觉得这样不会让我在众多转来转去文章中。搞得晕头转向,而不得要领。
  log4j apache官网手册页面。

  手册页上有一段话,吸引了我的注意。本来下午的时候,我还在想理由解释为什么要使用日志。下面这段话太经典了。
As Brian W. Kernighan and Rob Pike put it in their truly excellent book "The Practice of Programming"
/**
  As personal choice, we tend not to use debuggers beyond getting a
  stack trace or the value of a variable or two. One reason is that it
  is easy to get lost in details of complicated data structures and
  control flow; we find stepping through a program less productive
  than thinking harder and adding output statements and self-checking
  code at critical places. Clicking over statements takes longer than
  scanning the output of judiciously-placed displays. It takes less
  time to decide where to put print statements than to single-step to
  the critical section of code, even assuming we know where that
  is. More important, debugging statements stay with the program;
  debugging sessions are transient.
**/


Log4j有三大主要组件:loggers,appends,layouts
这三种类型的组件协同工作使得开发者可以根据消息类型和级别来log信息,并可以在运行时指定信息如何格式化及输出到哪里。

一: Logger 的层次结构
      Logger是具名实体,Logger名大小写敏感。遵循下面的规则。
        如一个名为"com.foo.Bar"的Logger是一个名为"com.foo"的Logger的子Logger。
即"com.foo"Logger是"com.foo.Bar"的父Logger。

root Logger处于Logger层次结构的顶层。它有两个特殊的地方。
1. root Logger永远存在。
  2. root Logger不能通过名字访问到。
通过类静态方法Logger.getRootLogger()可以访问root Logger。
所以其它的Logger实例可以通过类静态方法Logger.getLogger(String name)有过Logger名作为参数来获得。
//Logger类的outline如下
org.apache.log4j.Logger
org.apache.log4j.Logger.FQCN
org.apache.log4j.Logger.Logger(String)
org.apache.log4j.Logger.getLogger(String)
org.apache.log4j.Logger.getLogger(Class)
org.apache.log4j.Logger.getRootLogger()
org.apache.log4j.Logger.getLogger(String, LoggerFactory)
org.apache.log4j.Logger.trace(Object)
org.apache.log4j.Logger.trace(Object, Throwable)
org.apache.log4j.Logger.isTraceEnabled()
  


Logger的级别。
以下是Logger级别 Level类的outline
org.apache.log4j.Level
org.apache.log4j.Level.TRACE_INT
org.apache.log4j.Level.OFF
org.apache.log4j.Level.FATAL
org.apache.log4j.Level.ERROR
org.apache.log4j.Level.WARN
org.apache.log4j.Level.INFO
org.apache.log4j.Level.DEBUG
org.apache.log4j.Level.TRACE
org.apache.log4j.Level.ALL
org.apache.log4j.Level.serialVersionUID
org.apache.log4j.Level.Level(int, String, int)
org.apache.log4j.Level.toLevel(String)
org.apache.log4j.Level.toLevel(int)
org.apache.log4j.Level.toLevel(int, Level)
org.apache.log4j.Level.toLevel(String, Level)
org.apache.log4j.Level.readObject(ObjectInputStream)
org.apache.log4j.Level.writeObject(ObjectOutputStream)
org.apache.log4j.Level.readResolve()


上面outline的声明中,的顺序也是控制log输出的顺序。

  Logger级别的继承:
  一个名为C的Logger它的级别等于第一个在继承层级中非空的层级。
Logger的层次结构是一颗倒挂的树。Logger如果没有声明一个层级的话,会向上递归向上查找父Logger的层次并继承。

注意:以同一个名字调用getLogger(String name)方法会返回同一个logger对象。


二: Appenders
  在log4j中一个Appender就是一个log信息输出目的地。
  一个Logger可以对应多个Appender。
addAppendar()方法可以为Logger添加一个指定的Appender。
任何一个被接受的Logging请求都会被发送到Logger所有的Appendar中,以及继承自此层级的Appender中。(也就是说跟Logger的层级级别可以继承一样。Appender也可以)

注意可以通过设置一个Logger的Appender的additivity flag为false,来阻止logging请求消息向子appender传播。
Appenders接口的outline如下:
org.apache.log4j.Appender
org.apache.log4j.Appender.addFilter(Filter)
org.apache.log4j.Appender.getFilter()
org.apache.log4j.Appender.clearFilters()
org.apache.log4j.Appender.close()
org.apache.log4j.Appender.doAppend(LoggingEvent)
org.apache.log4j.Appender.getName()
org.apache.log4j.Appender.setErrorHandler(ErrorHandler)
org.apache.log4j.Appender.getErrorHandler()
org.apache.log4j.Appender.setLayout(Layout)
org.apache.log4j.Appender.getLayout()
org.apache.log4j.Appender.setName(String)
org.apache.log4j.Appender.requiresLayout()


三:Layouts
Appender来设置log消息输出的目的地。而Layouts则是用来设置输出的log消息的格式的。
可以通过为一个Appender关联一个Layout来完成这个目的。
PatternLayout是log4j的一个标准输出组件。它允许用户以类似于C语言printf风格的模式来指定输出样式。在log4j附加部分中有一个EnhancedPatternLayout。应该优先使用。
log4j的输出模式如下:
%[modifiers]conversion_char
即以一个百分号开头,带一个可选的修饰符和一个转换字符。
假设模式是“%-5p [%t]: %m%n"并且log4j的Layout选择是PatternLayout。
那么下面的代码
Category root = Category.getRoot();
root.debug("Message 1");
root.warn("Message 2");

将产生如下输出:
/**
DEBUG [main]: Message 1
WARN  [main]: Message 2
**/

%-5p表示logging 事件的优先级应当以5个字符的宽度左对齐

关于配置的更多信息可以参与如下文章,此文章下面例出的其它文章也可以参考:
log4j详解与实战

根据org.apache.log4j.PatternLayout类的JavaDoc。
我简单概括下各种模式字符的用法:
%c{n}  输出loggineEvent的类别名。c后面跟以花括号括住的精确符例如类别名"a.b.c"模式名%c{2}将会输出"b.c"

%C{n}  同上作用于类别,警告:此模式字符会影响性能。

%d{SimpleDateFormat}  用于输出日志产生时间。日期格式化模式用java中的SimpleDateFormat类。

%F   输出首先log请求的文件名。警告:会影响性能。

%I  输出产生log的调用位置。位置log取决于JVM实现,但通包括调用方法的全称。注意:这种log很有用。但是会更大的影响性能。
%L  输出产生log的代码行。 警告:严重影响性能

%m  用于输出程序指明的日志信息。 最基本的。

%M  输出产生log请求的方法。警告:会影响性能。

%n 换行

%p 输出logging 事件。如debug,info,warn,error
%r 输出构造log使用的时间
%t 输出产生log请求的线程名。
%x 用于输出与产生log线程关联的NDC。
%X 用于输出MDC
%% 输出百分号。


设置log消息输出到文件中也有几个log4j自带的Appender可用,
如:org.apache.log4j.DailyRollingFileAppender

基本设置如下:
	  <!--  日志文件输出设置 -->
	 <appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
	 	<param name="file" value="logs/app_log.log"/>
	 	<param name="DatePattern" value=".yyyy-MM-dd"/>
	 	<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%-5p] %d{yyyy-MM-dd HH:mm:ss} %c{3} - %m%n" />
		</layout>
	 </appender>



值得注意的一个问题就是:
在我的spring框架下的web环境下。
日志文件输出的地方。在我的Ubuntu系统下。
它输出的位置地在主目录下的logs目录下。
在windows系统中应该是指在我的文档处吧。

而在一般的java程序配置下时,它的输出在
项目根目录下。


关于过滤日志级别的配置可以参考以下iteye帖子:
log4j不同级别日志分不同文件记录



一个错误:
Caused by: java.io.FileNotFoundException: /home/banxi1988/work/posterWallworkspace/LogDemo/src/log4j.dtd (No such file or directory)

原因是在log4j.xml所在目录下多出来一个log4j.out.xml文件。


我奇怪的是为什么的我的日志文件加日期名配置就是不成功:
下面的代码我也尝试了还几种写法。
<param name="DatePattern" value=".yyyy-MM-dd"/>
<!-- 下面的也尝试过。-->
<param name="DatePattern" value="'.'yyyy-MM-dd"/>

再尝试换一个属性,报如下信息。看来我是暂时没有办法了。
log4j:WARN No such property [fileNamePattern] in org.apache.log4j.DailyRollingFileAppender.

使用学习暂时到此,未完待续-----------

分享到:
评论

相关推荐

    log4j使用与java中log4j记录日志如何写入数据库

    本文将详细介绍如何在Java中使用Log4j来记录日志,并将其写入数据库。 首先,我们需要了解Log4j的基本结构。一个简单的Log4j项目通常包含以下几个部分: 1. **配置文件**:Log4j的配置文件通常是`log4j.properties...

    Java日志学习一:Log4j和commons-logging的关系

    总的来说,Log4j和commons-logging在Java日志处理中扮演着不可或缺的角色。了解它们的工作原理和如何协作,能够帮助开发者构建更稳定、可维护的系统,并提高问题排查的效率。在日常开发中,善用这些工具,能够提升...

    使用log4j2实现日志数据脱敏

    Log4j2作为Java领域广泛使用的日志框架,提供了丰富的功能来满足这一需求。本文将详细介绍如何使用Log4j2实现日志数据脱敏。 一、Log4j2简介 Log4j2是Apache软件基金会开发的日志框架Log4j的升级版,它具有更高的...

    Java 日志管理+log4j

    Log4j是Java领域广泛使用的日志框架之一,由Apache软件基金会开发,提供了灵活的日志配置和丰富的日志级别管理。 首先,我们来谈谈Java内置的日志API,即java.util.logging.Logger。它是Java标准库中的日志系统,...

    java-日志-log4j.7z

    Java日志库Log4j是Java开发者非常熟悉的工具,它为应用程序提供了强大的日志记录功能。Log4j是由Apache软件基金会开发的一个开源项目,广泛应用于各种Java应用中,包括大型企业级系统、Web应用程序和小型服务。这个...

    log4j自定义日志文件名及日志输出格式

    Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案.docx

    1. 兼容性强:Slf4j可以与多种日志系统集成,如Log4j、Logback、Java Util Logging等。 2. 灵活性强:Slf4j提供了统一的日志接口,使得用户可以选择不同的日志实现。 3. 高性能:Slf4j可以在高并发情况下提供高性能...

    Java 日志工具 Log4j 示例源代码

    Java日志工具Log4j是Java开发者非常熟悉的一个开源日志框架,它为应用程序提供了灵活且高效的日志记录功能。Log4j不仅简单易用,而且功能强大,能够帮助开发者在开发、测试和生产环境中方便地收集和分析日志信息。...

    tomcat8更换log4j记录日志

    此压缩包提供的资源是针对Tomcat8及其以下版本的日志管理解决方案,主要涉及Log4j这个流行的Java日志框架。下面将详细介绍如何在Tomcat8中替换或更新Log4j来记录日志。 首先,让我们了解一下Log4j。Log4j是Apache...

    log4j日志配置以及配置文件详解

    **日志系统在软件开发中扮演着至关重要的角色,它能帮助开发者跟踪程序运行...同时,不断学习和探索log4j的高级特性,如异步日志、MDC(Mapped Diagnostic Context)等,可以进一步提升日志系统的实用性和可维护性。

    log4j2.xml记录日志到到数据库

    理解Log4j2的配置和使用是每个Java开发者必备的技能,这对于日后的故障排查和系统维护至关重要。在实际应用中,你可以根据需求调整配置,例如增加日志过滤规则、添加更多的日志输出目标,或者改变日志格式等。

    log4j按功能保存日志

    Log4j是一款广泛使用的Java日志记录框架,它允许开发者按照功能模块或特定需求记录应用程序运行过程中的事件信息。在“log4j按功能保存日志”的场景中,我们通常会利用Log4j的配置灵活性,将不同功能的日志分别写入...

    log4j-控制指定类,包的日志级别:log4j-demo.zip

    Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的功能,包括控制日志级别、定制日志格式、支持多种输出方式等。本示例将详细介绍如何使用Log4j来控制指定类或包的日志级别。 首先,我们来理解日志级别的...

    java日志操作之Log4j

    ### Java日志操作之Log4j详解 #### Log4j简介 Log4j是一个非常流行的开源日志框架,由Apache基金会维护。它最初是作为Jakarta项目的一部分出现的,随着时间的发展,Log4j逐渐成为了一个独立且功能强大的日志解决...

    kafka_Java_Log4j

    为了将Log4j日志发送到Kafka,我们需要在Log4j的配置文件(通常是log4j.properties或log4j.xml)中添加`KafkaAppender`。以下是一个基本的Log4j配置示例: ```properties # 在log4j.properties中配置KafkaAppender ...

    java关于log4j打印日志demo

    通过这个`java关于log4j打印日志demo`,我们可以学习到如何配置和使用Log4j,理解其工作原理,以及如何在实际项目中有效地利用日志系统。实践这个示例将帮助你更好地掌握Java日志记录的最佳实践。

    log4j.rar java写LOG日志的驱动

    **Java日志框架Log4j详解** 在Java编程中,日志记录是不可或缺的一部分,它帮助开发者追踪程序运行状态,定位错误,以及进行性能分析。Log4j是Apache组织开发的一个开源日志框架,它是Java日志处理领域的经典工具,...

    使用Log4j进行日志操作.zip_java 操作日志_java 日志_log4j_系统日志

    Log4j是Java编程语言中广泛使用的日志记录框架...总的来说,Log4j作为Java日志记录的标准工具,因其灵活性、可配置性和强大的功能而备受推崇。了解和熟练掌握Log4j的使用,对任何Java开发者来说都是非常有价值的技能。

    log4j删除前N天日志

    Log4j是一个广泛使用的开源日志记录框架,提供灵活的日志配置和强大的日志输出功能。本话题将深入探讨如何使用Log4j中的DailyRollingFileAppender配置来自动删除前N天的日志,以便保持日志文件的大小和数量在可控...

    tomcat下的log4j日志配置

    在使用 Apache Tomcat 作为服务器时,合理配置日志框架(如 Log4j)能够极大地提高开发效率和系统的可维护性。本文将详细介绍两种常见的 Log4j 配置方式:Tomcat 级别的统一日志管理和每个 web 应用分别配置 Log4j,...

Global site tag (gtag.js) - Google Analytics