Annotation of java/classes/org/w3c/jigsaw/http/ExtendedCommonLogger.java, revision 1.2

1.1       ylafon      1: // ExtendedCommonLogger.java
1.2     ! ylafon      2: // $Id: ExtendedCommonLogger.java,v 1.1 1999/02/01 14:56:56 ylafon Exp $
1.1       ylafon      3: // (c) COPYRIGHT MIT and INRIA, 1999.
                      4: // Please first read the full copyright statement in file COPYRIGHT.html
                      5: 
                      6: package org.w3c.jigsaw.http ;
                      7: 
                      8: import java.io.* ;
                      9: import java.util.Date ;
                     10: 
                     11: import org.w3c.jigsaw.daemon.*;
                     12: import org.w3c.jigsaw.auth.AuthFilter;
                     13: import org.w3c.util.*;
                     14: 
                     15: /**
                     16:  * The ExtendedCommonLogger class implements the abstract Logger class.
                     17:  * It just rotates the log every month and use the extended log format
                     18:  * @see org.w3c.jigsaw.http.CommonLogger
                     19:  */
                     20: 
                     21: 
                     22: public class ExtendedCommonLogger extends CommonLogger {
                     23:     private int month = -1;
                     24:     private int year  = -1;
                     25:     private int  tz   = -1;
                     26: 
                     27:     private static final String monthnames[] = {
                     28:        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                     29:        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
                     30:     };
                     31:        
                     32:     /**
                     33:      * Name of the property indicating the log file.
                     34:      * This property indicates the name of the log file to use.
                     35:      * <p>This property defaults to the <code>log</code> file in the server
                     36:      * log directory.
                     37:      */
                     38:     public static final 
                     39:     String LOGNAME_P = "org.w3c.jigsaw.logger.logname" ;
                     40:     /**
                     41:      * Name of the property indicating the error log file.
                     42:      * This property indicates the name of the error log file to use.
                     43:      * <p>This property defaults to the <code>errlog</code> file in the
                     44:      * server log directory.
                     45:      */
                     46:     public static final 
                     47:     String ERRLOGNAME_P = "org.w3c.jigsaw.logger.errlogname" ;
                     48:     /**
                     49:      * Name of the property indicating the server trace file.
                     50:      * This property indicates the name of the trace file to use.
                     51:      * <p>This property defaults to the <code>trace</code> file in the 
                     52:      * server log directory.
                     53:      */
                     54:     public static final 
                     55:     String TRACELOGNAME_P = "org.w3c.jigsaw.logger.tracelogname";
                     56:     /**
                     57:      * Name of the property indicating the buffer size for the logger.
                     58:      * This buffer size applies only the the log file, not to the error
                     59:      * log file, or the trace log file. It can be set to zero if you want
                     60:      * no buffering.
                     61:      * <p>This property default to <strong>4096</strong>.
                     62:      */
                     63:     public static final 
                     64:     String BUFSIZE_P = "org.w3c.jigsaw.logger.bufferSize";
                     65: 
                     66:     private   byte                 msgbuf[] = null ;
                     67: 
                     68:     protected void openLogFile() {
                     69:        // do nothing
                     70:     }
                     71: 
                     72:     protected void openLogFile(int year, int month) {
                     73:        this.year = year;
                     74:        this.month = month;
                     75:        
                     76:        String ext = null;
                     77:        if (month < 9)
                     78:            ext = "_"+year+"_0"+(month+1);
                     79:        else
                     80:            ext = "_"+year+"_"+(month+1);
                     81: 
                     82:        String logname = getFilename(LOGNAME_P, "log") + ext;
                     83:        try {
                     84:            RandomAccessFile old = log ;
                     85:            log = new RandomAccessFile (logname, "rw") ;
                     86:            log.seek (log.length()) ;
                     87:            if ( old != null )
                     88:                old.close () ;
                     89:        } catch (IOException e) {
                     90:            throw new HTTPRuntimeException (this.getClass().getName()
                     91:                                            , "openLogFile"
                     92:                                            , "unable to open "+logname);
                     93:        }
                     94:     }
                     95: 
                     96:     /**
                     97:      * Log the given HTTP transaction.
                     98:      * This is shamelessly slow.
                     99:      */
                    100: 
                    101:     public void log (Request request, Reply reply, int nbytes, long duration) {
                    102:        Client client = request.getClient() ;
                    103:        String entry  = null ;
                    104:        long   date   = reply.getDate();
                    105:        // Compute the time zone offset, first call only.
                    106:        if ( tz == -1 ) {
                    107:            tz = new Date().getTimezoneOffset();
                    108:        }
                    109:        Date   now    = (date < 0) ? new Date() : new Date(date+(tz*60*1000));
                    110: 
                    111:        if ((now.getYear()+1900) != year || now.getMonth() != month) {
                    112:            if (log!= null) {
                    113:                sync();
                    114:                try {
                    115:                    log.close();
                    116:                } catch (IOException ex) {};
                    117:                log = null;
                    118:            }
                    119:            openLogFile(now.getYear()+1900, now.getMonth());
                    120:        }
                    121:        String user = (String) request.getState(AuthFilter.STATE_AUTHUSER);
                    122: 
                    123:        entry = client.getInetAddress().getHostAddress()
                    124:            + " " + "-"                            // user name
                    125:            + " " + ((user == null ) ? "-" : user) // auth user name
                    126:            + ((now.getDate() < 10) ? " [0" : " [")
                    127:            + (now.getDate()                       // current date
                    128:               + "/" + monthnames[now.getMonth()]
                    129:               + "/" + (now.getYear() + 1900)
                    130:               + ((now.getHours() < 10)
                    131:                  ? (":0" + now.getHours())
                    132:                  : (":" + now.getHours()))
                    133:               + ((now.getMinutes() < 10)
                    134:                  ? (":0" + now.getMinutes())
                    135:                  : (":" + now.getMinutes()))
                    136:               + ((now.getSeconds() < 10)
                    137:                  ? (":0" + now.getSeconds())
                    138:                  : (":" + now.getSeconds()))
                    139:               + ((date<0) ?
                    140:                  ((now.getTimezoneOffset() < 0)
                    141:                   ? " " + (now.getTimezoneOffset() / 60)
                    142:                   : " +" + (now.getTimezoneOffset() / 60))
                    143:                  : " +0")
                    144:               + "]")
                    145:            + " \"" + request.getMethod()       // request line
                    146:            + " " + request.getURL()
                    147:            + " " + request.getVersion()
                    148:            + "\" " + reply.getStatus()         // reply status
                    149:            + " " + nbytes                      // # of emited bytes
1.2     ! ylafon    150:            + " \"" + 
        !           151:            ((request.getReferer() == null) ? "" : request.getReferer())
        !           152:            + "\"" // the referer (ext log)
        !           153:            + " \"" + 
        !           154:            ((request.getUserAgent() == null) ? "" : request.getUserAgent())
        !           155:            + "\"" // User agent
1.1       ylafon    156:            + "\n" ;
                    157:        logmsg (entry) ;
                    158:     }
                    159:     
                    160:     /**
                    161:      * Construct a new Logger instance.
                    162:      */
                    163:      
                    164:     ExtendedCommonLogger () {
                    165:        this.msgbuf = new byte[128] ;
                    166:     }   
                    167:     
                    168: }

Webmaster