Monday, November 08, 2010 at 12:06 AM.
system.verbs.builtins.webserver.postFilters.commonLog
on commonLog (pta, flDailyRoll=false) {
<<This post-filter writes a log file in Common Log format of all the hits on the server.
<<March 04, 1998 at 6:02:36 PM by WMF
<<Change Notes:
<<December 11, 1999 at 12:33:49 AM by AR
<<If user.webserver.prefs.logFile is not defined, don't attempt to coerce the return value (a boolean) of webserver.getPref to a filespec. This bug was responsible for producing a stream of postfilter error messages in the webserver error log.
<<07/10/00; 5:44:18 PM by PBS
<<flDailyRoll is a new optional parameter. If true, then log files are stored in Guest Databases/ops/logs/commonLog/. A new log file is created each day. The filenames are of the form 2000-07-10.txt -- yyyy-mm-dd.txt.
<<If flDailyRoll is false or not supplied, then the script works exactly the same as it always did.
<<12/6/01; 9:29:53 PM by PBS
<<New prefs: user.webserver.prefs.commonLog.flUseCommonLogDateFormat, flIncludeVirtualHosts, flIncludeReferers, flIncludeUserAgents. Controls date format, virtual hosts, referers, and user agents, respectively.
local (f);
local (flUseCommonLogDateFormat = false);
local (flIncludeVirtualHosts = false);
local (flIncludeReferers = false);
local (flIncludeUserAgents = false);
bundle { //PBS 12/06/01: get prefs
if defined (user.webserver.prefs.commonLog.flUseCommonLogDateFormat) {
flUseCommonLogDateFormat = user.webserver.prefs.commonLog.flUseCommonLogDateFormat};
if defined (user.webserver.prefs.commonLog.flIncludeVirtualHosts) {
flIncludeVirtualHosts = user.webserver.prefs.commonLog.flIncludeVirtualHosts};
if defined (user.webserver.prefs.commonLog.flIncludeReferers) {
flIncludeReferers = user.webserver.prefs.commonLog.flIncludeReferers};
if defined (user.webserver.prefs.commonLog.flIncludeUserAgents) {
flIncludeUserAgents = user.webserver.prefs.commonLog.flIncludeUserAgents}};
bundle { //get the path to the current log file
if flDailyRoll { //PBS 07/10/00: write to a different text file every day
local (folder = config.mainResponder.prefs.logFolder);
folder = folder + "Common Log" + file.getPathChar ();
file.sureFilePath (folder);
file.sureFolder (folder);
local (day, month, year, hour, minute, second);
date.get (clock.now (), @day, @month, @year, @hour, @minute, @second);
local (fname = year + "-" + string.padWithZeros (month, 2) + "-" + string.padWithZeros (day, 2) + ".txt");
f = folder + fname}
else { //traditional behavior -- log file path is specified by user.webserver.prefs.logFile
f = webserver.getPref ("logFile");
if typeOf (f) == booleanType { //no log file pref has been set up
return (false)}}};
bundle { //write to the log file
if not file.exists (f) {
file.sureFilePath (f);
file.new (f);
if system.environment.isMac {
file.setType (f, 'TEXT');
file.setCreator (f, 'R*ch')}};
local (dateString);
if flUseCommonLogDateFormat { //PBS 12/06/01: use common log date format
local (day, month, year, hour, minute, second);
date.get (clock.now (), @day, @month, @year, @hour, @minute, @second);
dateString = string.padWithZeros (day, 2) + "/";
dateString = dateString + string.mid (date.monthToString (month), 1, 3) + "/" + year + ":";
dateString = dateString + string.padWithZeros (hour, 2) + ":" + string.padWithZeros (minute, 2) + ":" + string.padWithZeros (second, 2) + " ";
local (timeZone = date.getCurrentTimeZone ());
timeZone = timeZone / 60; timeZone = timeZone / 60;
local (flNegative = (timeZone < 0));
timeZone = string.popLeading (timeZone, "-");
timeZone = string.popLeading (timeZone, "+");
timeZone = string.padWithZeros (string (timeZone), 2);
if flNegative {
timeZone = "-" + timeZone}
else {
timeZone = "+" + timeZone};
timeZone = timeZone + "00";
dateString = dateString + timeZone}
else {
dateString = date.netStandardString (clock.now ())};
local (line = "");
if flIncludeVirtualHosts { //PBS 12/06/01: add virtual hosts
if defined (pta^.host) {
line = pta^.host + " "}
else {
line = "- "}};
with pta^ {
line = line + client + " - - [" + dateString + "] \"" + firstLine + "\" " + code + " " + sizeOf (responseBody)};
if flIncludeReferers { //PBS 12/06/01: add referer
line = line + " ";
if defined (pta^.requestHeaders.referer) and pta^.requestHeaders.referer != "" {
line = line + "\"" + pta^.requestHeaders.referer + "\""}
else {
line = line + "-"}};
if flIncludeUserAgents { //PBS 12/06/01: user-agent
line = line + " ";
if defined (pta^.requestHeaders.["user-Agent"]) and pta^.requestHeaders.["user-Agent"] != "" {
line = line + "\"" + pta^.requestHeaders.["user-Agent"] + "\""}
else {
line = line + "-"}};
semaphore.lock (f, 600);
file.writeLine (f, line); //writeline automatically opens and closes the file
semaphore.unlock (f)};
return (true)}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.