log4j

 

 

一、简介

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

二、主要组件

Log4j由四个重要的组件构成:

----------------------------简要说明----------------------------------------

(1)、日志的构造类:日志的构造类是如何获取该日志;

(2)、日志信息的优先级:日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;

(3)、日志信息的输出目的地:日志信息的输出目的地指定了日志将打印到控制台还是文件中;

(4)、日志信息的输出格式。而输出格式则控制了日志信息的显示内容。

----------------------------详细说明----------------------------------------

(1)、公共类 Logger

Logger 负责处理日志记录的大部分操作。日志记录器(Logger)是日志处理的核心组件。 

有很多方法可以创建一个日志记录器(Logger)

下面方法可以取回root日志记录器:

Logger logger = Logger.getRootLogger();

还可以这样创建一个新的日志记录器:

Logger logger = Logger.getLogger("MyLogger");

比较常用的用法,就是根据类名实例化一个静态的全局日志记录器:

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

(2)、log4j具有5种正常级别(Level)。 日志记录器(Logger)的可用级别Level (不包括自定义级别 Level)

static Level DEBUG

DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。

static Level INFO

INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。

static Level WARN

WARN level表明会出现潜在错误的情形。

static Level ERROR

ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。

static Level FATAL

FATAL level指出每个严重的错误事件将会导致应用程序的退出。

另外,还有两个可用的特别的日志记录级别: 

static Level ALL

ALL Level是最低等级的,用于打开所有日志记录。

static Level OFF

OFF Level是最高等级的,用于关闭所有日志记录。

日志记录器(Logger)的行为是分等级的。

(3)、公共接口 Appender

Appender 负责控制日志记录操作的输出。

Appender 控制日志怎样输出。下面列出一些可用的Appender

ConsoleAppender:使用用户指定的布局(layout) 输出日志事件到System.out或者 System.err。默认的目标是System.out。

DailyRollingFileAppender 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录。

FileAppender 把日志事件写入一个文件

RollingFileAppender 扩展FileAppender备份容量达到一定大小的日志文件。

WriterAppender根据用户的选择把日志事件写入到Writer或者OutputStream。

SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件。

SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

SyslogAppender给远程异步日志记录的后台精灵程序(daemon)发送消息。

TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender。

还可以实现 Appender 接口,创建以自己的方式进行日志输出的Appender。

(4)、公共抽象类Layout

Layout 负责格式化Appender的输出。

Appender必须使用一个与之相关联的 Layout,这样它才能知道怎样格式化它的输出。当前,log4j具有三种类型的Layout:

HTMLLayout 格式化日志输出为HTML表格。

PatternLayout 根据指定的 转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式。

SimpleLayout 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息。

例子:

package com.test;

 

//import org.apache.log4j.HTMLLayout;

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.log4j.SimpleLayout;

import org.apache.log4j.FileAppender;

 

public class Simpandfile {

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

 

public static void main(String args[]) {

// HTMLLayout layout = new HTMLLayout();

SimpleLayout layout = new SimpleLayout();

FileAppender appender = null;

try {

appender = new FileAppender(layout, "output1.txt", false);

} catch (Exception e) {

}

logger.addAppender(appender);

logger.setLevel((Level) Level.DEBUG);

logger.debug("Here is some DEBUG");

logger.info("Here is some INFO");

logger.warn("Here is some WARN");

logger.error("Here is some ERROR");

logger.fatal("Here is some FATAL");

}

}

也可以直接配置xml文件或者properties格式文件,直接读取

三、使用外部配置文件

Log4j经常与外部日志文件联合使用,这样很多可选项不必硬编码在软件中。使用外部配置文件的优点就是修改可选项不需要重新编译程序。唯一的缺点就是,由于用到io 指令,速度稍微有些减慢。

有两个方法可以用来指定外部配置文件:文本文件或者XML文件。下面的XML配置文件示例:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">

      <layout class="org.apache.log4j.SimpleLayout"/>

    </appender>

    <root>

      <priority value ="debug" />

      <appender-ref ref="ConsoleAppender"/>

    </root>

</log4j:configuration>    

 

程序运用时:

import org.apache.log4j.Logger;

import org.apache.log4j.xml.DOMConfigurator;

public class externalxmltest {

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

   public static void main(String args[]) {

      DOMConfigurator.configure("xmllog4jconfig.xml");

      logger.debug("Here is some DEBUG");

      logger.info("Here is some INFO");

      logger.warn("Here is some WARN");

      logger.error("Here is some ERROR");

      logger.fatal("Here is some FATAL");

   }

}   

四、properties配置,建议使用这种配置即可

配一个文件:

log4j.properties

#设置级别,目的地

log4j.rootLogger=INFO,console,file,everyFile

 

 

########输出到本地

#1.定义控制器

log4j.appender.console=org.apache.log4j.ConsoleAppender

#2.定义布局模式

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

#3.定义输出格式

log4j.appender.console.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}---%r--%c--%t--%l--%m:%n

 

 

#########输出到单个文件 

log4j.appender.file=org.apache.log4j.FileAppender

log4j.appender.file.File=Main_LOG4j.html

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

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

 

#########输出到每日一个文件 

log4j.appender.everyFile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.everyFile.File=myLog.log

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

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

log4j.appender.everyFile.layout.ConversionPattern=[%d] [%t] (%F:%L) %-5p %c - %m%n

 

---------------------------------------------------------------------------------------------------------

我相信这种配置,足以应对大部分需求了···

 

 

package com;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LogTestMain {
	private static transient Log log = LogFactory.getLog(LogTestMain.class);

	public static void main(String[] args) {
		if(log.isInfoEnabled()){
			log.info("info---");
		}
		log.error("error");
		try{
			int n = 1,m = 1;
			n = n/(n-m);
		}catch(Exception e){
			log.warn(e);
		}
	}

}

 

 

这里没有特意用下面的配置去读取配置文件

PropertyConfigurator.configure("log4j.properties");

 

因为如果配置文件默认为log4j.properties时,不用特意读取。

 

参数配置:

 

在配置文件中可以通过log4j.appender.file.layout.ConversionPattern设置日志输出格式。 
参数: 
%p: 输出日志信息优先级,即DEBUGINFOWARNERRORFATAL, 
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018日 221028921 
%r: 输出自应用启动到输出该log信息耗费的毫秒数 
%c: 输出日志信息所属的类目,通常就是所在类的全名 
%t: 输出产生该日志事件的线程名 
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) 
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 
%%: 输出一个%字符 
%F: 输出日志消息产生时所在的文件名称 
%L: 输出代码中的行号 
%m: 输出代码中指定的消息,产生的日志具体信息 
%n: 输出一个回车换行符,Windows平台为\r\nUnix平台为\n输出日志信息换行 
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,-号指定左对齐。 
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

 

 

五、更详细的配置:

http://logging.apache.org/log4j/1.2/index.html 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值