日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录,在Apache网站jakarta.apache.org/log4j可以免费下载到Log4j最新版本的软件包。

  Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;日志信息的输出格式指定输出的内容。


案例篇

Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(.properties文件,键=值),本文案例使用Java特性文件

第一节 初识log4j

案例一

新建Java project(项目名为HelloWord-log4j),新建目录lib,添加jar文件,建包com.test,建类Test1,内容如下:

package com.test;

import org.apache.log4j.Logger;

public class Test1 {

  // 得到记录器
  private static Logger log = Logger.getLogger(Test1.class.getName());   public static void main(String[] args) {     // 插入记录信息
    log.info("Test log4j");   }
}

然后在src目录下新建一个配置文件,命名为log4j.properties,其内容如下:

log4j.rootLogger=INFO,appender1
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.SimpleLayout

运行,控制台输出如下内容:

INFO - Test log4j

 案例二

将案例一的配置文件log4j.properties移到com.test包下(或者将其移到项目根目录下),其内容不变,运行,控制台输出如下内容:

log4j:WARN No appenders could be found for logger (com.test.Test1).
log4j:WARN Please initialize the log4j system properly.

案例三

将案例一的配置文件log4j.properties重命名为test.properties,依然位于src目录下,其内容不变,运行,控制台输出如下内容:

log4j:WARN No appenders could be found for logger (com.test.Test1).
log4j:WARN Please initialize the log4j system properly.

这三个案例说明:只要log4j的配置文件名为log4j.properties且该配置文件在类根路径下,则程序可自动加载该配置文件,不用写任何代码,log4j就会初试化


第二节 PropertyConfigurator.configure

案例四

在案例三的基础上(也就是说现在配置文件位于src目录下,其名称为test.properties),修改代码如下:

package com.test;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator; public class Test1 {   // 得到记录器
  private static Logger log = Logger.getLogger(Test1.class.getName());   public static void main(String[] args) {     PropertyConfigurator.configure ("src\\test.properties");     // 插入记录信息
    log.info("Test log4j");   }
}

运行,控制台输出如下:

INFO - Test log4j

案例五

将案例四中的配置文件移到com.test包下

将代码中的PropertyConfigurator.configure ("src\\test.properties")修改为PropertyConfigurator.configure ("src\\com\\test\\test.properties")

运行,控制台输出如下:

INFO - Test log4j

案例六

将案例四中的配置文件移到项目根目录下

将代码中的PropertyConfigurator.configure ("src\\test.properties")修改为PropertyConfigurator.configure ("test.properties")

运行,控制台输出如下:

INFO - Test log4j

案例七

在案例四的基础上,在项目中新建目录conf,将配置文件移到该目录下

将代码中的PropertyConfigurator.configure ("src\\test.properties")修改为PropertyConfigurator.configure ("conf\\test.properties")

运行,控制台输出如下:

INFO - Test log4j

案例三、四、五、六、七说明:可以通过PropertyConfigurator.configure("");语句来加载自定义命名的配置文件(包括log4j.properties),但是得明确指定配置文件的放置目录


第三节 Properties

案例八

利用Properties类,配合new FileInputStream("")来加载配置文件,在案例七的基础上(此时配置文件位于conf目录下,其名称为test.properties),修改代码如下:

package com.test;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties; import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator; public class Test1 {   // 得到记录器
  private static Logger log = Logger.getLogger(Test1.class.getName());   public static void main(String[] args) {     Properties props = new Properties();
    try {
      props.load(new FileInputStream("conf\\test.properties"));
    } catch (IOException e) {
      e.printStackTrace();
    }
    PropertyConfigurator.configure(props);     // 插入记录信息
    log.info("Test log4j");   }
}

运行,控制台输出如下:

INFO - Test log4j

案例九

将案例八中的配置文件移到其它目录下时(如:项目根目录或src目录或com.test包),需要相应改变代码中new FileInputStream("conf\\test.properties")中配置文件的路径,如:当配置文件位于com.test包下时,修改该语句为new FileInputStream("src\\com\\test\\test.properties")

案例八、九说明:利用Properties类,配合new FileInputStream("")读取配置文件时仍然需要使用PropertyConfigurator.configure("")语句,与直接使用PropertyConfigurator.configure("")语句没有什么太大区别;那么为什么要使用案例八/九中更为繁琐的方式呢,这样做有什么好处吗???

答案:利用Properties类可以不使用配置文件,可以直接在代码中通过使用Properties类对象来设定Log4j环境,如下代码所示:

private static void initLog4j() {
  Properties prop = new Properties();   prop.setProperty("log4j.rootLogger", "DEBUG, CONSOLE");
  prop.setProperty("log4j.appender.CONSOLE", "org.apache.log4j.ConsoleAppender");
  prop.setProperty("log4j.appender.CONSOLE.layout", "org.apache.log4j.PatternLayout");
  prop.setProperty("log4j.appender.CONSOLE.layout.ConversionPattern", "%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n");   PropertyConfigurator.configure(prop);
}

第四节 ClassLoader

案例十

利用Properties类,配合ClassLoader来加载配置文件,在案例八的基础上,将配置文件移到src目录下,修改代码如下:

package com.test;

import java.io.IOException;
import java.util.Properties; import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator; public class Test1 { // 得到记录器
private static Logger log = Logger.getLogger(Test1.class.getName());   public static void main(String[] args) {     ClassLoader loader = Test1.class.getClassLoader();     Properties props = new Properties();
    try {
      System.out.println(loader.getResource(""));
      props.load(loader.getResourceAsStream("test.properties"));
    } catch (IOException e) {
      e.printStackTrace();
    }
    PropertyConfigurator.configure(props);     // 插入记录信息
    log.info("Test log4j");   } }

运行,控制台输出如下:

INFO - Test log4j

解说:可以发现,上述代码中没有src的身影,如果将路径改为src\\test.properties,然后运行程序,程序报错;

将配置文件移到项目根目录下,然后运行程序,程序报错;

将配置文件移到com.test包下,也只需将路径修改为com\\test\\test.properties,程序即可正常运行

此处的原因在于,loader.getResource("")读取的路径是bin目录(ClassPath目录)


小结:

代码中需要配置这些路径的原因之一在于IDE暗中帮我们做了一些事情,当你在src目录下新建文件时,它会自动将其发布到ClassPath目录(默认为bin目录)下,那代码中为什么写成src而不是bin呢


番外篇

日志信息的格式

说明:本文参考资料(2)中有一些示例指定了日志信息的输出格式,此处截图为证,O(∩_∩)O哈哈~

解说:Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

  %c 输出所属的类名,通常就是所在类的全名

  %f 输出所属的类名,包括扩展名

  %t 输出产生该日志事件的线程名

  %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数

    举例:Testlog4.main(TestLog4.java:10)

  %m 输出代码中指定的消息,如log.info(message)中的message

  %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL


参考资料:

(1)http://www.codeceo.com/article/log4j-usage.html

(2)http://blog.sina.com.cn/s/blog_541caaee010121gy.html


一篇好文:Java日志性能那些事http://www.infoq.com/cn/articles/things-of-java-log-performance

Java日志(一):log4j与.properties配置文件的更多相关文章

  1. log4j application.properties 配置文件

    log4j.rootLogger = info,stdout log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appende ...

  2. 170512、java日志文件log4j.properties配置详解

    一.Log4j配置 第一步:加入log4j-1.2.8.jar到lib下. 第二步:在CLASSPATH下建立log4j.properties.内容如下: 放在src下的话就不用配置 否则得去web. ...

  3. java日志文件log4j.properties配置详解

    一.Log4j配置 第一步:加入log4j-1.2.8.jar到lib下. 第二步:在CLASSPATH下建立log4j.properties.内容如下: 放在src下的话就不用配置 否则得去web. ...

  4. Log4j之properties配置文件详解

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

  5. java日志框架log4j详细配置及与slf4j联合使用教程

    最后更新于2017年02月09日 一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” <d ...

  6. [转载]java日志框架log4j详细配置及与slf4j联合使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...

  7. java日志框架log4j详细配置及与slf4j使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...

  8. 拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系

    log4j 以及 logback, slf4j 官网 日志框架的困惑 作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题. 但是,我们经常在项目的依赖中,见到奇奇怪 ...

  9. JAVA魔法堂:读取.properties配置文件

    一.前言 Java工程中想log4j.数据库连接等配置信息一般都写在.properties文件中,那么如何读取这些配置信息呢?下面把相关方法记录下来供以后查阅. 二..properties文件 配置文 ...

随机推荐

  1. 2014-2015 ACM-ICPC East Central North America Regional Contest (ECNA 2014) A、Continued Fractions 【模拟连分数】

    任意门:http://codeforces.com/gym/100641/attachments Con + tin/(ued + Frac/tions) Time Limit: 3000/1000 ...

  2. (第三场) C Shuffle Cards 【STL_rope || splay】

    题目链接:https://www.nowcoder.com/acm/contest/141/C 题目描述 Eddy likes to play cards game since there are a ...

  3. PHP设计模式——装饰器模式

    <?php /** * 装饰器模式 * 如果已有对象的部分内容或功能发生变化,但是不需要修改原始对象的结构,应使用装饰器模式 * * 为了在不修改对象结构的前提下对现有对象的内容或功能稍加修改, ...

  4. 【洛谷P2296】[NOIP2014]寻找道路

    寻找道路 题目链接 这道题非常的水,按照题意, 先反向建边,从终点搜索,标记出可以到达终点的点 然后枚举一遍,判断出符合条件1的点 再从起点搜索一遍就可以了 #include<iostream& ...

  5. code First 三 Fluent API

    Entity Framework Fluent API用于配置域类以覆盖约定. 在实体框架6中,DbModelBuilder类充当Fluent API,我们可以使用它来配置许多不同的东西.它提供了比数 ...

  6. JS JavaScript实现杨辉三角

    1       1 1      1 2 1    1 3 3 1   1 4 6 4 1 1 5 10 10 5 1 ........ 观察这样的一组数,找出规律,用控制台输出这样规律的数 规律:这 ...

  7. ccenteros 部署 redis

    step one :  yum install redis    -- 安装redis数据库 step two:安装完成之后开启redis 服务 service redis start   syste ...

  8. WKWebView简单使用及关于缓存的问题

    Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7.支持到IOS8 ...

  9. 搭建基本的React Native开发环境

    步骤如下: 1.安装HomeBrew,命令如下: 在终端输入命令:$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Home ...

  10. WebGL学习笔记(2)

    根据上一篇学习笔记,理解WebGL的工作原理及基本调用代码后,可以开始研究3D顶点对象的缩放.旋转.以及对对象进行可交互(鼠标或键盘控制)的旋转或者缩放. 要理解对象的旋转/缩放需要首先学习矩阵的计算 ...