Log4J是Apache的一个开放源代码的项目。通过使用Log4J,程序员可以控制日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也可以控制每一条日志的输出格式,或通过定义每一条日志信息的级别,更加细致地控制日志的生成过程。

一、Log4j的组成

Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。
Appender、Layout分别是输出端和日志格式化器的祖先,下图显示了他们的对应关系。

日志记录器Logger:控制要输出哪些日志记录语句,并对日志信息进行级别限制。
Logger可以通过两种方式获取对象:Logger.getLogger(Class clazz);或Logger.getRootLogger();
其中getRootLogger()获取的是根Logger,是所有Logger的祖先,它有如下属性:
1)总是存在。
2)不可通过名称获取(配置文件情况下)。
调用Logger.getLogger(Class clazz)是目前获取logger对象最理想的方法。

日志级别Level:
每个Logger都将指定一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
A:off         最高等级,用于关闭所有日志记录。
B:fatal       指出每个严重的错误事件将会导致应用程序的退出。
C:error      指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warm     表明会出现潜在的错误情形。
E:info        一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug     一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all          最低等级,用于打开所有日志记录。
上面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果指定了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。

输出端Appenders:指定了日志输出位置,例如:控制台、文件、数据库等等。
Appender用来指定日志信息输出到哪个地方,可以同时指定多个输出目的地。Log4j允许将信息输出到许多不同的输出设备中,一个log信息输出目的地就叫做一个Appender。
每个Logger都可以拥有一个或多个Appender,每个Appender表示一个日志的输出目的地。可以使用Logger.addAppender(Appender app)为Logger增加一个Appender,也可以使用Logger.removeAppender(Appender app)为Logger删除一个Appender。
以下为Log4j几种常用的输出目的地。
a:org.apache.log4j.ConsoleAppender:将日志信息输出到控制台。
b:org.apache.log4j.FileAppender:将日志信息输出到一个文件。
c:org.apache.log4j.DailyRollingFileAppender:将日志信息输出到一个日志文件,并且每天输出到一个新的日志文件。
d:org.apache.log4j.RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件。
e:org.apache.log4j.WriteAppender:将日志信息以流格式发送到任意指定地方。
f:org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中。

日志格式化器Layout:控制日志信息的显示格式。
一个Appender只能指定一种layout输出格式。
常用日志格式化器有三种:
1、HTMLLayout:格式化日志输出为HTML表格形式。
2、SimpleLayout:以一种非常简单的方式格式化日志输出,它打印两项内容:级别-信息。例如:INFO – this is info
3、PatternLayout:根据指定的转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转化模式格式。

二、实例程序

package com.alfred.log.helloworld;

import java.io.IOException;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.HTMLLayout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.SimpleLayout; public class HelloWorld {
public static void main(String[] args) {
Logger logger = Logger.getLogger(HelloWorld.class);
// 使用默认的配置信息
BasicConfigurator.configure();
// 设置日志输出级别为warn,这将覆盖配置文件中设置的级别
logger.setLevel(Level.WARN);
logger.addAppender(new ConsoleAppender(new SimpleLayout()));
try {
logger.addAppender(new FileAppender(new HTMLLayout(),
"f://log.html", true));
logger.addAppender(new FileAppender(new PatternLayout(
"%d{HH:mm:ss} %p %C-%M [%m]%n"), "f://log.txt", true));
} catch (IOException e) {
e.printStackTrace();
}
// 下面的消息中级别大等于warn的将被输出
logger.info("helloworld info");
logger.warn("helloworld warn");
logger.error("helloworld error");
logger.fatal("helloworld fatal");
}
}

控制台输出结果:

log.html输出结果:

log.txt输出结果:

三、Log4j的配置

配置Log4j环境就是指配置root Logger,包括把Logger为哪个级别,为它增加哪些Appender,以及为这些Appender设置Layout,等等。因为所有其他的Logger都是root Logger的后代,所以它们都继承了root Logger的性质。这些可以通过设置系统属性的方法来隐式地完成,也可以在程序中调用XXXConfigurator.configure()方法来显式地完成。有以下几种方式来配置Log4j。
    A:配置放在文件里,通过环境变量传递文件名等信息,利用Log4j默认的初始化过程解析并配置。
    B:配置放在文件里,通过应用服务器配置传递文件甸等信息,利用一个特定的Servlet来完成配置。
    C:在程序中调用BasicConfigor.configure()方法。
    D:配置放在文件里,通过命令行PropertyConfigurator.configure(args[])解析log4j.properties文件并配置Log4j。

下面对BasicConfigurator.configure()方法和PropertyConfigurator.config()方法分别进行介绍。
1)BasicConfigurator.configure()方法:
    它使用简单的方法配置Log4j环境。这个方法完成的任务是:
    1:用默认的方式创建PatternLayout对象p:
    PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x-%m%n");
    2:用p创建ConsoleAppender对象a,目标是System.out,标准输出设备:
    ConsoleAppender a = new CpnsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
    3:为root Logger增加一个ConsoleAppender p;
    rootLogger.addAppender(p);
    4:把rootLogger的log level设置为DUBUG级别;
    rootLogger.setLevel(Level.DEBUG);

2)PropertyConfigurator.configure()方法:
    当使用以下语句生成Logger对象时:

static Logger logger = Logger.getLogger(mycalss.class);

如果没有调用BasicConfigurator.configure(),PropertyConfigurator.configure()或DOMConfigurator.configure()方法,Log4j会自动加载CLASSPATH下名为log4j.properties的配置文件。如果把此配置文件改为其他名字,例如my.properties,程序虽然仍能运行,但会报出不能正确初始化Log4j系统的提示。这时可以在程序中加上:

PropertyConfigurator.configure("classes/my.properties");

问题即可解决。

Log4j基础知识的更多相关文章

  1. 死磕面试 - Dubbo基础知识37问(必须掌握)

    作为一个JAVA工程师,出去项目拿20k薪资以上,dubbo绝对是面试必问的,即使你对dubbo在项目架构上的作用不了解,但dubbo的基础知识也必须掌握. 整理分享一些面试中常会被问到的dubbo基 ...

  2. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  3. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  4. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  5. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  6. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  7. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  8. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  9. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. python 版Faster Rcnn

    直接按照官网https://github.com/rbgirshick/py-faster-rcnn上的教程对faster Rcnn进行编译的时候,会发有一些层由于cudnn版本的更新,会报错如下: ...

  2. es倒排索引和正排索引

    搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values.在建立索引的时候,一方面会建立倒排索引, ...

  3. OC屏幕手势解锁

    感觉屏幕解锁好像很牛的样子,所以试着写了一个,代码很简单,手势用到的也是原生的,如果该代码帮助了你,记得点赞,如果该代码有任何问题,也可以随时和我联系.改代码用到的两张图片,是我随便找的两张,可以自行 ...

  4. 20170921 DEV功能页面

    环境:vs2013 DEV第三方控件 后端使用Linq to sql , lambda 表达式 页面格式

  5. vs 2017 集成python

    官网:https://docs.microsoft.com/en-us/visualstudio/python/installation

  6. mysql sysbench基准测试

    git项目地址: https://github.com/akopytov/sysbench 利用sysbench很容易对mysql做性能基准测试(当然这个工具很强大,除了测试主流数据库性能,还能测试其 ...

  7. Centos7安装Openvpn

    前言 搭建openvpn主要参考这篇博客,原文传送: http://www.jianshu.com/p/4bbf946222d5 所以你会发现步骤基本一样. 安装openvpn A:安装EPEL仓库 ...

  8. Redis cluster集群:原理及搭建

    Redis cluster集群:原理及搭建 2018年03月19日 16:00:55 阅读数:6120 1.为什么使用redis? redis是一种典型的no-sql 即非关系数据库 像python的 ...

  9. UML序列图的理解:

    UML序列图的理解:UML序列图是指一个对象的方法在处理过程中调用其他对象的图:重点是要突出调用其他对象的序列:

  10. [xdoj]1299&1300朱神的烦恼 朱神的序列

    http://acm.xidian.edu.cn/problem.php?id=1299 1.第一道题简单的很,数据范围最多只有1e4,对于数组中的每一个元素进行两个for循环,i=0;i<n; ...