Chinaunix首页 | 论坛 | 博客
  • 博客访问: 638575
  • 博文数量: 125
  • 博客积分: 8703
  • 博客等级: 中将
  • 技术积分: 1102
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-10 17:48
文章分类

全部博文(125)

文章存档

2012年(2)

2011年(3)

2010年(11)

2009年(1)

2008年(12)

2007年(58)

2006年(38)

分类: Java

2006-11-17 13:49:12

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

/**
 * 记录日志的JAVABEAN
 *
 * @author zhangyx
 * @version 1.0
 */
public class LogBean {
    /** Log的级别--DEBUG */
    public static final String DEBUG = "debug";

    /** Log的级别--INFO */
    public static final String INFO = "info";

    /** Log的级别--FATAL */
    public static final String FATAL = "fatal";

    /** Log的级别--ERROR */
    public static final String ERROR = "error";

    /** Log的级别--WAEN */
    public static final String WAEN = "warn";

    private Logger logger;

    /** 日志模块的名称 */
    private String name;

    /**
     * 根据日志模块名称构造
     *
     * @param name
     *            日志模块的名称
     */
    public LogBean(String name) {
        this.name = name;
        logger = Logger.getLogger(name);
        BasicConfigurator.configure();
    }

    /**
     * 输出日志方法
     *
     * @param level
     *            日志等级,该类的几个常量定义的级别,如果输入的没有在里面就显示为info
     * @param message
     *            日志的消息
     */
    public void write(String level, String message) {
        if (level.equalsIgnoreCase("fatal")) {
            logger.fatal(message);
        } else if (level.equalsIgnoreCase("error")) {
            logger.error(message);
        } else if (level.equalsIgnoreCase("warn")) {
            logger.warn(message);
        } else if (level.equalsIgnoreCase("debug")) {
            logger.debug(message);
        } else {
            logger.info(message);
        }
    }

    public static void main(String[] args) {
        LogBean log = new LogBean("数据库");
        log.write(LogBean.DEBUG, "数据库错误");
        LogBean log2 = new LogBean("管道");
        log2.write(LogBean.DEBUG, "管道连接失败");
        LogBean log3 = new LogBean("任务");
        log3.write(LogBean.DEBUG, "处理任务失败");

    }
}


配置文件 log4j.properties

log4j.rootLogger =ALL,dest1
#按日志文件大小进行回滚
log4j.appender.dest1=org.apache.log4j.RollingFileAppender
log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
log4j.appender.dest1.layout.ConversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss} [%c] %m%n
log4j.appender.dest1.File=log4j.log
log4j.appender.dest1.MaxFileSize=10000KB
#按月进行回滚
log4j.appender.dest2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dest2.Append=true
log4j.appender.dest2.DatePattern='.'yyyy-MM
log4j.appender.dest2.layout=org.apache.log4j.PatternLayout
log4j.appender.dest2.layout.ConversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss} [%c] %m%n
log4j.appender.dest2.File=log4j2.log
#按天进行回滚
log4j.appender.dest3=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dest3.Append=true
log4j.appender.dest3.layout=org.apache.log4j.PatternLayout
log4j.appender.dest3.layout.ConversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss} [%c] %m%n
log4j.appender.dest3.File=log4j2.log

下面是网上找到的一些资料
Log4j使用说明

    在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

log4j有三种主要的组件:记录器,存放器,布局

记录器(记录器可不关心log数据存放的事哟)
  log4j允许程序员定义多个记录器,每个记录器有自己的名字,记录器之间通过名字来表明隶属关系(或家族关系)。列如,记录器a.b,与记录器 a.b.c之间是父子关系,而记录器a与a.b.c之间是祖先与后代的关系,父子关系是祖先与后代关系的特例。通过这种关系,可以描述不同记录器之间的逻辑关系。
    有一个记录器叫根记录器,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法取得它,而一般记录器通过Logger.getLogger(String name)方法。下面是Logger类的基本方法。
import org.apache.log4j.*;
public class Logger {
   
    public static Logger getRootLogger();
    public static Logger getLogger(String name);
    // printing methods:
    public void debug(Object message);
    public void info(Object message);
    public void warn(Object message);
    public void error(Object message);
    public void fatal(Object message);
    // generic printing method:
    public void log(Level l, Object message);
}

    记录器还有一个重要的属性,就是级别。(这好理解,就象一个家庭中,成员间存在辈份关系,但不同的成员的身高可能不一样,且身高与辈份无关)程序员可以给不同的记录器赋以不同的级别,如果某个成员没有被明确值,就自动继承最近的一个有级别长辈的级别值。根记录器总有级别值。例如:
    记录器名    赋予的级别值    继承的级别值   
      root       Proot          Proot   
       X          Px              Px   
      X.Y        none             Px   
     X.Y.Z       none             Px   
    程序员可以自由定义级别。级别值之间存在偏序关系,如上面几种级别就有关系DEBUG


每一条要输出的log信息,也有一个级别值。
  前面的Logger类中,就预定义了 DEBUG, INFO, WARN, ERROR ,FATAL几种级别,由于与方法绑定,让人易产生误解,其实这几个方法只不过表明了要记录的log信息的级别。当调用log()方法时,log信息的级别就需要在通过参数明确指定。
       // 根据名字来定义Logger "com.topwalk"
       Logger  logger = Logger.getLogger("com.topwalk");

       // 现在定义级别,这是最低级别,小于他的级别将不在日志中显示
       logger.setLevel(Level.INFO);

       Logger barlogger = Logger.getLogger("com.topwalk.Bar");

       // This request is enabled, because WARN >= INFO.
       logger.warn("Low fuel level.");
       // This request is disabled, because DEBUG < INFO.
       logger.debug("Starting search for nearest gas station.");
       // The logger instance barlogger, named "com.foo.Bar",
       // will inherit its level from the logger named
       // "com.foo" Thus, the following request is enabled
       // because INFO >= INFO.
       barlogger.info("Located nearest gas station.");
       // This request is disabled, because DEBUG < INFO.
       barlogger.debug("Exiting gas station search");

    有几个有趣的情况,一是当一个记录器实例化后,再一次用相同的名字调用getLogger()会返回对它的引用,这非常有利于用同一个记录器在不同代码或类中记录log信息,另一个是与自然界中祖先先于后代出现不同,一个记录器的祖先可以比后代记录出现的晚,但会自动根据名字之间的关系建立这种家族关系。


存放器
  在log4j中,log信息通过存放器输出到目的地。支持的存放器有console, files, GUI components, remote socket servers, JMS, NT Event Loggers, remote UNIX Syslog daemons。通过file存放器,log信息可以被输出到不同的文件中(即不同的目的地)。log信息可被异步存放。
  一个记录器可以有多个存放器,可以通过方法addAppender来增加存放器。一条blog信息如果可被这个记录器处理,则记录器会把这条信息送往每个它所拥有的存放器。

布局
  布局负责格式化输出的log信息。log4j的PatternLayout可以让程序以类似C语言printf的格式化模板来定义格式。

    log4j可据程序员制定的标准自动提供一些log信息,这对那类需要频繁log的对象的情况很帮助。对象的自动log,具有继承性。


有几种方式可以配置Log4J
1)在程序中调用BasicConfigurator.configure()方法;
2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;
3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;
4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。


在加载的过程中,程序会读取/WEB-INF/log4j.properties这个文件。
配置文件讲解如下:
# Set root logger level to DEBUG and its only appender to A1
#log4j中有五级logger
#FATAL 0
#ERROR 3
#WARN 4
#INFO 6
#DEBUG 7
#配置根Logger,其语法为:
#log4j.rootLogger = [ level ] , appenderName, appenderName, …
log4j.rootLogger=INFO, A1 ,R
#这一句设置以为着所有的log都输出
#如果为log4j.rootLogger=WARN, 则意味着只有WARN,ERROR,FATAL
#被输出,DEBUG,INFO将被屏蔽掉.
# A1 is set to be a ConsoleAppender.
#log4j中Appender有几层如控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
#ConsoleAppender输出到控制台
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 使用的输出布局,其中log4j提供4种布局. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

log4j.appender.A1.layout=org.apache.log4j.PatternLayout
#灵活定义输出格式 具体查看log4j javadoc org.apache.log4j.PatternLayout
#d 时间 ....
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#R 输出到文件 RollingFileAppender的扩展,可以提供一种日志的备份功能。
log4j.appender.R=org.apache.log4j.RollingFileAppender
#日志文件的名称
log4j.appender.R.File=log4j.log
#日志文件的大小
log4j.appender.R.MaxFileSize=100KB
# 保存一个备份文件
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.TTCCLayout
#log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n


配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, ...

level 是日志记录的优先级
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。

配置日志信息输出目的地Appender,其语法为
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.option = valueN

Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
....
log4j.appender.appenderName.layout.option = valueN

Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

阅读(1959) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~