Monday, November 08, 2010 at 12:02 AM.
system.verbs.apps.WebStar.commands.digestLog
on digestLog (f) { file.open (f); local (fieldnames = {}, ixhost, ixurl); while not file.endoffile (f) { s = file.readline (f); if s beginswith "!!" { if s beginswith "!!LOG_FORMAT" { <<!!LOG_FORMAT DATE TIME RESULT HOSTNAME URL BYTES_SENT local (ct = string.countfields (s, ' '), i); for i = 2 to ct { local (name = string.nthfield (s, ' ', i)); fieldnames = fieldnames + name; if name == "HOSTNAME" { ixhost = i - 1}; if name == "URL" { ixurl = i - 1}}}} else { bundle { <<gather information about URLs local (url); url = string.nthfield (s, '\t', ixurl); if not (string.lower (url) endsWith ".html") { <<we only count page-reads continue}; local (adr = @user.webstar.urls.[url]); if defined (adr^) { adr^++} else { adr^ = 1}; msg (url)}}}; <<bundle <<gather information about hosts <<on gatherHostInfo () <<local (host) <<host = string.nthfield (s, '\t', ixhost) <<host = string.delete (host, sizeof (host), 1) <<pop off period at end of host name <<local (ctfields = string.countFields (host, '.')) <<msg (host) <<bundle <<eliminate all-numeric IP addresses <<if ctfields == 4 <<local (i, flnumeric = true) <<for i = 1 to 4 <<try <<number (string.nthField (host, '.', i)) <<else <<didn't coerce to a number, must contain non-numeric chars <<flnumeric = false <<break <<if flnumeric <<return <<adr = @user.webstar.hosts.[host] <<if defined (adr^) <<adr^++ <<else <<adr^ = 1 <<gatherHostInfo () file.close (f); bundle { <<sort the tables msg ("Sorting user.webstar.urls"); target.set (@user.webstar.urls); table.sortby ("Value"); msg ("Sorting user.webstar.hosts"); target.set (@user.webstar.hosts); table.sortby ("Value")}; msg ("Log analysis complete at " + clock.now () + ".")}; bundle { <<test code digestLog ("Jaz Disk 1:WebSTAR.log.1/13/97")}
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.