* Jetty: Add a I2PRequestLog class to log request dest hash
This commit is contained in:
@ -80,13 +80,44 @@
|
||||
<delete dir="jetty-5.1.12" />
|
||||
</target>
|
||||
|
||||
<target name="build" depends="ensureJettylib" />
|
||||
<target name="build" depends="jar" />
|
||||
<target name="builddep" />
|
||||
<target name="compile" />
|
||||
<target name="jar" />
|
||||
<target name="clean" />
|
||||
<target name="compile" depends="builddep, ensureJettylib" >
|
||||
<mkdir dir="./build" />
|
||||
<mkdir dir="./build/obj" />
|
||||
<javac
|
||||
srcdir="./java/src"
|
||||
debug="true" deprecation="on" source="1.5" target="1.5"
|
||||
destdir="./build/obj"
|
||||
classpath="./jettylib/commons-logging.jar:./jettylib/javax.servlet.jar:./jettylib/org.mortbay.jetty.jar" />
|
||||
</target>
|
||||
<target name="jar" depends="compile">
|
||||
<jar destfile="./jettylib/org.mortbay.jetty.jar" basedir="./build/obj" includes="**/*.class" update="true" >
|
||||
</jar>
|
||||
</target>
|
||||
<target name="clean" >
|
||||
<delete dir="./build" />
|
||||
</target>
|
||||
<target name="cleandep" depends="clean" />
|
||||
<target name="distclean" depends="clean">
|
||||
<echo message="Not actually deleting the jetty libs (since they're so large)" />
|
||||
</target>
|
||||
<target name="javadoc" >
|
||||
<available property="jetty.zip.available" file="${jetty.filename}" type="file" />
|
||||
<available property="jetty.zip.javadocExtracted" file="build/javadoc" type="dir" />
|
||||
<ant target="fetchJettylib" />
|
||||
<ant target="verifyJettylib" />
|
||||
<ant target="extractJavadoc" />
|
||||
</target>
|
||||
<target name="extractJavadoc" unless="jetty.zip.javadocExtracted" >
|
||||
<mkdir dir="./build" />
|
||||
<mkdir dir="./build/javadoc" />
|
||||
<unzip src="${jetty.filename}" dest="./build/javadoc" >
|
||||
<patternset>
|
||||
<include name="jetty-5.1.12/javadoc/" />
|
||||
</patternset>
|
||||
<mapper type="glob" from="jetty-5.1.12/javadoc/*" to="javadoc/*" />
|
||||
</unzip>
|
||||
</target>
|
||||
|
||||
</project>
|
||||
|
182
apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java
Normal file
182
apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java
Normal file
@ -0,0 +1,182 @@
|
||||
// ========================================================================
|
||||
// $Id: NCSARequestLog.java,v 1.35 2005/08/13 00:01:24 gregwilkins Exp $
|
||||
// Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// ========================================================================
|
||||
|
||||
package org.mortbay.http;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import javax.servlet.http.Cookie;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.mortbay.log.LogFactory;
|
||||
import org.mortbay.util.DateCache;
|
||||
import org.mortbay.util.LogSupport;
|
||||
import org.mortbay.util.RolloverFileOutputStream;
|
||||
import org.mortbay.util.StringUtil;
|
||||
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** NCSA HTTP Request Log.
|
||||
*
|
||||
* Override log() to put in the requestor's destination hash,
|
||||
* instead of 127.0.0.1,
|
||||
* which is placed in the X-I2P-DestHash field in the request headers
|
||||
* by I2PTunnelHTTPServer.
|
||||
*
|
||||
* NCSA common or NCSA extended (combined) request log.
|
||||
* @version $Id: NCSARequestLog.java,v 1.35 2005/08/13 00:01:24 gregwilkins Exp $
|
||||
* @author Tony Thompson
|
||||
* @author Greg Wilkins
|
||||
*/
|
||||
public class I2PRequestLog extends NCSARequestLog
|
||||
{
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Constructor.
|
||||
*/
|
||||
public I2PRequestLog()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Constructor.
|
||||
* @param filename Filename, which can be in
|
||||
* rolloverFileOutputStream format
|
||||
* @see org.mortbay.util.RolloverFileOutputStream
|
||||
* @exception IOException
|
||||
*/
|
||||
public I2PRequestLog(String filename)
|
||||
throws IOException
|
||||
{
|
||||
super(filename);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Log a request.
|
||||
* @param request The request
|
||||
* @param response The response to this request.
|
||||
* @param responseLength The bytes written to the response.
|
||||
*/
|
||||
public void log(HttpRequest request,
|
||||
HttpResponse response,
|
||||
int responseLength)
|
||||
{
|
||||
try{
|
||||
// ignore ignorables
|
||||
if (_ignorePathMap != null &&
|
||||
_ignorePathMap.getMatch(request.getPath()) != null)
|
||||
return;
|
||||
|
||||
// log the rest
|
||||
if (_fileOut==null)
|
||||
return;
|
||||
|
||||
StringBuffer buf = new StringBuffer(160);
|
||||
|
||||
String addr = request.getField("X-I2P-DestHash");
|
||||
if(addr != null)
|
||||
buf.append(addr).append(".i2p");
|
||||
else
|
||||
buf.append(request.getRemoteAddr());
|
||||
|
||||
buf.append(" - ");
|
||||
String user = request.getAuthUser();
|
||||
buf.append((user==null)?"-":user);
|
||||
buf.append(" [");
|
||||
buf.append(_logDateCache.format(request.getTimeStamp()));
|
||||
buf.append("] \"");
|
||||
buf.append(request.getMethod());
|
||||
buf.append(' ');
|
||||
buf.append(request.getURI());
|
||||
buf.append(' ');
|
||||
buf.append(request.getVersion());
|
||||
buf.append("\" ");
|
||||
int status=response.getStatus();
|
||||
buf.append((char)('0'+((status/100)%10)));
|
||||
buf.append((char)('0'+((status/10)%10)));
|
||||
buf.append((char)('0'+(status%10)));
|
||||
if (responseLength>=0)
|
||||
{
|
||||
buf.append(' ');
|
||||
if (responseLength>99999)
|
||||
buf.append(Integer.toString(responseLength));
|
||||
else
|
||||
{
|
||||
if (responseLength>9999)
|
||||
buf.append((char)('0'+((responseLength/10000)%10)));
|
||||
if (responseLength>999)
|
||||
buf.append((char)('0'+((responseLength/1000)%10)));
|
||||
if (responseLength>99)
|
||||
buf.append((char)('0'+((responseLength/100)%10)));
|
||||
if (responseLength>9)
|
||||
buf.append((char)('0'+((responseLength/10)%10)));
|
||||
buf.append((char)('0'+(responseLength%10)));
|
||||
}
|
||||
buf.append(' ');
|
||||
}
|
||||
else
|
||||
buf.append(" - ");
|
||||
|
||||
String log =buf.toString();
|
||||
synchronized(_writer)
|
||||
{
|
||||
_writer.write(log);
|
||||
if (isExtended())
|
||||
{
|
||||
logExtended(request,response,_writer);
|
||||
if (!getLogCookies())
|
||||
_writer.write(" -");
|
||||
}
|
||||
|
||||
if (getLogCookies())
|
||||
{
|
||||
Cookie[] cookies = request.getCookies();
|
||||
if (cookies==null || cookies.length==0)
|
||||
_writer.write(" -");
|
||||
else
|
||||
{
|
||||
_writer.write(" \"");
|
||||
for (int i=0;i<cookies.length;i++)
|
||||
{
|
||||
if (i!=0)
|
||||
_writer.write(';');
|
||||
_writer.write(cookies[i].getName());
|
||||
_writer.write('=');
|
||||
_writer.write(cookies[i].getValue());
|
||||
}
|
||||
_writer.write("\"");
|
||||
}
|
||||
}
|
||||
|
||||
if (getLogLatency())
|
||||
_writer.write(" "+(System.currentTimeMillis()-request.getTimeStamp()));
|
||||
|
||||
_writer.write(StringUtil.__LINE_SEPARATOR);
|
||||
_writer.flush();
|
||||
}
|
||||
}
|
||||
catch(IOException e)
|
||||
{
|
||||
log.warn(LogSupport.EXCEPTION,e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
505
apps/jetty/java/src/org/mortbay/http/NCSARequestLog.java
Normal file
505
apps/jetty/java/src/org/mortbay/http/NCSARequestLog.java
Normal file
@ -0,0 +1,505 @@
|
||||
// ========================================================================
|
||||
// $Id: NCSARequestLog.java,v 1.35 2005/08/13 00:01:24 gregwilkins Exp $
|
||||
// Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// ========================================================================
|
||||
|
||||
package org.mortbay.http;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import javax.servlet.http.Cookie;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.mortbay.log.LogFactory;
|
||||
import org.mortbay.util.DateCache;
|
||||
import org.mortbay.util.LogSupport;
|
||||
import org.mortbay.util.RolloverFileOutputStream;
|
||||
import org.mortbay.util.StringUtil;
|
||||
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** NCSA HTTP Request Log.
|
||||
* NCSA common or NCSA extended (combined) request log.
|
||||
*
|
||||
* Taken from 5.1.12 source and modded to change some private vars to protected
|
||||
* so we can extend it for I2P.
|
||||
*
|
||||
* @version $Id: NCSARequestLog.java,v 1.35 2005/08/13 00:01:24 gregwilkins Exp $
|
||||
* @author Tony Thompson
|
||||
* @author Greg Wilkins
|
||||
*/
|
||||
public class NCSARequestLog implements RequestLog
|
||||
{
|
||||
protected static Log log = LogFactory.getLog(NCSARequestLog.class);
|
||||
|
||||
private String _filename;
|
||||
private boolean _extended;
|
||||
private boolean _append;
|
||||
private int _retainDays;
|
||||
private boolean _closeOut;
|
||||
private boolean _preferProxiedForAddress;
|
||||
private String _logDateFormat="dd/MMM/yyyy:HH:mm:ss ZZZ";
|
||||
private Locale _logLocale=Locale.getDefault();
|
||||
private String _logTimeZone=TimeZone.getDefault().getID();
|
||||
private String[] _ignorePaths;
|
||||
private boolean _logLatency=false;
|
||||
private boolean _logCookies=false;
|
||||
|
||||
protected transient OutputStream _out;
|
||||
protected transient OutputStream _fileOut;
|
||||
protected transient DateCache _logDateCache;
|
||||
protected transient PathMap _ignorePathMap;
|
||||
protected transient Writer _writer;
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Constructor.
|
||||
*/
|
||||
public NCSARequestLog()
|
||||
{
|
||||
_extended=true;
|
||||
_append=true;
|
||||
_retainDays=31;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Constructor.
|
||||
* @param filename Filename, which can be in
|
||||
* rolloverFileOutputStream format
|
||||
* @see org.mortbay.util.RolloverFileOutputStream
|
||||
* @exception IOException
|
||||
*/
|
||||
public NCSARequestLog(String filename)
|
||||
throws IOException
|
||||
{
|
||||
_extended=true;
|
||||
_append=true;
|
||||
_retainDays=31;
|
||||
setFilename(filename);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Set the log filename.
|
||||
* @see NCSARequestLog#setRetainDays(int)
|
||||
* @param filename The filename to use. If the filename contains the
|
||||
* string "yyyy_mm_dd", then a RolloverFileOutputStream is used and the
|
||||
* log is rolled over nightly and aged according setRetainDays. If no
|
||||
* filename is set or a null filename
|
||||
* passed, then requests are logged to System.err.
|
||||
*/
|
||||
public void setFilename(String filename)
|
||||
{
|
||||
if (filename!=null)
|
||||
{
|
||||
filename=filename.trim();
|
||||
if (filename.length()==0)
|
||||
filename=null;
|
||||
}
|
||||
_filename=filename;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Get the log filename.
|
||||
* @see NCSARequestLog#getDatedFilename()
|
||||
* @return The log filename without any date expansion.
|
||||
*/
|
||||
public String getFilename()
|
||||
{
|
||||
return _filename;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Get the dated log filename.
|
||||
* @see NCSARequestLog#getFilename()
|
||||
* @return The log filename with any date encoding expanded.
|
||||
*/
|
||||
public String getDatedFilename()
|
||||
{
|
||||
if (_fileOut instanceof RolloverFileOutputStream)
|
||||
return ((RolloverFileOutputStream)_fileOut).getDatedFilename();
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @param format The date format to use within the log file.
|
||||
*/
|
||||
public void setLogDateFormat(String format)
|
||||
{
|
||||
_logDateFormat=format;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @return The date format to use within the log file.
|
||||
*/
|
||||
public String getLogDateFormat()
|
||||
{
|
||||
return _logDateFormat;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @param tz The date format timezone to use within the log file.
|
||||
*/
|
||||
public void setLogTimeZone(String tz)
|
||||
{
|
||||
_logTimeZone=tz;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @return The date format timezone to use within the log file.
|
||||
*/
|
||||
public String getLogTimeZone()
|
||||
{
|
||||
return _logTimeZone;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @return The number of days to retain rollovered log files.
|
||||
*/
|
||||
public int getRetainDays()
|
||||
{
|
||||
return _retainDays;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @param retainDays The number of days to retain rollovered log files.
|
||||
*/
|
||||
public void setRetainDays(int retainDays)
|
||||
{
|
||||
_retainDays = retainDays;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @return True if NCSA extended format is to be used.
|
||||
*/
|
||||
public boolean isExtended()
|
||||
{
|
||||
return _extended;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @param e True if NCSA extended format is to be used.
|
||||
*/
|
||||
public void setExtended(boolean e)
|
||||
{
|
||||
_extended=e;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @return True if logs are appended to existing log files.
|
||||
*/
|
||||
public boolean isAppend()
|
||||
{
|
||||
return _append;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @param a True if logs are appended to existing log files.
|
||||
*/
|
||||
public void setAppend(boolean a)
|
||||
{
|
||||
_append=a;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @deprecated ignored
|
||||
*/
|
||||
public void setBuffered(boolean b)
|
||||
{}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Set which paths to ignore.
|
||||
*
|
||||
* @param ignorePaths Array of path specifications to ignore
|
||||
*/
|
||||
public void setIgnorePaths(String[] ignorePaths)
|
||||
{
|
||||
// Contributed by Martin Vilcans (martin@jadestone.se)
|
||||
_ignorePaths = ignorePaths;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
public String[] getIgnorePaths()
|
||||
{
|
||||
return _ignorePaths;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @return Returns the logCookies.
|
||||
*/
|
||||
public boolean getLogCookies()
|
||||
{
|
||||
return _logCookies;
|
||||
}
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @param logCookies The logCookies to set.
|
||||
*/
|
||||
public void setLogCookies(boolean logCookies)
|
||||
{
|
||||
_logCookies = logCookies;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @return Returns true if logging latency
|
||||
*/
|
||||
public boolean getLogLatency()
|
||||
{
|
||||
return _logLatency;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @param logLatency If true, latency is logged at the end of the log line
|
||||
*/
|
||||
public void setLogLatency(boolean logLatency)
|
||||
{
|
||||
_logLatency = logLatency;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* Prefer to log the proxied-for IP address (if present in
|
||||
* the request header) over the native requester IP address.
|
||||
* Useful in reverse-proxy situations when you'd rather see
|
||||
* the IP address of the host before the most recent proxy
|
||||
* server, as opposed to your own proxy server(s) every time.
|
||||
*
|
||||
* jlrobins@socialserve.com, March 2004.
|
||||
**/
|
||||
public void setPreferProxiedForAddress(boolean value)
|
||||
{
|
||||
_preferProxiedForAddress = value;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
public void start()
|
||||
throws Exception
|
||||
{
|
||||
_logDateCache=new DateCache(_logDateFormat,_logLocale);
|
||||
_logDateCache.setTimeZoneID(_logTimeZone);
|
||||
|
||||
if (_filename != null)
|
||||
{
|
||||
_fileOut=new RolloverFileOutputStream(_filename,_append,_retainDays);
|
||||
_closeOut=true;
|
||||
}
|
||||
else
|
||||
_fileOut=System.err;
|
||||
|
||||
_out=_fileOut;
|
||||
|
||||
if (_ignorePaths!=null && _ignorePaths.length>0)
|
||||
{
|
||||
_ignorePathMap=new PathMap();
|
||||
for (int i=0;i<_ignorePaths.length;i++)
|
||||
_ignorePathMap.put(_ignorePaths[i],_ignorePaths[i]);
|
||||
}
|
||||
else
|
||||
_ignorePathMap=null;
|
||||
|
||||
_writer=new OutputStreamWriter(_out);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
public boolean isStarted()
|
||||
{
|
||||
return _fileOut!=null;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
public void stop()
|
||||
{
|
||||
try{if (_writer!=null)_writer.flush();} catch (IOException e){LogSupport.ignore(log,e);}
|
||||
if (_out!=null && _closeOut)
|
||||
try{_out.close();}catch(IOException e){LogSupport.ignore(log,e);}
|
||||
_out=null;
|
||||
_fileOut=null;
|
||||
_closeOut=false;
|
||||
_logDateCache=null;
|
||||
_writer=null;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Log a request.
|
||||
* @param request The request
|
||||
* @param response The response to this request.
|
||||
* @param responseLength The bytes written to the response.
|
||||
*/
|
||||
public void log(HttpRequest request,
|
||||
HttpResponse response,
|
||||
int responseLength)
|
||||
{
|
||||
try{
|
||||
// ignore ignorables
|
||||
if (_ignorePathMap != null &&
|
||||
_ignorePathMap.getMatch(request.getPath()) != null)
|
||||
return;
|
||||
|
||||
// log the rest
|
||||
if (_fileOut==null)
|
||||
return;
|
||||
|
||||
StringBuffer buf = new StringBuffer(160);
|
||||
|
||||
String addr = null;
|
||||
if(_preferProxiedForAddress)
|
||||
{
|
||||
// If header is not present, addr will remain null ...
|
||||
addr = request.getField(HttpFields.__XForwardedFor);
|
||||
}
|
||||
if(addr == null)
|
||||
addr = request.getRemoteAddr();
|
||||
buf.append(addr);
|
||||
|
||||
buf.append(" - ");
|
||||
String user = request.getAuthUser();
|
||||
buf.append((user==null)?"-":user);
|
||||
buf.append(" [");
|
||||
buf.append(_logDateCache.format(request.getTimeStamp()));
|
||||
buf.append("] \"");
|
||||
buf.append(request.getMethod());
|
||||
buf.append(' ');
|
||||
buf.append(request.getURI());
|
||||
buf.append(' ');
|
||||
buf.append(request.getVersion());
|
||||
buf.append("\" ");
|
||||
int status=response.getStatus();
|
||||
buf.append((char)('0'+((status/100)%10)));
|
||||
buf.append((char)('0'+((status/10)%10)));
|
||||
buf.append((char)('0'+(status%10)));
|
||||
if (responseLength>=0)
|
||||
{
|
||||
buf.append(' ');
|
||||
if (responseLength>99999)
|
||||
buf.append(Integer.toString(responseLength));
|
||||
else
|
||||
{
|
||||
if (responseLength>9999)
|
||||
buf.append((char)('0'+((responseLength/10000)%10)));
|
||||
if (responseLength>999)
|
||||
buf.append((char)('0'+((responseLength/1000)%10)));
|
||||
if (responseLength>99)
|
||||
buf.append((char)('0'+((responseLength/100)%10)));
|
||||
if (responseLength>9)
|
||||
buf.append((char)('0'+((responseLength/10)%10)));
|
||||
buf.append((char)('0'+(responseLength%10)));
|
||||
}
|
||||
buf.append(' ');
|
||||
}
|
||||
else
|
||||
buf.append(" - ");
|
||||
|
||||
String log =buf.toString();
|
||||
synchronized(_writer)
|
||||
{
|
||||
_writer.write(log);
|
||||
if (_extended)
|
||||
{
|
||||
logExtended(request,response,_writer);
|
||||
if (!_logCookies)
|
||||
_writer.write(" -");
|
||||
}
|
||||
|
||||
if (_logCookies)
|
||||
{
|
||||
Cookie[] cookies = request.getCookies();
|
||||
if (cookies==null || cookies.length==0)
|
||||
_writer.write(" -");
|
||||
else
|
||||
{
|
||||
_writer.write(" \"");
|
||||
for (int i=0;i<cookies.length;i++)
|
||||
{
|
||||
if (i!=0)
|
||||
_writer.write(';');
|
||||
_writer.write(cookies[i].getName());
|
||||
_writer.write('=');
|
||||
_writer.write(cookies[i].getValue());
|
||||
}
|
||||
_writer.write("\"");
|
||||
}
|
||||
}
|
||||
|
||||
if (_logLatency)
|
||||
_writer.write(" "+(System.currentTimeMillis()-request.getTimeStamp()));
|
||||
|
||||
_writer.write(StringUtil.__LINE_SEPARATOR);
|
||||
_writer.flush();
|
||||
}
|
||||
}
|
||||
catch(IOException e)
|
||||
{
|
||||
log.warn(LogSupport.EXCEPTION,e);
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Log Extended fields.
|
||||
* This method can be extended by a derived class to add extened fields to
|
||||
* each log entry. It is called by the log method after all standard
|
||||
* fields have been added, but before the line terminator.
|
||||
* Derived implementations should write extra fields to the Writer
|
||||
* provided.
|
||||
* The default implementation writes the referer and user agent.
|
||||
* @param request The request to log.
|
||||
* @param response The response to log.
|
||||
* @param log The writer to write the extra fields to.
|
||||
* @exception IOException Problem writing log
|
||||
*/
|
||||
protected void logExtended(HttpRequest request,
|
||||
HttpResponse response,
|
||||
Writer log)
|
||||
throws IOException
|
||||
{
|
||||
String referer = request.getField(HttpFields.__Referer);
|
||||
if(referer==null)
|
||||
log.write("\"-\" ");
|
||||
else
|
||||
{
|
||||
log.write('"');
|
||||
log.write(referer);
|
||||
log.write("\" ");
|
||||
}
|
||||
|
||||
String agent = request.getField(HttpFields.__UserAgent);
|
||||
if(agent==null)
|
||||
log.write("\"-\"");
|
||||
else
|
||||
{
|
||||
log.write('"');
|
||||
log.write(agent);
|
||||
log.write('"');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -152,7 +152,7 @@
|
||||
<!-- Configure the Request Log -->
|
||||
<!-- =============================================================== -->
|
||||
<Set name="RequestLog">
|
||||
<New class="org.mortbay.http.NCSARequestLog">
|
||||
<New class="org.mortbay.http.I2PRequestLog">
|
||||
<Arg>./eepsite/logs/yyyy_mm_dd.request.log</Arg>
|
||||
<Set name="retainDays">90</Set>
|
||||
<Set name="append">true</Set>
|
||||
|
Reference in New Issue
Block a user