Logger.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:5k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: Logger.java,v 1.2 2000/04/06 08:02:02 wastl Exp $ */
  2. package net.wastl.webmail.server;
  3. import java.io.*;
  4. import java.util.*;
  5. import java.text.*;
  6. import net.wastl.webmail.misc.*;
  7. import net.wastl.webmail.config.*;
  8. /**
  9.  * Logger.java
  10.  *
  11.  * Created: Sun Sep 19 18:58:28 1999
  12.  *
  13.  * Copyright (C) 1999-2000 Sebastian Schaffert
  14.  * 
  15.  * This program is free software; you can redistribute it and/or
  16.  * modify it under the terms of the GNU General Public License
  17.  * as published by the Free Software Foundation; either version 2
  18.  * of the License, or (at your option) any later version.
  19.  * 
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU General Public License for more details.
  24.  * 
  25.  * You should have received a copy of the GNU General Public License
  26.  * along with this program; if not, write to the Free Software
  27.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  28.  */
  29. /**
  30.  * This is an asynchronous Logger thread that accepts log messages to a Queue and writes 
  31.  * them to the logfile from time to time (all 5 seconds).
  32.  *
  33.  * @author Sebastian Schaffert
  34.  * @version
  35.  */
  36. public class Logger extends Thread implements ConfigurationListener {
  37.     
  38.     private DateFormat df=null;
  39.     protected PrintWriter logout;
  40.     protected int loglevel;
  41.     protected Queue queue;
  42.     protected Queue time_queue;
  43.     protected boolean do_shutdown=false;
  44.     protected WebMailServer parent;
  45.     protected Storage store;
  46.     protected int interval;
  47.     public Logger(WebMailServer parent, Storage st) {
  48. this.parent=parent;
  49. this.store=st;
  50. parent.getConfigScheme().configRegisterIntegerKey(this,"LOGLEVEL","5",
  51.   "How much debug output will be written in the logfile");
  52. parent.getConfigScheme().configRegisterStringKey(this,"LOGFILE",
  53.  parent.getProperty("webmail.data.path")+
  54.  System.getProperty("file.separator")+
  55.  "webmail.log",
  56.  "WebMail logfile");
  57. parent.getConfigScheme().configRegisterIntegerKey(this,"LOG INTERVAL","5",
  58.   "Interval used for flushing the log buffer"+
  59.   " in seconds. Log messages of level CRIT or"+
  60.   " ERR will be written immediately in any way.");
  61. initLog();
  62. queue=new Queue();
  63. time_queue=new Queue();
  64. this.start();
  65.     }
  66.     
  67.     protected void initLog() {
  68. System.err.print("  * Logfile ... ");
  69. try {
  70.     loglevel=Integer.parseInt(store.getConfig("LOGLEVEL"));
  71. } catch(NumberFormatException e) {}
  72. try {
  73.     interval=Integer.parseInt(store.getConfig("LOG INTERVAL"));
  74. } catch(NumberFormatException e) {}
  75. try {
  76.     String filename=store.getConfig("LOGFILE");
  77.     logout=new PrintWriter(new FileOutputStream(filename,true));
  78.     System.err.println("initalization complete: "+filename+", Level "+loglevel);
  79. } catch(IOException ex) {
  80.     ex.printStackTrace();
  81.     logout=new PrintWriter(System.out);
  82.     System.err.println("initalization complete: Sending to STDOUT, Level "+loglevel);
  83. }
  84.     }
  85.     protected String formatDate(long date) {
  86. if(df==null) {
  87.     TimeZone tz=TimeZone.getDefault();
  88.     df=DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.DEFAULT, Locale.getDefault());
  89.     df.setTimeZone(tz);
  90. }
  91. String now=df.format(new Date(date));
  92. return now;
  93.     }
  94.     protected void writeMessage(long time, String message) {
  95. logout.println("["+formatDate(time)+"] - "+message);
  96.    }
  97.     
  98.     public void log(int level, String message) {
  99. if(level <= loglevel) {
  100.     String s="LEVEL "+level;
  101.     switch(level) {
  102.     case Storage.LOG_DEBUG: s="DEBUG   "; break;
  103.     case Storage.LOG_INFO: s="INFO    "; break;
  104.     case Storage.LOG_WARN: s="WARNING "; break;
  105.     case Storage.LOG_ERR: s="ERROR   "; break;
  106.     case Storage.LOG_CRIT: s="CRITICAL"; break;
  107.     }
  108.     queue(System.currentTimeMillis(),s+" - "+message);
  109.     if(level <= Storage.LOG_ERR) {
  110. flush();
  111.     }
  112. }
  113.     }
  114.     protected void flush() {
  115. while(!queue.isEmpty()) {
  116.     Long l=(Long)time_queue.next();
  117.     String s=(String)queue.next();
  118.     writeMessage(l.longValue(),s);
  119. }
  120. logout.flush();
  121.     }
  122.     public void queue(long time, String message) {
  123. queue.queue(message);
  124.         time_queue.queue(new Long(time));
  125.     }
  126.     public void notifyConfigurationChange(String key) {
  127. initLog();
  128.     }
  129.     public void shutdown() {
  130. flush();
  131. do_shutdown=true;
  132.     }
  133.     public void run() {
  134. while(!do_shutdown) {
  135.     flush();
  136.     try {
  137. sleep(interval*1000);
  138.     } catch(InterruptedException e) {}
  139. }
  140.     }
  141. } // Logger