1 什么是Log4j

Log4j 是Apache为Java提供的日志管理工具。为了你快速理解Log4j的作用,我们用下面的代码说明Log4j的作用。我们为了调试程序,总是需要在程序使用System.out.println()来输出一些信息。例如下面的代码:

// 获取UserService

UserService userService = UserServiceFactory.getUserService();

if(userService == null) {

System.out.println("错误:userService没有获取到!");

return;

}

// 获取要查询的User对象id

String uid = request.getParameter("uid");

int id;

try {

id = Integer.parseInt(uid);

} catch(NumberFormatException e) {

System.out.println("错误:无法将uid转换成int类型!");

throw e;

}

// 查询User

User user = userService.load(id);

System.out.println("信息:已查询到User对象");

user.setPassword("xushouwei");

System.out.println("信息:修改user的密码");

userService.save(user);

System.out.println("信息:保存user信息");

上面例子中所有的输出语句都是用来调试程序的,相信你的代码中也经常会出现这样的调试代码吧?这些调试代码必须在项目完成后删除。你想一想,一行一行的删除会不会忘记几行没有删除呢?

使用Log4j来打印这些测试代码,然后通过配置文件就能统一管理这些日志信息了!我们可以在配置文件中关闭所有日志,也可以在配置文件中打开所有日志,也可以打开某个级别的日志。甚至还可以管理日志出现的格式(是否加上日期和时间),以及日志输出的目标(是否为控制台,是否为文件)。

2 Log4j核心概念

Log4j中有三大组件:日志器(Logger)、日志输出目标(Appender)、格式化器(Layout)

l  Logger:用来输出日志消息的类,它可以输出不同级别的消息,例如错误消息、警告消息等;

l  Appender;通常我们希望日志输出到文件中,以及控制台,也可能希望日志输出数据库,该类就表示一个输出的目标;

l  Layout:对输出的消息进行格式化,例如在消息中添加日期,以及级别等。

3 Hello Log4j

public class Demo {

//创建日志器,日志器的名称为当前类的类名

static Logger log = Logger.getLogger(Demo.class.getName());

static {

  //创建发送器,使用简单格式化器

Appender appender = new ConsoleAppender(new SimpleLayout());

  //加载这个发送器

BasicConfigurator.configure(appender);

}

@Test

public void fun() {

//输出info消息

log.info("hello log4j!") ;

}

}


Logger

1 日志级别

在Log4j中日志消息分为五个级别,级别由高到低排列如下:

l  FATAL:重大错误,例如系统崩溃;

l  ERROR:错误,例如某模块瘫痪;

l  WARN:警告,程序的隐患,如果不处理,将来可能就是错误;

l  INFO:信息,可以用来查看程序执行的流程;

l  DEBUG:调试,用来调试程序的bug。

我们可以使用日志器输出这五种不同的日志,然后通过设置日志器的级别来控制输出的结果。来看下面的代码:

@Test

public void fun() {

  //设置日志级别为ERROR

log.setLevel(Level.ERROR) ;

log.debug("hello log4j!");

log.info("hello log4j!");

log.warn("hello log4j!");

log.error("hello log4j!");

log.fatal("hello log4j!");

  //输出成功!

}


上面代码中,只有error()和fatal() 两个方法的输出会完成,其他级别的输出都不会完成。因为设置日志器的级别为Level.ERROR后,只有高于ERROR级别的日志才能输出。

2 日志器名称

  在创建日志器时,需要给日志器指定一个名称:Logger log = Logger.getLogger(“hello”);日志器的名称不只是一个名称而已,日志器的名称说明了日志器之间的父子关系。子日志器会继承父日志器的Appender和Level。日志器的父子关系是通过日志器的名称来决定的,例如名称为cn.itcast的日志器是com.xushouwei.logger的日志器的爸爸。com.xushouwei.logger会继承com.xushouwei的Appender以及Level。

@Test

public void fun() {

Logger log = Logger.getLogger("com.xushouwei");

Appender appender = new ConsoleAppender(new SimpleLayout());

BasicConfigurator.configure(appender);

  //创建名称为com.xushouwei的日志器

log.setLevel(Level.ERROR);

  //创建名称为com.xushouwei.lgger的日志器,它继承名为com.xushouwei的格式化器

Logger log1 = Logger.getLogger("com.xushouwei.logger");

log1.debug("看不见!");

}


通常我们创建日志器都是使用当前类的名称来创建:

Logger log = Logger.getLogger(Demo.class.getName());

这样我们可以通过配置父日志器来改变日志器的Appender和Level。

配置文件

1 log4j配置概述

log4j有两种配置文件,log4j.properties和log4j.xml。因为log4j是比较简单的组件,所以建议使用log4j.properties。

如果你把log4j放到项目的src下(即放到classes下),并且命名为log4j.properties,那么log4j会自动加载这个配置文件,这也是我们最为常用的方式。

2 根日志器

在配置文件中,需要配置名为log4j.rootLogger的日志器,它就是根日志器。其他的日志器都是根日志器的子日志器,会继承根日志器的发送器,以及级别等。

log4j.properties

log4j.rootLogger=DEBUG,A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.layout=org.apache.log4j.SimpleLayout

l  log4j.rootLogger表示根日志器,DEBUG是指定根日志器的输出级别,只要大于等于DEBUG级别的日志就可以输出。A1是说明发送器(Appender)的名称;

l  log4j.appender.A1表示发送器,org.apache.log4j.ConsoleAppender表示发送器为控制台发送器,即输出结果在控制台上显示;

l  log4j.appender.A1.layout表示A1这个发送器的格式化器,org.apache.log4j.SimpleLayout表示简化格式化器。

public void fun1() {

Logger log = Logger.getLogger(Demo1.class);

log.debug("Hello");

}

3 其他日志器

当然,也可以去配置其他的日志器,语法如下:

log4j.rootLogger=DEBUG,A1

log4j.logger.cn.itcast=WARN,A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.layout=org.apache.log4j.SimpleLayout

  我们不只配置了一个根日志器,还配置了一个名称为com.xushouwei的日志器。继承关系你是懂得对吧。所有日志器如果名称是以com.xushouwei前缀的,那么都会继承上面的配置,如果不是,那么继承的就是root日志器了。

Appender

1 Appender概述

Appender是用来指定输出目标的类,你可以叫它发送器。上面我们使用的ConsoleAppender就是用来向控制台输出的发送器。常用的发送器有:

l  ConsoleAppender:向控制台输出日志;

l  FileAppender:向文件输出日志

l  DailyRollingFileAppender:向文件输出日志,每天一个日志文件;

l  RollingFileAppender:向文件输出日志,当文件大小达到指定大小后,生成新文件;

2 ConsoleAppender

ConsoleAppender的目标是控制台!这也不多做解释

log4j.rootLogger=DEBUG,A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.layout=org.apache.log4j.SimpleLayout

3 FileAppender

FileAppender的目标是磁盘文件

log4j.rootLogger=DEBUG,A1

//指定AI发送器的类型为FileAppender

log4j.appender.A1=org.apache.log4j.FileAppender

//指定A1发送器的目标文件为log.txt

log4j.appender.A1.File=log.txt

//指定追加方式为true,即不会覆盖原有日志信息。默认即为true,所以可以不给出这个配置

log4j.appender.A1.Append=true

//指定发送器的格式化器为简单格式化器

log4j.appender.A1.layout=org.apache.log4j.SimpleLayout


4 RollingFileAppender

RollingFileAppender是FileAppender的子类,它的作用是当日志文件大小超出文件大小大限时,会把日志文件转换成备份文件,然后再生成一个新的日志文件。

例如日志文件名为log.txt,设置文件大小上限为1KB,当log.txt文件的大小超出了1KB后,把log.txt的名称转换成log.txt.1,然后再生成一个log.txt,新的日志会写入到新的log.txt文件中。当log.txt的大小再次达到1KB时,把log.txt.1名称修改成log.txt.2,把log.txt修改成log.txt.1,然后再生成一个新的log.txt文件。

还可以设置文件的个数,当设置备份文件的个数为3时,表示最多可以有3个文件。当文件达到3后,再次达到1KB时,那么会删除最后一个文件。例如当前已经存在log.txt、log.txt.1、log.txt.2,这时如果log.txt又达到了1KB时,那么删除log.txt.2,然后把log.txt.1修改成log.txt.2,再把log.txt修改成log.txt.1,然后再创建log.txt文件。

log4j.rootLogger=DEBUG,A1

//指定A1发送器的类型

log4j.appender.A1=org.apache.log4j.RollingFileAppender

//指定A1发送器的目标文件

log4j.appender.A1FILE.File=log.txt

//指定文件大小上限为1KB

log4j.appender.A1.MaxFileSize=1KB

//指定多大个日志文件

log4j.appender.A1.MaxBackupIndex=3

//指定格式化器类型

log4j.appender.A1.layout=org.apache.log4j.SimpleLayout


4 DailyRollingFileAppender

DailyRollingFileAppender会根据设定的时间频率生成备份文件。

l  当时间频率为yyyy-MM:按月生成备份文件;

l  当时间频率为yyyy-ww:按周生成备份文件;

l  当时间频率为yyyy-MM-dd:按天生成备份文件;

l  当时间频率为yyyy-MM-dd-a:每天生成两次备份;

l  当时间频率为yyyy-MM-dd-HH:按小时生成备份文件;

l  当时间频率为yyyy-MM-dd-HH-mm:按分钟生成备份文件。

log4j.rootLogger=DEBUG,A1

//指定A1发送器的类型

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender

//指定A1发送器的目标文件

log4j.appender.A1.File=log.txt

//指定A1发送器的时间频率为每天生成一个备份文件。时间频率也是备份文件的后缀名,例如:log.txt.2015-05-30,如果没有给出’.’,那么就是log.2015-05-30

log4j.appender.A1.DatePattern='.'yyyy-MM-dd

log4j.appender.A1.layout=org.apache.log4j.SimpleLayout


Layout

1 Layout种类

  我们需要给发送器指定格式化器,这样发送器就可以按照格式化器指定的格式来输出日志信息了。我们刚刚一直都在使用SimpleLayout格式化器,而我们常用的格式化器是PatternLayout!

2 PatternLayout

可以为PatternLayout指定一个模板,发送器会按模板来输出日志信息。例如模板为:hello: %m,其中%m是一个模式字符,下面介绍一下模式字符:

l  %m:信息本身;

l  %c:日志器的名称;

l  %d:日期,还可以指定日期的格式,例如:%d{yyyy-MM-dd HH:mm:ss};

l  %p:日志级别;

l  %n:换行;

l  %t:当前线程;

l  %l:输出日志的Java类相关信息。

在web项目中的配置

log4j.rootLogger=INFO,c1, f1

log4j.appender.c1=org.apache.log4j.ConsoleAppender

log4j.appender.c1.layout=org.apache.log4j.PatternLayout

log4j.appender.c1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m [%t] %c [%l]%n

//指定tomcat的logs目录存放日志文件,如果希望存放到项目目录下,可以使用绝对路径。

log4j.appender.f1.File=${catalina.home}/logs/myproject.txt

log4j.appender.f1=org.apache.log4j.DailyRollingFileAppender

log4j.appender.f1.layout=org.apache.log4j.PatternLayout

log4j.appender.f1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m [%t] %c [%l]%n


指定tomcat的logs目录存放日志文件,如果希望存放到项目目录下,可以使用绝对路径。

浅谈Log4j的更多相关文章

  1. 浅谈Log4j和Log4j2的区别

    相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程.我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代. log4j是Apache的 ...

  2. 浅谈一下SSI+Oracle框架的整合搭建

    浅谈一下SSI+Oracle框架的整合搭建 最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所 ...

  3. 谁还没遇上过NoClassDefFoundError咋地——浅谈字节码生成与热部署

    谁还没遇上过NoClassDefFoundError咋地--浅谈字节码生成与热部署 前言 在Java程序员的世界里,NoClassDefFoundError是一类相当令人厌恶的错误,因为这类错误通常非 ...

  4. 浅谈Spring中的Quartz配置

    浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...

  5. Java线上问题排查神器Arthas快速上手与原理浅谈

    前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...

  6. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  7. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  8. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  9. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

随机推荐

  1. 关于日期条件查询的sql 代码

    daysqhql = "select sum(c.casenum) from domain.Case c where" + " convert(varchar(10),c ...

  2. HDU 1160 FatMouse's Speed 动态规划 记录路径的最长上升子序列变形

    题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了 ...

  3. POJ 1062 昂贵的聘礼详解最短路变形

    POJ上难得一见的中文题…… 思路:建立一个以0为源点的地图,那么Map[0][n]的值代表 第n号物品的价值,Map[i][j]代表用 j  替代 i 后,物品j的价值.我们认为酋长的承诺为节点 ‘ ...

  4. css选择器的优先级别

    <html><head lang="en"> <meta charset="UTF-8"> <title>< ...

  5. ibus用上搜狗拼音词库

    1.下载搜狗拼音词库 wget http://hslinuxextra.googlecode.com/files/sougou-phrases-full.7z 2.用sougou-phrases-fu ...

  6. Block 朴实理解

    转载自:http://www.cnblogs.com/lzz900201/archive/2013/04/17/3025340.html block是个什么玩意儿 Block是Apple Inc.为C ...

  7. APK自我保护方法

    标 题: [原创]APK自我保护方法 作 者: MindMac 时 间: 2013-12-28,21:41:15 链 接: http://bbs.pediy.com/showthread.php?t= ...

  8. Arduino IDE 添加DHT11传感器第三方库的方法

    由于Arduino本身没有DHT 11温湿度传感器的的头文件,单有第三方的库可以给我门使用.方法如下: Step 1:如果你已经下载了最新版的Arduino IDE就可以使用其自带的库管理器和版型管理 ...

  9. The 2014 ACMICPC Asia Regional Guangzhou Online

    [A]-_-/// [B]线段树+位运算(感觉可出) [C]地图BFS,找最长线 [D]地图BFS,加上各种复杂情况的最短路-_- [E]-_-/// [F]三分+圆与线段的交点,计算几何 [G]-_ ...

  10. 使用PHPmailer 发送邮件,使用QQ smtp服务器

    <meta charset="utf-8"> <?php include("class.phpmailer.php"); include(&q ...