尽管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 astack trace or the value of a variable or two. One reason is that itis easy to get lost in details of complicated data structures andcontrol flow; we find stepping through a program less productivethan thinking harder and adding output statements and self-checkingcode at critical places. Clicking over statements takes longer thanscanning the output of judiciously-placed displays. It takes lesstime to decide where to put print statements than to single-step tothe critical section of code, even assuming we know where thatis. 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.

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

转载于:https://blog.51cto.com/javaqun/1737307

Java日志系统学习之log4j!相关推荐

  1. Java日志框架学习--JUL和Log4j--上

    Java日志框架学习--JUL和Log4j--上 引言 日志框架 市面流行的日志框架 日志门面和日志框架的区别 JUL JUL简介 JUL组件介绍 实际使用 Logger之间的父子关系 默认配置文件位 ...

  2. Java日志框架学习笔记

    Java日志框架学习笔记 文章目录 0 主流Java日志框架 1 log4j 1.1 理论知识 1.1.1 Loggers日志记录器 1.1.2 Appenders输出端 1.1.3 Layout日志 ...

  3. Java日志系统概述SLF4J、log4j、JCL、Logback

    java日志系统经常遇到SLF4j,JCL,logback,log4j2等等.一些人可能要晕了怎么选择,这里简单说下. 发展 这些都要从Java日志框架的元老log4j说起.java1.3之前打日志都 ...

  4. Java日志系统01 ---- JUL日志

    目录 前言 简介 使用 日志对象的父子关系 前言 当前文章只是学习笔记,具体请点击超链接:视频 简介 JUL日志是JDK自带的日志工具.无需引入任何依赖.在日常开发中并不会使用到JUL日志,仅用来作为 ...

  5. java日志系统详解

    本文转自:点击打开链接 Java日志系统确实比较丰富,常用的有log4j.JUL.logback等等,同时伴随着日志系统的发展,出现了日志框架commons-logging和slf4j. 简短地描述下 ...

  6. Java日志框架SLF4J和log4j以及logback的联系和区别

    1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...

  7. 你为什么学不好Java?系统学习Java的七大因素

    随着传统行业的没落,越来越多的人准备进军互联网行业,如何学好Java成功就业的问题在网上越来越热,在知乎上面看了好多介绍学习方法的文章和一些优秀答主的高赞回答.多数创作都是围绕着学习什么技术比较专业性 ...

  8. Java日志系统02 ---- Log4j日志

    目录标题 前言 简介 使用 Maven依赖 快速测试代码 使用properties文件进行配置 开启内置日志 Log4j组件 日志系统的自定义配置 自定义消息输出格式 自定义输出方式 输出日志到文件 ...

  9. log4j linux如果日志目录不存在,Java日志库学习笔记

    (未完成,待修改) 一.安装Log4j log4j的库文件可以在官方网站下载: 二.log4j.properties的目录搜索规则 在src/目录下创建一个log4j.properties文件,即LC ...

  10. java日志管理-学习(一)

    java 日志学习一 SLF4J和Logback和Log4j和Logging的区别与联系 slf4j.apache common logging.log4j.logback SLF4J和Logback ...

最新文章

  1. BZOJ 1208 宠物饲养所 Splay
  2. 【清华集训2016】数据交互
  3. linux 定时任务
  4. Python学习11 继承
  5. 下载 Java 学习的权威文档
  6. 如何关闭系统日志服务器,已解决: 一台R410 服务器不定时宕机,系统日志只有“上一次系统是意外关闭” - Dell Community...
  7. IP防护等级测试设备(IPX1.2.3.4.5.6.9)
  8. 一文看雷击浪涌的防护解析
  9. .mat转成.npy文件+Python(Pytorch)压缩裁剪图片
  10. python小白系列1
  11. 查看QQ空间秘密的发布时间
  12. 纯CSS制作加div制作动画版哆啦A梦
  13. vim常用插件安装及使用
  14. 幼儿园案例经验迁移_多种形式培养幼儿的迁移讲述能力
  15. repo upload 或者git push 报错“remote: (W):commit subject 65 characters,use shorter first paragraph”
  16. tigergraph_TigerGraph启动图形数据库即服务
  17. 地图大量数据查询与渲染——bug及解决方案
  18. Android扮猪吃虎
  19. 软考高项 : (01)论信息系统项目的人力资源管理
  20. 全球最经典音乐推荐,装满mp3

热门文章

  1. 网站前端js-parseInt.html
  2. page compaction代码分析之一
  3. 深入解读Linux内存管理系列(8)——SLAB初始化
  4. WebRTC学习资料大全
  5. JM8.6之erc_api.c文件初探
  6. cgroup学习(七)——cpu子系统
  7. oracle ogg11.2下载,ogg config for sqlserver 2012 to oracle 11.2(ogg 12.1 to 12.2)
  8. android app 架构设计_这些冷门的App,好用到为你打开新世界大门
  9. 2014青岛初中组第2题 洪水 详解(C++)
  10. hdu1598-----Kruscal+枚举