diff --git a/.gitignore b/.gitignore
index daf913b..0e9448e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,5 @@ _testmain.go
*.exe
*.test
*.prof
+
+.idea/
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..1dd7b46
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+language: go
+
+sudo: false
+
+go:
+ - 1.6
+ - 1.7
+
+script:
+ - go test -v ./...
\ No newline at end of file
diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
new file mode 100644
index 0000000..d401d2b
--- /dev/null
+++ b/Godeps/Godeps.json
@@ -0,0 +1,16 @@
+{
+ "ImportPath": "github.com/mpmlj/http-traffic-monitor",
+ "GoVersion": "go1.7",
+ "GodepVersion": "v78",
+ "Deps": [
+ {
+ "ImportPath": "github.com/daviddengcn/go-colortext",
+ "Rev": "805cee6e0d43c72ba1d4e3275965ff41e0da068a"
+ },
+ {
+ "ImportPath": "github.com/satyrius/gonx",
+ "Comment": "v1.3.0-13-g1df230d",
+ "Rev": "1df230dfbb9d7262c1c9fe2715d74bcf155d982a"
+ }
+ ]
+}
diff --git a/Godeps/Readme b/Godeps/Readme
new file mode 100644
index 0000000..4cdaa53
--- /dev/null
+++ b/Godeps/Readme
@@ -0,0 +1,5 @@
+This directory tree is generated automatically by godep.
+
+Please do not edit.
+
+See https://github.com/tools/godep for more information.
diff --git a/README.md b/README.md
index a35ac8e..5f54f62 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,180 @@
-# http-traffic-monitor
-HTTP traffic monitor
+# HTTP Traffic Monitor
+
+[![HTTP Traffic Monitor](https://goreportcard.com/badge/github.com/mpmlj/http-traffic-monitor)](https://goreportcard.com/report/github.com/mpmlj/http-traffic-monitor) [![Build Status](https://travis-ci.org/mpmlj/http-traffic-monitor.svg)](https://travis-ci.org/mpmlj/http-traffic-monitor)
+
+## Code Challenge
+
+Create a simple console program that monitors HTTP traffic on your machine:
+
+- Consume an actively written-to w3c-formatted HTTP access log (https://en.wikipedia.org/wiki/Common_Log_Format)
+
+- Every 10s, display in the console the sections of the web site with the most hits (a section is defined as being what's before the second '/' in a URL. i.e. the section for "http://my.site.com/pages/create' is "http://my.site.com/pages"), as well as interesting summary statistics on the traffic as a whole.
+
+- Make sure a user can keep the console app running and monitor traffic on their machine
+
+- Whenever total traffic for the past 2 minutes exceeds a certain number on average, add a message saying that “High traffic generated an alert - hits = {value}, triggered at {time}”
+
+- Whenever the total traffic drops again below that value on average for the past 2 minutes, add another message detailing when the alert recovered
+
+- Make sure all messages showing when alerting thresholds are crossed remain visible on the page for historical reasons.
+
+- Write a test for the alerting logic
+
+- Explain how you’d improve on this application design
+
+## General notes
+
+- The program streams information to stdout in chronological order.
+- There are three types of messages:
+-- point, notification about data check at every log file poll
+-- report, traffic summary prepared at user-defined intervals
+-- alert, notification about traffic average exceeding crossing a threshold
+- Each of these message types can be silenced for testing or usability purposes.
+
+## Script arguments and defaults
+
+##### Available for configuration by user:
+
+` --log-file` - log file location, required.
+
+`--alert-threshold` - alert threshold, _hits/sec._, default 1000 hits, optional.
+
+`--poll-interval` - polling interval, _sec._, default 1 sec., optional.
+
+`--mtf` - monitoring time frame, _sec._, default 120 sec., optional.
+
+`--top-n` - # most visited sections, _sec._, default 10, optional.
+
+`--report-interval` - interval for showing traffic report, _sec., default 10, optional.
+
+Below - configuration for the code challenge (should be run from the repository root location):
+
+`./bin/http-traffic-monitor --log-file=log/server.log --alert-threshold=2 --poll-interval=1 --mtf=120 --top-n=5 --report-interval=10`
+
+It will run the monitor to:
+- show a summary report every 10 seconds with top 5 most visited sections
+- trigger an alert escalation and de-escalation based on a 2-minute moving average
+
+##### Unavailable for external configuration, used for testing and debugging:
+
+See Config struct in `config.go`:
+
+- `MaxPolls` (int) limits duration of the monitor via maximum number of ticks (= polls, 1 second minimum) it should make before exiting. By default it is set to maximum int32 number and I hope 68 years should be enough for majority of users... :) However, set to a lower number when configuring monitor tests. For example, to test escalation and deescalation I set it to 2-3 seconds as this is enough to accumulate data for these tests.
+
+- `SendAlerts`, `SendReports` and `SendTicks` (bool) flags are used to silence certain types of output messages. Required to remove noise when testing one specific behavior. For example, I silenced ticks and reports to be able to test alert messaging from the monitor.
+
+
+## Testing
+
+##### Notes on manual testing
+
+- `"log"` folder contains a source log files for manual testing.
+
+- `server.log` is an (originally) empty file you can use to add records.
+
+- `src.log` is an example/source log file with 1000 entries of Common Log Format.
+
+- To test script behavior, append to file with `echo >>`, do not change the log file using vim, etc. and this will trigger `rename` OS event and the script will loose file handler and stop monitoring this particular file.
+
+- Example of a script configuration for testing, with low levels, to more easily trigger state changes:
+`./bin/http-traffic-monitor --log-file=log/server.log --alert-threshold=2 --poll-interval=1 --mtf=10 --top-n=5 --report-interval=3`
+
+##### Sample echo commands
+
+6 log entries with different response codes:
+
+````
+echo '
+165.13.14.55 - - [28/Jul/1995:13:17:00 -0400] "GET /history/apollo/apollo-17/apollo-17-info.html HTTP/1.0" 200 1457
+198.155.12.13 - - [28/Jul/1995:13:17:07 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 5220
+182.200.120.1 - - [28/Jul/1995:13:17:08 -0400] "GET /shuttle/countdown/count.html HTTP/1.0" 500 65536
+198.155.12.16 - - [28/Jul/1995:13:17:09 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 400 786
+182.200.120.2 - - [28/Jul/1995:13:17:08 -0400] "GET /shuttle/countdown/count.html HTTP/1.0" 300 65536
+182.200.120.3 - - [28/Jul/1995:13:17:08 -0400] "GET /shuttle/countdown/count.html HTTP/1.0" 500 65536
+' >> server.log
+````
+
+20 log entries to trigger an alert:
+
+````
+echo '
+131.182.170.137 - - [28/Jul/1995:13:16:31 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+210.166.12.00 - - [28/Jul/1995:13:16:31 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+128.203.26.245 - - [28/Jul/1995:13:16:32 -0400] "GET /software HTTP/1.0" 302 1
+128.203.26.245 - - [28/Jul/1995:13:16:33 -0400] "GET /software/ HTTP/1.0" 200 816
+198.155.12.13 - - [28/Jul/1995:13:16:34 -0400] "GET /history/apollo/apollo-13/images/ HTTP/1.0" 200 1851
+128.203.26.245 - - [28/Jul/1995:13:16:35 -0400] "GET /icons/blank.xbm HTTP/1.0" 401 509
+128.203.26.245 - - [28/Jul/1995:13:16:35 -0400] "GET /icons/menu.xbm HTTP/1.0" 400 527
+131.182.170.137 - - [28/Jul/1995:13:16:36 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.240.108.240 - - [28/Jul/1995:13:16:37 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+198.240.108.240 - - [28/Jul/1995:13:16:40 -0400] "GET /icons/menu.xbm HTTP/1.0" 401 527
+131.182.170.137 - - [28/Jul/1995:13:16:40 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.240.108.240 - - [28/Jul/1995:13:16:43 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+128.203.26.245 - - [28/Jul/1995:13:16:43 -0400] "GET /software/winvn/ HTTP/1.0" 500 2244
+128.203.26.245 - - [28/Jul/1995:13:16:45 -0400] "GET /icons/image.xbm HTTP/1.0" 201 509
+128.203.26.245 - - [28/Jul/1995:13:16:45 -0400] "GET /icons/text.xbm HTTP/1.0" 200 527
+198.240.108.240 - - [28/Jul/1995:13:16:46 -0400] "GET /icons/unknown.xbm HTTP/1.0" 302 515
+182.198.120.1 - - [28/Jul/1995:13:16:47 -0400] "GET /shuttle/technology/sts-newsref/srb.html HTTP/1.0" 200 49553
+182.200.120.1 - - [28/Jul/1995:13:16:47 -0400] "GET /htbin/wais.pl?SAREX-II HTTP/1.0" 502 7111
+210.166.12.92 - - [28/Jul/1995:13:16:47 -0400] "GET /shuttle/missions/sts-71/sts-71-press-kit.txt HTTP/1.0" 502 78588
+198.155.12.13 - - [28/Jul/1995:13:19:30 -0400] "GET /shuttle/missions/sts-65/mission-sts-65.html HTTP/1.0" 200 131165
+' >> server.log
+````
+
+##### Notes on testing with "go test"
+
+ To test alerting (de)escalation logic only, run `go test -v -run TestMonitor`.
+
+
+## UI description
+
+#### Points
+
+` · hits avg: 4 / 2`
First number - average number of hits received since last tick.
+Second - number alert threshold.
+When average number of hits exceeds threshold, the number will marked in red.
+
+#### Report
+````
+--------------------------------------------------------------------------------
+REPORT: 2017-02-06T01:44:41-05:00
+
+Top 5 sections
+| sections | count
+--------------------------------------------------------------------------------
+| /shuttle | 24
+| /images | 6
+| /history | 6
+
+Summary:
+| hits total | hits/s | 2xx | 3xx | 4xx | 5xx
+--------------------------------------------------------------------------------
+| 36 | 12 | 12 | 6 | 6 | 12
+````
+
+#### Alerts
+
+````
+ · High traffic generated an alert - hits = 2, triggered at 2017-02-06T01:48:10-05:00
+````
+
+
+````
+ · High traffic alert recovered. Current hits = 0. At 2017-02-06T01:48:20-05:00
+````
+
+## Improvement considerations
+
+- Introduce a warning threshold level, that would signal approaching to an actual alert level.
+- Implement other senders, ex. SNS, Pager Duty, Slack, email.
+- Other log formats (combined, extended, custom via regex expressions, etc.).
+- Implement better logic for reaction on logrotate - currently loses file handler due to a rename event from OS.
+- Remove dependencies, implement custom parser.
+- Implement spike detection via stand deviation calculation.
+- I would also like to revise data types used throughout the script as I feel like there can be some optimizations required.
+
+## Other...
+
+- Add average request size.
+- Add request methods to report.
+- Better test coverage.
diff --git a/bin/http-traffic-monitor b/bin/http-traffic-monitor
new file mode 100755
index 0000000..a43ee54
Binary files /dev/null and b/bin/http-traffic-monitor differ
diff --git a/config.go b/config.go
new file mode 100644
index 0000000..d1faf66
--- /dev/null
+++ b/config.go
@@ -0,0 +1,77 @@
+package main
+
+import (
+ "flag"
+ "math"
+)
+
+const (
+ // Argument defaults.
+ defAlertThreshold = 1000 // hits per interval
+ defMTF = 120 // Monitoring time frame, sec
+ defPollInt = 1 // sec, 1sec - minimum
+ defReportInt = 10 // Default stat summary interval, sec
+ defTopN = 10
+ defSendAlerts = true
+ defSendReports = true
+ defSendTicks = true
+)
+
+// Config is a program configuration object.
+type Config struct {
+ AlertThreshold int
+ File string
+ MaxPolls int
+ MTF int // sec
+ PollInt int // sec
+ ReportInt int // sec
+ SendAlerts bool
+ SendReports bool
+ SendTicks bool
+ TopN uint
+}
+
+// NewConfig initializes program configuration and runs basic validation of user-defined arguments.
+// By default, all properties are set to def* constants.
+func NewConfig() *Config {
+ at := flag.Int("alert-threshold", defAlertThreshold, "Alert threshold")
+ lf := flag.String("log-file", "", "Log file.")
+ mtf := flag.Int("mtf", defMTF, "Monitoring time frame (seconds)")
+ pi := flag.Int("poll-interval", defPollInt, "Log polling interval (seconds). 1 sec - mim allowed value.")
+ ri := flag.Int("report-interval", defReportInt, "Report interval.")
+ sa := flag.Bool("send-alerts", defSendAlerts, "Send alerts")
+ sr := flag.Bool("send-reports", defSendReports, "Send reports")
+ st := flag.Bool("send-ticks", defSendTicks, "Send tick information")
+ tn := flag.Uint("top-n", defTopN, "Number of top section hits displayed during polls")
+ flag.Parse()
+
+ if *lf == "" {
+ panic("Log file is not provided.")
+ }
+
+ if *pi < 1 {
+ panic("Invalid polling interval set. Minimal allowed value is 1 second.")
+ }
+
+ if *ri < *pi {
+ // via pollInt we also check for reportInt to be > 0
+ panic("Report interval cannot be smaller than polling interval.")
+ }
+
+ if *mtf < *pi {
+ panic("Monitoring time frame cannot be smaller than polling interval.")
+ }
+
+ return &Config{
+ MaxPolls: math.MaxInt32 - 1,
+ AlertThreshold: *at,
+ File: *lf,
+ MTF: *mtf,
+ PollInt: *pi,
+ ReportInt: *ri,
+ SendAlerts: *sa,
+ SendReports: *sr,
+ SendTicks: *st,
+ TopN: *tn,
+ }
+}
diff --git a/entry.go b/entry.go
new file mode 100644
index 0000000..4c09712
--- /dev/null
+++ b/entry.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/satyrius/gonx"
+)
+
+// Entry represents a request based on a log entry data:
+// "GET /shuttle/technology/sts-newsref/srb.html HTTP/1.0" 200
+type Entry struct {
+ Method string
+ Path string
+ parser *gonx.Parser
+ Section string
+ Protocol string
+ StatusCode string // response code to a given request
+}
+
+// NewEntry represents log entry.
+func NewEntry(p *gonx.Parser) *Entry {
+ return &Entry{
+ parser: p,
+ }
+}
+
+// ParseLine validate and parses a request part of a log entry and creates a Request object on success.
+func (r *Entry) ParseLine(line string) error {
+
+ e, err := r.parser.ParseString(line)
+ if err != nil {
+ return fmt.Errorf(" Error parsing log entry %s \n Err: %s ", line, err.Error())
+ }
+
+ rStr, err := e.Field("request")
+ if err != nil {
+ return err
+ }
+
+ parts := strings.Fields(rStr)
+ if len(parts) != 3 {
+ return fmt.Errorf("Invalid structure of request part: %s", rStr)
+ }
+
+ r.Method = parts[0]
+ r.Path = parts[1]
+ r.Protocol = parts[2]
+
+ partParts := strings.Split(r.Path, "/")
+
+ r.Section = "/"
+ if len(partParts) > 0 {
+ r.Section += partParts[1]
+ }
+
+ r.StatusCode, err = e.Field("status")
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/entry_test.go b/entry_test.go
new file mode 100644
index 0000000..7da0494
--- /dev/null
+++ b/entry_test.go
@@ -0,0 +1,51 @@
+package main
+
+import (
+ "testing"
+
+ "github.com/satyrius/gonx"
+)
+
+func TestRequest_ParseEntry(t *testing.T) {
+
+ parser := gonx.NewParser(parserFormat)
+
+ testString := `182.198.120.1 - - [28/Jul/1995:13:16:47 -0400] "GET /shuttle/technology/sts-newsref/srb.html HTTP/1.0" 200 49553`
+
+ r := NewEntry(parser)
+ err := r.ParseLine(testString)
+ if err != nil {
+ t.Fatalf("ParseEntry should not fail. Error: %+v", err)
+ }
+
+ expected := "GET"
+ actual := r.Method
+ if expected != actual {
+ t.Errorf("Expected %s, got %s", expected, actual)
+ }
+
+ expected = "/shuttle/technology/sts-newsref/srb.html"
+ actual = r.Path
+ if expected != actual {
+ t.Errorf("Expected %s, got %s", expected, actual)
+ }
+
+ expected = "HTTP/1.0"
+ actual = r.Protocol
+ if expected != actual {
+ t.Errorf("Expected %s, got %s", expected, actual)
+ }
+
+ expected = "/shuttle"
+ actual = r.Section
+ if expected != actual {
+ t.Errorf("Expected %s, got %s", expected, actual)
+ }
+
+ expected2 := "200"
+ actual2 := r.StatusCode
+ if expected2 != actual2 {
+ t.Errorf("Expected %d, got %d", expected2, actual2)
+ }
+
+}
diff --git a/frame.go b/frame.go
new file mode 100644
index 0000000..eabe93f
--- /dev/null
+++ b/frame.go
@@ -0,0 +1,56 @@
+package main
+
+import (
+ "math"
+)
+
+// Frame provides data collected and processed during one poll interval.
+type Frame struct {
+ PointHits []int // timeline of hits per each point during MTF
+ AvgTraffic int
+ PointsQty int
+}
+
+// NewFrame returns a new Frame with a pre-calculated quantity of points per frame.
+func NewFrame(mtf, pollInt int) *Frame {
+
+ // We monitor last "mtf" seconds of traffic
+ // and checking this time window every pollInt seconds, i.e.
+ // we need to store floor(mtf/pollInt) points.
+ return &Frame{
+ PointsQty: calcPointsPerFrame(mtf, pollInt),
+ }
+}
+
+// Rec adds quantity of hits for one point.
+func (f *Frame) Rec(qty int) {
+ f.PointHits = append(f.PointHits, qty)
+ if len(f.PointHits) > f.PointsQty {
+ // remove 1 element from its head to keep the frame length consistent
+ f.PointHits = f.PointHits[1:]
+ }
+
+ f.recalcAvgTraffic()
+}
+
+// recalcAvgTraffic calculates average traffic volume based on accumulated traffic levels
+// for each poll during the user-defined attention span.
+func (f *Frame) recalcAvgTraffic() {
+ sum := 0
+ for _, p := range f.PointHits {
+ sum += p
+ }
+
+ f.AvgTraffic = calcAvgTraffic(sum, f.PointsQty)
+}
+
+// calcAvgTraffic calculates average traffic level per point. Rounded down to nearest int.
+func calcAvgTraffic(total, points int) int {
+ return int(math.Ceil(float64(total / points)))
+}
+
+// calcPointsPerFrame calculates amount of points we need to store for current time frame.
+// Based on user configuration. Rounded down to nearest int.
+func calcPointsPerFrame(mtf, pollInt int) int {
+ return int(math.Floor(float64(mtf / pollInt)))
+}
diff --git a/frame_test.go b/frame_test.go
new file mode 100644
index 0000000..d2cb449
--- /dev/null
+++ b/frame_test.go
@@ -0,0 +1,61 @@
+package main
+
+import (
+ "reflect"
+ "testing"
+)
+
+func TestNewFrame(t *testing.T) {
+
+ expected := &Frame{
+ PointsQty: 2,
+ }
+
+ actual := NewFrame(5, 2)
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Error("Failed GetTopHits test!")
+ t.Log("Expected:")
+ t.Logf("%+v\n", expected)
+
+ t.Log("Actual:")
+ t.Logf("%+v\n", actual)
+ }
+}
+
+func TestFrame_Rec(t *testing.T) {
+ f := NewFrame(6, 2) // frame of 3 items
+ f.Rec(6) // should be removed
+ f.Rec(5)
+ f.Rec(2)
+ f.Rec(1)
+
+ expected := []int{5, 2, 1}
+
+ actual := f.PointHits
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Error("Failed GetTopHits test!")
+ t.Log("Expected:")
+ t.Logf("%+v\n", expected)
+
+ t.Log("Actual:")
+ t.Logf("%+v\n", actual)
+ t.Logf("PointQty: %d", f.PointsQty)
+ }
+}
+
+func TestFrame_recalcAvgTraffic(t *testing.T) {
+ f := NewFrame(6, 2) // frame of 3 items
+ f.Rec(6) // should be removed
+ f.Rec(5)
+ f.Rec(2)
+ f.Rec(1)
+
+ expected := 2 // floor( ( 5+2+1 ) / 3 )
+ actual := f.AvgTraffic
+
+ if expected != actual {
+ t.Errorf("TestFrame_recalcAvgTraffic / (%d, %d): expected %d, actual %d", 6, 2, expected, actual)
+ }
+}
diff --git a/hitlist.go b/hitlist.go
new file mode 100644
index 0000000..e28402b
--- /dev/null
+++ b/hitlist.go
@@ -0,0 +1,48 @@
+package main
+
+import (
+ "sort"
+)
+
+// Pair is a k/v bucket for HitList.
+type Pair struct {
+ Key string
+ Value int
+}
+
+// HitList is a map for sorted data with struct value types.
+type HitList map[int]Pair
+
+// CutTopN returns top n hit sections from an interval data.
+func CutTopN(h HitList, n uint) HitList {
+
+ if len(h) <= int(n) {
+ return h
+ }
+
+ out := HitList{}
+ for i := 0; i < int(n); i++ {
+ out[i] = h[i]
+ }
+
+ return out
+}
+
+// RankByHits sorts HitList in reverse order based on Pair Value.
+func RankByHits(sectionHits map[string]int) HitList {
+ pl := make(HitList, len(sectionHits))
+ if len(sectionHits) == 0 {
+ return pl
+ }
+ i := 0
+ for k, v := range sectionHits {
+ pl[i] = Pair{k, v}
+ i++
+ }
+ sort.Sort(sort.Reverse(pl))
+ return pl
+}
+
+func (p HitList) Len() int { return len(p) }
+func (p HitList) Less(i, j int) bool { return p[i].Value < p[j].Value }
+func (p HitList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
diff --git a/hitlist_test.go b/hitlist_test.go
new file mode 100644
index 0000000..de2cfed
--- /dev/null
+++ b/hitlist_test.go
@@ -0,0 +1,62 @@
+package main
+
+import (
+ "reflect"
+ "testing"
+)
+
+func TestRankSectionsByHits(t *testing.T) {
+ testHitsMap := map[string]int{
+ "/foo": 2,
+ "/foobar": 5,
+ "/barbaz": 4,
+ "/baz": 3,
+ "/bar": 1,
+ }
+
+ expected := HitList{
+ 0: Pair{"/foobar", 5},
+ 1: Pair{"/barbaz", 4},
+ 2: Pair{"/baz", 3},
+ 3: Pair{"/foo", 2},
+ 4: Pair{"/bar", 1},
+ }
+
+ actual := RankByHits(testHitsMap) // *HitList
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Error("Failed RankSectionsByHits test!")
+ t.Log("Expected:")
+ t.Logf("%+v\n", expected)
+
+ t.Log("Actual:")
+ t.Logf("%+v\n", actual)
+ }
+}
+
+func TestCutTopN(t *testing.T) {
+ testHitList := HitList{
+ 0: Pair{"/foobar", 5},
+ 1: Pair{"/barbaz", 4},
+ 2: Pair{"/baz", 3},
+ 3: Pair{"/foo", 2},
+ 4: Pair{"/bar", 1},
+ }
+
+ expected := HitList{
+ 0: Pair{"/foobar", 5},
+ 1: Pair{"/barbaz", 4},
+ 2: Pair{"/baz", 3},
+ }
+
+ actual := CutTopN(testHitList, 3)
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Error("Failed CutTopN test!")
+ t.Log("Expected:")
+ t.Logf("%+v\n", expected)
+
+ t.Log("Actual:")
+ t.Logf("%+v\n", actual)
+ }
+}
diff --git a/log/server.log b/log/server.log
new file mode 100644
index 0000000..e69de29
diff --git a/log/src.log b/log/src.log
new file mode 100644
index 0000000..1d1884b
--- /dev/null
+++ b/log/src.log
@@ -0,0 +1,1000 @@
+198.155.12.13 - - [28/Jul/1995:13:16:12 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+198.155.12.13 - - [28/Jul/1995:13:16:12 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+198.155.12.13 - - [28/Jul/1995:13:16:13 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+131.182.170.137 - - [28/Jul/1995:13:16:16 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.203.26.245 - - [28/Jul/1995:13:16:20 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9866
+198.240.108.240 - - [28/Jul/1995:13:16:21 -0400] "GET /images/ HTTP/1.0" 200 17688
+128.203.26.245 - - [28/Jul/1995:13:16:21 -0400] "GET /software/winvn/winvn.gif HTTP/1.0" 304 0
+128.203.26.245 - - [28/Jul/1995:13:16:21 -0400] "GET /images/construct.gif HTTP/1.0" 304 0
+128.203.26.245 - - [28/Jul/1995:13:16:21 -0400] "GET /software/winvn/bluemarb.gif HTTP/1.0" 304 0
+128.203.26.245 - - [28/Jul/1995:13:16:21 -0400] "GET /software/winvn/wvsmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:16:22 -0400] "GET /history/apollo/apollo-13/ HTTP/1.0" 200 1732
+198.155.12.13 - - [28/Jul/1995:13:16:23 -0400] "GET /icons/text.xbm HTTP/1.0" 200 527
+131.182.170.137 - - [28/Jul/1995:13:16:25 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.203.26.245 - - [28/Jul/1995:13:16:25 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+128.203.26.245 - - [28/Jul/1995:13:16:25 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 304 0
+128.203.26.245 - - [28/Jul/1995:13:16:25 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 304 0
+128.203.26.245 - - [28/Jul/1995:13:16:25 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:16:25 -0400] "GET /history/mercury/flight-summary.txt HTTP/1.0" 200 959
+182.200.120.1 - - [28/Jul/1995:13:16:26 -0400] "GET /shuttle/technology/sts-newsref/et.html HTTP/1.0" 200 20327
+182.200.120.1 - - [28/Jul/1995:13:16:26 -0400] "GET /history/astp/astp.html HTTP/1.0" 200 1157
+182.200.120.1 - - [28/Jul/1995:13:16:26 -0400] "GET /history/astp/astp-patch-small.gif HTTP/1.0" 200 18528
+182.200.120.1 - - [28/Jul/1995:13:16:26 -0400] "GET /history/apollo/images/apollo-logo.gif HTTP/1.0" 200 3047
+182.200.120.1 - - [28/Jul/1995:13:16:26 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+182.200.120.1 - - [28/Jul/1995:13:16:27 -0400] "GET /shuttle/missions/sts-67/images/KSC-95EC-0391.gif HTTP/1.0" 200 77406
+198.155.12.92 - - [28/Jul/1995:13:16:31 -0400] "GET /shuttle/technology/sts-newsref/stsover-launch.html HTTP/1.0" 200 90755
+131.182.170.137 - - [28/Jul/1995:13:16:31 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+210.166.12.00 - - [28/Jul/1995:13:16:31 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+128.203.26.245 - - [28/Jul/1995:13:16:32 -0400] "GET /software HTTP/1.0" 302 -
+128.203.26.245 - - [28/Jul/1995:13:16:33 -0400] "GET /software/ HTTP/1.0" 200 816
+198.155.12.13 - - [28/Jul/1995:13:16:34 -0400] "GET /history/apollo/apollo-13/images/ HTTP/1.0" 200 1851
+128.203.26.245 - - [28/Jul/1995:13:16:35 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+128.203.26.245 - - [28/Jul/1995:13:16:35 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+131.182.170.137 - - [28/Jul/1995:13:16:36 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.240.108.240 - - [28/Jul/1995:13:16:37 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+198.240.108.240 - - [28/Jul/1995:13:16:40 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+131.182.170.137 - - [28/Jul/1995:13:16:40 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.240.108.240 - - [28/Jul/1995:13:16:43 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+128.203.26.245 - - [28/Jul/1995:13:16:43 -0400] "GET /software/winvn/ HTTP/1.0" 200 2244
+128.203.26.245 - - [28/Jul/1995:13:16:45 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+128.203.26.245 - - [28/Jul/1995:13:16:45 -0400] "GET /icons/text.xbm HTTP/1.0" 200 527
+198.240.108.240 - - [28/Jul/1995:13:16:46 -0400] "GET /icons/unknown.xbm HTTP/1.0" 200 515
+182.198.120.1 - - [28/Jul/1995:13:16:47 -0400] "GET /shuttle/technology/sts-newsref/srb.html HTTP/1.0" 200 49553
+182.200.120.1 - - [28/Jul/1995:13:16:47 -0400] "GET /htbin/wais.pl?SAREX-II HTTP/1.0" 200 7111
+210.166.12.92 - - [28/Jul/1995:13:16:47 -0400] "GET /shuttle/missions/sts-71/sts-71-press-kit.txt HTTP/1.0" 200 78588
+128.159.77.122 - - [28/Jul/1995:13:16:48 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.77.122 - - [28/Jul/1995:13:16:48 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+131.182.170.137 - - [28/Jul/1995:13:16:48 -0400] "GET /elv/elvpage.htm HTTP/1.0" 200 7838
+128.159.77.122 - - [28/Jul/1995:13:16:49 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.159.77.122 - - [28/Jul/1995:13:16:49 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.159.77.122 - - [28/Jul/1995:13:16:50 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.159.77.122 - - [28/Jul/1995:13:16:50 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+222.218.120.1 - - [28/Jul/1995:13:16:51 -0400] "GET /shuttle/technology/images/sts_spec_6-small.gif HTTP/1.0" 200 47145
+198.155.12.13 - - [28/Jul/1995:13:16:51 -0400] "GET /history/apollo/apollo-13/movies/ HTTP/1.0" 200 945
+210.166.12.00 - - [28/Jul/1995:13:16:53 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:16:53 -0400] "GET /icons/movie.xbm HTTP/1.0" 200 530
+180.176.12.00 - - [28/Jul/1995:13:16:53 -0400] "GET /cgi-bin/imagemap/astrohome?272,285 HTTP/1.0" 302 93
+182.200.120.1 - - [28/Jul/1995:13:16:54 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13452
+180.176.12.00 - - [28/Jul/1995:13:16:56 -0400] "GET /msfc/onboard/onboard.html HTTP/1.0" 200 1301
+165.137.62.110 - - [28/Jul/1995:13:16:56 -0400] "HEAD /software/winvn/winvn.html HTTP/1.0" 200 0
+131.182.170.137 - - [28/Jul/1995:13:16:58 -0400] "GET /elv/elvhead3.gif HTTP/1.0" 200 9925
+198.240.108.240 - - [28/Jul/1995:13:17:00 -0400] "GET /images/NASA-logo.gif HTTP/1.0" 200 5268
+165.13.14.55 - - [28/Jul/1995:13:17:00 -0400] "GET /history/apollo/apollo-17/apollo-17-info.html HTTP/1.0" 200 1457
+198.155.12.13 - - [28/Jul/1995:13:17:07 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 5220
+182.200.120.1 - - [28/Jul/1995:13:17:08 -0400] "GET /shuttle/countdown/count.html HTTP/1.0" 200 65536
+198.155.12.13 - - [28/Jul/1995:13:17:09 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+131.182.170.137 - - [28/Jul/1995:13:17:09 -0400] "GET /elv/endball.gif HTTP/1.0" 200 306
+182.200.120.1 - - [28/Jul/1995:13:17:13 -0400] "GET /shuttle/resources/orbiters/atlantis.html HTTP/1.0" 200 7025
+198.155.12.13 - - [28/Jul/1995:13:17:13 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 71319
+210.166.12.00 - - [28/Jul/1995:13:17:14 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:17:15 -0400] "GET /shuttle/resources/orbiters/atlantis-logo.gif HTTP/1.0" 200 4179
+131.182.170.137 - - [28/Jul/1995:13:17:15 -0400] "GET /elv/hot.gif HTTP/1.0" 200 1007
+182.200.120.1 - - [28/Jul/1995:13:17:15 -0400] "GET /elv/DELTA/delta.htm HTTP/1.0" 200 809
+182.200.120.1 - - [28/Jul/1995:13:17:16 -0400] "GET /elv/elvhead2.gif HTTP/1.0" 200 1733
+182.200.120.1 - - [28/Jul/1995:13:17:16 -0400] "GET /shuttle/countdown/launch-team.html HTTP/1.0" 200 30037
+180.176.12.00 - - [28/Jul/1995:13:17:17 -0400] "GET /cgi-bin/imagemap/onboard?371,237 HTTP/1.0" 302 109
+182.200.120.1 - - [28/Jul/1995:13:17:18 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+222.218.120.1 - - [28/Jul/1995:13:17:18 -0400] "GET /images/ HTTP/1.0" 200 17688
+165.13.14.55 - - [28/Jul/1995:13:17:19 -0400] "GET /history/apollo/apollo-17/images/ HTTP/1.0" 200 1719
+165.13.14.55 - - [28/Jul/1995:13:17:20 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+170.166.12.00 - - [28/Jul/1995:13:17:20 -0400] "GET / HTTP/1.0" 200 7280
+182.200.120.1 - - [28/Jul/1995:13:17:21 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932
+131.182.170.137 - - [28/Jul/1995:13:17:21 -0400] "GET /elv/PEGASUS/minpeg1.gif HTTP/1.0" 200 1055
+170.166.12.00 - - [28/Jul/1995:13:17:21 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+170.166.12.00 - - [28/Jul/1995:13:17:22 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+170.166.12.00 - - [28/Jul/1995:13:17:22 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+182.198.120.1 - - [28/Jul/1995:13:17:22 -0400] "GET /shuttle/missions/sts-73/sts-73-info.html HTTP/1.0" 200 1428
+170.166.12.00 - - [28/Jul/1995:13:17:22 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+170.166.12.00 - - [28/Jul/1995:13:17:23 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1 - - [28/Jul/1995:13:17:23 -0400] "GET /history/astp/astp.html HTTP/1.0" 200 1157
+165.13.14.55 - - [28/Jul/1995:13:17:23 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+165.13.14.55 - - [28/Jul/1995:13:17:23 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+163.205.156.16 - - [28/Jul/1995:13:17:24 -0400] "GET /elv/elvpage.htm HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:26 -0400] "GET /elv/bakgro.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:26 -0400] "GET /elv/elvhead3.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:26 -0400] "GET /elv/endball.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:26 -0400] "GET /elv/hot.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:26 -0400] "GET /elv/PEGASUS/minpeg1.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:26 -0400] "GET /elv/SCOUT/scout.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:26 -0400] "GET /elv/DELTA/delta.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:26 -0400] "GET /elv/ATLAS_CENTAUR/atlas.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:27 -0400] "GET /elv/TITAN/titan.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:27 -0400] "GET /elv/struct.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:27 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:17:27 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0
+131.182.170.137 - - [28/Jul/1995:13:17:27 -0400] "GET /elv/SCOUT/scout.gif HTTP/1.0" 200 1165
+131.182.170.137 - - [28/Jul/1995:13:17:33 -0400] "GET /elv/DELTA/delta.gif HTTP/1.0" 200 2244
+198.155.12.92 - - [28/Jul/1995:13:17:34 -0400] "GET /shuttle/technology/images/sts_spec_6-small.gif HTTP/1.0" 200 47145
+222.218.120.1 - - [28/Jul/1995:13:17:35 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+222.218.120.1 - - [28/Jul/1995:13:17:36 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+182.200.120.1 - - [28/Jul/1995:13:17:36 -0400] "GET /shuttle/missions/sts-67/images/KSC-95EC-0390.gif HTTP/1.0" 200 97220
+210.166.12.00 - - [28/Jul/1995:13:17:36 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+222.218.120.1 - - [28/Jul/1995:13:17:38 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+182.200.120.1 - - [28/Jul/1995:13:17:38 -0400] "GET /history/astp/astp-goals.txt HTTP/1.0" 200 305
+131.182.170.137 - - [28/Jul/1995:13:17:38 -0400] "GET /elv/ATLAS_CENTAUR/atlas.gif HTTP/1.0" 200 2286
+182.200.120.1 - - [28/Jul/1995:13:17:40 -0400] "GET /shuttle/resources/orbiters/orbiters.html HTTP/1.0" 200 2178
+182.200.120.1 - - [28/Jul/1995:13:17:42 -0400] "GET /images/landing-small.gif HTTP/1.0" 200 16966
+222.218.120.1 - - [28/Jul/1995:13:17:42 -0400] "GET /icons/unknown.xbm HTTP/1.0" 200 515
+198.155.12.13 - - [28/Jul/1995:13:17:43 -0400] "GET /history/apollo/apollo-13/movies/apo13damage.mpg HTTP/1.0" 200 297851
+198.240.108.240 - - [28/Jul/1995:13:17:44 -0400] "GET /images/KSC-94EC-412.jpg HTTP/1.0" 200 52759
+131.182.170.137 - - [28/Jul/1995:13:17:44 -0400] "GET /elv/TITAN/titan.gif HTTP/1.0" 200 3530
+182.198.120.1 - - [28/Jul/1995:13:17:46 -0400] "GET /shuttle/missions/sts-73/ HTTP/1.0" 200 1596
+182.200.120.1 - - [28/Jul/1995:13:17:47 -0400] "GET /shuttle/missions/sts-67/mission-sts-67.html HTTP/1.0" 200 21523
+182.200.120.1 - - [28/Jul/1995:13:17:48 -0400] "GET /shuttle/countdown/lps/ab/ab.html HTTP/1.0" 200 3933
+165.13.14.55 - - [28/Jul/1995:13:17:51 -0400] "GET /history/apollo/apollo-17/images/72HC971.GIF HTTP/1.0" 200 98304
+131.182.170.137 - - [28/Jul/1995:13:17:52 -0400] "GET /elv/struct.gif HTTP/1.0" 200 1318
+210.166.12.00 - - [28/Jul/1995:13:17:56 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:17:58 -0400] "GET /shuttle/resources/orbiters/enterprise.html HTTP/1.0" 200 9732
+182.198.120.1 - - [28/Jul/1995:13:17:59 -0400] "GET /shuttle/missions/sts-73/movies/ HTTP/1.0" 200 378
+131.182.170.137 - - [28/Jul/1995:13:17:59 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+165.13.14.55 - - [28/Jul/1995:13:18:00 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556
+165.13.14.55 - - [28/Jul/1995:13:18:02 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859
+182.200.120.1 - - [28/Jul/1995:13:18:03 -0400] "GET /shuttle/resources/orbiters/enterprise-logo.gif HTTP/1.0" 200 25257
+128.159.146.40 - - [28/Jul/1995:13:18:05 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.146.40 - - [28/Jul/1995:13:18:07 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.155.12.13 - - [28/Jul/1995:13:18:07 -0400] "GET /shuttle/countdown/countdown.html HTTP/1.0" 200 4324
+182.200.120.1 - - [28/Jul/1995:13:18:07 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054
+198.155.12.13 - - [28/Jul/1995:13:18:10 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+198.155.12.92 - - [28/Jul/1995:13:18:10 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+198.155.12.92 - - [28/Jul/1995:13:18:11 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.159.146.40 - - [28/Jul/1995:13:18:11 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.159.146.40 - - [28/Jul/1995:13:18:12 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.159.146.40 - - [28/Jul/1995:13:18:12 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.159.146.40 - - [28/Jul/1995:13:18:12 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:18:12 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+198.155.12.92 - - [28/Jul/1995:13:18:13 -0400] "GET /shuttle/technology/sts-newsref/sts_overview.html HTTP/1.0" 200 65536
+198.155.12.92 - - [28/Jul/1995:13:18:14 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+182.200.120.1 - - [28/Jul/1995:13:18:15 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+182.200.120.1 - - [28/Jul/1995:13:18:16 -0400] "GET /shuttle/countdown/lps/ab/ab.html HTTP/1.0" 200 3933
+182.200.120.1 - - [28/Jul/1995:13:18:16 -0400] "GET /history/astp/flight-summary.txt HTTP/1.0" 200 509
+182.200.120.1 - - [28/Jul/1995:13:18:17 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 304 0
+210.166.12.00 - - [28/Jul/1995:13:18:17 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:18:17 -0400] "GET /images/launchmedium.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:18:18 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:18:18 -0400] "GET /images/landing-logo.gif HTTP/1.0" 200 2582
+198.155.12.92 - - [28/Jul/1995:13:18:18 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+198.155.12.92 - - [28/Jul/1995:13:18:18 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1 - - [28/Jul/1995:13:18:19 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+170.166.12.00 - - [28/Jul/1995:13:18:19 -0400] "GET /shuttle/missions/sts-68/ksc-srl-image.html HTTP/1.0" 200 1404
+198.155.12.92 - - [28/Jul/1995:13:18:20 -0400] "GET /shuttle/technology/images/launch_sites_8-small.gif HTTP/1.0" 200 65536
+182.200.120.1 - - [28/Jul/1995:13:18:24 -0400] "GET /shuttle/missions/sts-60/mission-sts-60.html HTTP/1.0" 200 25585
+198.155.12.92 - - [28/Jul/1995:13:18:24 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+165.13.14.55 - - [28/Jul/1995:13:18:24 -0400] "GET /history/apollo/apollo-13/apollo-13-patch.jpg HTTP/1.0" 200 98304
+182.200.120.1 - - [28/Jul/1995:13:18:25 -0400] "GET /shuttle/missions/sts-60/sts-60-patch-small.gif HTTP/1.0" 200 15522
+170.166.12.00 - - [28/Jul/1995:13:18:25 -0400] "GET /shuttle/missions/sts-68/images/ksc-upclose.gif HTTP/1.0" 200 86984
+170.166.12.00 - - [28/Jul/1995:13:18:28 -0400] "GET /shuttle/missions/sts-68/images/ksc.gif HTTP/1.0" 200 152676
+182.200.120.1 - - [28/Jul/1995:13:18:29 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+182.200.120.1 - - [28/Jul/1995:13:18:30 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+182.200.120.1- - [28/Jul/1995:13:18:32 -0400] "GET /shuttle/technology/sts-newsref/sts_sys.html HTTP/1.0" 200 43132
+182.200.120.1 - - [28/Jul/1995:13:18:32 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+182.200.120.1 - - [28/Jul/1995:13:18:32 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+182.200.120.1 - - [28/Jul/1995:13:18:34 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+202.244.227.68 - - [28/Jul/1995:13:18:37 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556
+182.200.120.1 - - [28/Jul/1995:13:18:37 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+182.200.120.1 - - [28/Jul/1995:13:18:37 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+210.166.12.00 - - [28/Jul/1995:13:18:38 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:18:41 -0400] "GET /shuttle/missions/sts-74/mission-sts-74.html HTTP/1.0" 200 3790
+182.200.120.1 - - [28/Jul/1995:13:18:41 -0400] "GET /shuttle/missions/sts-74/sts-74-patch-small.gif HTTP/1.0" 200 5494
+198.155.12.92 - - [28/Jul/1995:13:18:41 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+182.200.120.1 - - [28/Jul/1995:13:18:42 -0400] "GET /shuttle/missions/sts-70/images/images.html HTTP/1.0" 200 8657
+182.200.120.1 - - [28/Jul/1995:13:18:42 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+182.200.120.1 - - [28/Jul/1995:13:18:42 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+182.200.120.1 - - [28/Jul/1995:13:18:46 -0400] "GET /images/launch-logo.gif HTTP/1.0" 304 0
+193.170.74.116 - - [28/Jul/1995:13:18:46 -0400] "HEAD /software/winvn/winvn.html HTTP/1.0" 200 0
+198.155.12.92 - - [28/Jul/1995:13:18:47 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+198.155.12.92 - - [28/Jul/1995:13:18:47 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+131.182.170.137 - - [28/Jul/1995:13:18:48 -0400] "GET /elv/uplink.htm HTTP/1.0" 200 1498
+182.200.120.1 - - [28/Jul/1995:13:18:50 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 304 0
+128.159.104.136 - - [28/Jul/1995:13:18:54 -0400] "GET / HTTP/1.0" 304 0
+131.182.170.137 - - [28/Jul/1995:13:18:54 -0400] "GET /elv/elvhead2.gif HTTP/1.0" 200 1733
+163.205.156.16 - - [28/Jul/1995:13:18:55 -0400] "GET /elv/whnew.htm HTTP/1.0" 200 3993
+199.183.150.10 - - [28/Jul/1995:13:18:56 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+163.205.156.16 - - [28/Jul/1995:13:18:57 -0400] "GET /elv/elvhead2.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:18:57 -0400] "GET / HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:18:58 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+182.200.120.1 - - [28/Jul/1995:13:18:58 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+210.166.12.00 - - [28/Jul/1995:13:18:58 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:18:59 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+198.155.12.13 - - [28/Jul/1995:13:18:59 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+199.183.150.10 - - [28/Jul/1995:13:18:59 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+182.200.120.1 - - [28/Jul/1995:13:18:59 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+198.155.12.13 - - [28/Jul/1995:13:19:00 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1- - [28/Jul/1995:13:19:00 -0400] "GET /shuttle/technology/sts-newsref/sts_asm.html HTTP/1.0" 200 71654
+182.200.120.1 - - [28/Jul/1995:13:19:01 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-1019.gif HTTP/1.0" 200 28728
+198.155.12.13 - - [28/Jul/1995:13:19:01 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+182.200.120.1- - [28/Jul/1995:13:19:01 -0400] "GET /shuttle/technology/images/srb_mod_compare_6-small.gif HTTP/1.0" 200 28219
+199.183.150.10 - - [28/Jul/1995:13:19:02 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+182.200.120.1- - [28/Jul/1995:13:19:02 -0400] "GET /shuttle/technology/images/srb_mod_compare_1-small.gif HTTP/1.0" 200 36902
+199.183.150.10 - - [28/Jul/1995:13:19:03 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+199.183.150.10 - - [28/Jul/1995:13:19:05 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.155.12.92 - - [28/Jul/1995:13:19:07 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:19:07 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1 - - [28/Jul/1995:13:19:09 -0400] "GET /history/astp/astp-spacecraft.txt HTTP/1.0" 200 440
+182.200.120.1- - [28/Jul/1995:13:19:10 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666
+198.155.12.13 - - [28/Jul/1995:13:19:12 -0400] "GET /shuttle/technology/sts-newsref/sts-msfc.html HTTP/1.0" 200 33360
+198.155.12.13 - - [28/Jul/1995:13:19:15 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+198.155.12.13 - - [28/Jul/1995:13:19:16 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+198.155.12.92 - - [28/Jul/1995:13:19:16 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+198.155.12.13 - - [28/Jul/1995:13:19:17 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+198.155.12.13 - - [28/Jul/1995:13:19:19 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+210.166.12.00 - - [28/Jul/1995:13:19:20 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:19:22 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+182.200.120.1- - [28/Jul/1995:13:19:23 -0400] "GET /images/shuttle-patch-small.gif HTTP/1.0" 200 4179
+198.155.12.13 - - [28/Jul/1995:13:19:24 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+182.200.120.1- - [28/Jul/1995:13:19:27 -0400] "GET /shuttle/technology/sts-newsref/stsref-toc.html HTTP/1.0" 200 84905
+198.155.12.13 - - [28/Jul/1995:13:19:30 -0400] "GET /shuttle/missions/sts-65/mission-sts-65.html HTTP/1.0" 200 131165
+182.200.120.1- - [28/Jul/1995:13:19:30 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+198.155.12.13 - - [28/Jul/1995:13:19:30 -0400] "GET /shuttle/missions/sts-65/sts-65-patch-small.gif HTTP/1.0" 200 11757
+198.155.12.13 - - [28/Jul/1995:13:19:32 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+163.205.156.61 - - [28/Jul/1995:13:19:32 -0400] "GET /elv/elvpage.htm HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:19:33 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+198.155.12.13 - - [28/Jul/1995:13:19:33 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+182.200.120.1 - - [28/Jul/1995:13:19:34 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+198.155.12.13 - - [28/Jul/1995:13:19:34 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+163.205.156.61 - - [28/Jul/1995:13:19:35 -0400] "GET /elv/endball.gif HTTP/1.0" 304 0
+163.205.156.61 - - [28/Jul/1995:13:19:35 -0400] "GET /elv/hot.gif HTTP/1.0" 304 0
+163.205.156.61 - - [28/Jul/1995:13:19:35 -0400] "GET /elv/bakgro.gif HTTP/1.0" 304 0
+163.205.156.61 - - [28/Jul/1995:13:19:35 -0400] "GET /elv/elvhead3.gif HTTP/1.0" 304 0
+170.166.12.00 - - [28/Jul/1995:13:19:39 -0400] "GET /shuttle/missions/sts-71/movies/movies.html HTTP/1.0" 200 3381
+198.155.12.13 - - [28/Jul/1995:13:19:39 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+198.155.12.13 - - [28/Jul/1995:13:19:40 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+170.166.12.00 - - [28/Jul/1995:13:19:41 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054
+210.166.12.00 - - [28/Jul/1995:13:19:41 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:19:49 -0400] "GET /history/apollo/flight-summary.txt HTTP/1.0" 200 5086
+198.155.12.13 - - [28/Jul/1995:13:19:49 -0400] "GET /persons/astronauts/m-to-p/MukaiCN.txt HTTP/1.0" 200 1754
+198.155.12.13 - - [28/Jul/1995:13:19:52 -0400] "GET /cgi-bin/imagemap/countdown70?184,287 HTTP/1.0" 302 110
+163.205.156.16 - - [28/Jul/1995:13:19:52 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+163.205.156.16 - - [28/Jul/1995:13:19:53 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:19:53 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:19:53 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 304 0
+222.218.120.1 - - [28/Jul/1995:13:19:53 -0400] "GET /shuttle/technology/images/launch_sites_8-small.gif HTTP/1.0" 200 74267
+163.205.156.16 - - [28/Jul/1995:13:19:53 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:19:53 -0400] "GET /shuttle/missions/sts-70/movies/movies.html HTTP/1.0" 200 2864
+182.200.120.1- - [28/Jul/1995:13:19:54 -0400] "GET /shuttle/technology/images/mission_profile_2-small.gif HTTP/1.0" 200 35540
+198.155.12.13 - - [28/Jul/1995:13:19:57 -0400] "GET /shuttle/missions/sts-70/sts-70-patch-small.gif HTTP/1.0" 200 5978
+182.200.120.1- - [28/Jul/1995:13:19:57 -0400] "GET /shuttle/technology/sts-newsref/mission_profile.html HTTP/1.0" 200 58688
+182.200.120.1- - [28/Jul/1995:13:19:59 -0400] "GET /shuttle/technology/images/tal_abort_2-small.gif HTTP/1.0" 200 10099
+210.166.12.00 - - [28/Jul/1995:13:20:02 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:20:06 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-0649.gif HTTP/1.0" 200 30043
+182.200.120.1 - - [28/Jul/1995:13:20:08 -0400] "GET /shuttle/missions/sts-74/sts-74-info.html HTTP/1.0" 200 1428
+198.155.12.92 - - [28/Jul/1995:13:20:10 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 5220
+198.155.12.13 - - [28/Jul/1995:13:20:12 -0400] "GET /shuttle/missions/sts-70/movies/sts-70-launch-srbsep.mpg HTTP/1.0" 200 49152
+163.205.156.16 - - [28/Jul/1995:13:20:16 -0400] "GET /elv/DOCS/elvrole.htm HTTP/1.0" 304 0
+163.205.42.94 - - [28/Jul/1995:13:20:18 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+182.200.120.1 - - [28/Jul/1995:13:20:21 -0400] "GET /shuttle/missions/sts-74/images/ HTTP/1.0" 200 378
+182.200.120.1 - - [28/Jul/1995:13:20:22 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+182.200.120.1 - - [28/Jul/1995:13:20:22 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+163.205.42.94 - - [28/Jul/1995:13:20:22 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+210.166.12.00 - - [28/Jul/1995:13:20:23 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+163.205.42.94 - - [28/Jul/1995:13:20:26 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+163.205.42.94 - - [28/Jul/1995:13:20:28 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+182.200.120.1 - - [28/Jul/1995:13:20:28 -0400] "GET /shuttle/missions/sts-74/movies/ HTTP/1.0" 200 378
+163.205.42.94 - - [28/Jul/1995:13:20:29 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+163.205.42.94 - - [28/Jul/1995:13:20:30 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.92 - - [28/Jul/1995:13:20:31 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 40960
+182.200.120.1 - - [28/Jul/1995:13:20:35 -0400] "GET /shuttle/missions/sts-74/news/ HTTP/1.0" 200 374
+198.155.12.92 - - [28/Jul/1995:13:20:39 -0400] "GET /shuttle/missions/sts-70/images/images.html HTTP/1.0" 200 8657
+198.155.12.92 - - [28/Jul/1995:13:20:40 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 40960
+150.148.199.70 - - [28/Jul/1995:13:20:42 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-landing.mpg HTTP/1.0" 200 1013716
+210.166.12.00 - - [28/Jul/1995:13:20:43 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:20:51 -0400] "HEAD /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 0
+222.218.120.1 - - [28/Jul/1995:13:20:52 -0400] "GET /shuttle/technology/images/mission_profile_2-small.gif HTTP/1.0" 200 35540
+163.205.156.16 - - [28/Jul/1995:13:20:53 -0400] "GET /elv/uplink.htm HTTP/1.0" 304 0
+204.138.95.101 - - [28/Jul/1995:13:20:53 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+170.166.12.00 - - [28/Jul/1995:13:20:54 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-mir-dock.mpg HTTP/1.0" 200 946425
+128.159.123.29 - - [28/Jul/1995:13:21:00 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.123.29 - - [28/Jul/1995:13:21:04 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+210.166.12.00 - - [28/Jul/1995:13:21:06 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:21:10 -0400] "GET /history/apollo/images/ HTTP/1.0" 200 3271
+128.159.123.29 - - [28/Jul/1995:13:21:12 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+198.155.12.13 - - [28/Jul/1995:13:21:12 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+128.159.123.29 - - [28/Jul/1995:13:21:12 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.159.123.29 - - [28/Jul/1995:13:21:13 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.159.123.29 - - [28/Jul/1995:13:21:13 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:21:16 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+198.155.12.13 - - [28/Jul/1995:13:21:17 -0400] "GET / HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:21:19 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.155.12.13 - - [28/Jul/1995:13:21:19 -0400] "GET / HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:21:20 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:21:20 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+198.155.12.13 - - [28/Jul/1995:13:21:20 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+198.155.12.13 - - [28/Jul/1995:13:21:20 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.155.12.13 - - [28/Jul/1995:13:21:20 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+198.155.12.13 - - [28/Jul/1995:13:21:21 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:21:22 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+192.112.239.11 - - [28/Jul/1995:13:21:23 -0400] "GET / HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:21:25 -0400] "GET / HTTP/1.0" 200 7280
+210.166.12.00 - - [28/Jul/1995:13:21:26 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+192.112.239.11 - - [28/Jul/1995:13:21:26 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+163.205.156.16 - - [28/Jul/1995:13:21:27 -0400] "GET /elv/uplink2.htm HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:21:29 -0400] "GET /msfc/onboard/onboard.html HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:21:29 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.155.12.13 - - [28/Jul/1995:13:21:29 -0400] "GET /msfc/onboard/redball.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:21:30 -0400] "GET / HTTP/1.0" 200 7280
+192.112.239.11 - - [28/Jul/1995:13:21:30 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+198.155.12.13 - - [28/Jul/1995:13:21:31 -0400] "GET /msfc/onboard/come_aboard.gif HTTP/1.0" 200 48682
+128.138.137.47 - - [28/Jul/1995:13:21:31 -0400] "GET /shuttle/missions/sts-74/mission-sts-74.html HTTP/1.0" 200 3790
+198.155.12.13 - - [28/Jul/1995:13:21:31 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.155.12.13 - - [28/Jul/1995:13:21:32 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+165.13.14.55 - - [28/Jul/1995:13:21:32 -0400] "GET /history/apollo/apollo-13/apollo-13-info.html HTTP/1.0" 200 1583
+198.155.12.13 - - [28/Jul/1995:13:21:33 -0400] "GET /msfc/onboard/colorbar.gif HTTP/1.0" 304 0
+128.138.137.47 - - [28/Jul/1995:13:21:33 -0400] "GET /shuttle/missions/sts-74/sts-74-patch-small.gif HTTP/1.0" 200 5494
+198.155.12.13 - - [28/Jul/1995:13:21:33 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+192.112.239.11 - - [28/Jul/1995:13:21:33 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.138.137.47 - - [28/Jul/1995:13:21:34 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+128.138.137.47 - - [28/Jul/1995:13:21:34 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+198.155.12.13 - - [28/Jul/1995:13:21:34 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.138.137.47 - - [28/Jul/1995:13:21:34 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+198.155.12.13 - - [28/Jul/1995:13:21:35 -0400] "HEAD /images/NASA-logosmall.gif HTTP/1.0" 200 0
+192.112.239.11 - - [28/Jul/1995:13:21:36 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.155.12.13 - - [28/Jul/1995:13:21:36 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+198.155.12.13 - - [28/Jul/1995:13:21:36 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.155.12.13 - - [28/Jul/1995:13:21:36 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+198.155.12.13 - - [28/Jul/1995:13:21:37 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.155.12.13 - - [28/Jul/1995:13:21:39 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.92 - - [28/Jul/1995:13:21:39 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-0515.jpg HTTP/1.0" 200 57344
+198.155.12.13 - - [28/Jul/1995:13:21:39 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+192.112.239.11 - - [28/Jul/1995:13:21:41 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:21:42 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+182.200.120.1 - - [28/Jul/1995:13:21:42 -0400] "GET /shuttle/missions/sts-49/mission-sts-49.html HTTP/1.0" 200 9273
+198.155.12.13 - - [28/Jul/1995:13:21:44 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1 - - [28/Jul/1995:13:21:44 -0400] "GET /shuttle/missions/sts-49/sts-49-patch-small.gif HTTP/1.0" 200 11628
+210.166.12.92 - - [28/Jul/1995:13:21:46 -0400] "GET /history/history.html HTTP/1.0" 200 1602
+210.166.12.00 - - [28/Jul/1995:13:21:46 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+165.137.30.52 - - [28/Jul/1995:13:21:47 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:21:48 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+210.166.12.92 - - [28/Jul/1995:13:21:48 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630
+182.200.120.1 - - [28/Jul/1995:13:21:49 -0400] "GET /shuttle/missions/sts-71/sts-71-press-kit.txt HTTP/1.0" 200 78588
+182.200.120.1- - [28/Jul/1995:13:21:49 -0400] "GET /shuttle/technology/sts-newsref/sts_mes.html HTTP/1.0" 200 175619
+182.200.120.1 - - [28/Jul/1995:13:21:51 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+198.155.12.13 - - [28/Jul/1995:13:21:52 -0400] "GET /whats-new.html HTTP/1.0" 200 18936
+163.205.156.16 - - [28/Jul/1995:13:21:55 -0400] "GET /elv/PEGASUS/pegdesc.htm HTTP/1.0" 304 0
+192.112.239.11 - - [28/Jul/1995:13:21:56 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+198.155.12.92 - - [28/Jul/1995:13:21:56 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-1015.gif HTTP/1.0" 200 55442
+192.112.239.11 - - [28/Jul/1995:13:21:58 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+210.166.12.92 - - [28/Jul/1995:13:22:01 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+198.155.12.13 - - [28/Jul/1995:13:22:01 -0400] "GET /images/whatsnew.gif HTTP/1.0" 200 651
+198.155.12.13 - - [28/Jul/1995:13:22:01 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+163.205.156.16 - - [28/Jul/1995:13:22:04 -0400] "GET /elv/SCOUT/scout.htm HTTP/1.0" 200 769
+210.166.12.92 - - [28/Jul/1995:13:22:05 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+198.240.108.240 - - [28/Jul/1995:13:22:07 -0400] "GET /images/IMPACT.JPG HTTP/1.0" 200 169883
+210.166.12.00 - - [28/Jul/1995:13:22:07 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:22:08 -0400] "GET /shuttle/missions/sts-71/movies/movies.html HTTP/1.0" 200 3381
+182.200.120.1 - - [28/Jul/1995:13:22:08 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054
+192.112.239.11 - - [28/Jul/1995:13:22:09 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+198.155.12.13 - - [28/Jul/1995:13:22:12 -0400] "GET /cgi-bin/imagemap/onboard?103,226 HTTP/1.0" 302 91
+210.166.12.92 - - [28/Jul/1995:13:22:13 -0400] "GET /shuttle/missions/sts-78/mission-sts-78.html HTTP/1.0" 200 4713
+210.166.12.92 - - [28/Jul/1995:13:22:16 -0400] "GET /shuttle/missions/sts-78/sts-78-patch-small.gif HTTP/1.0" 200 4179
+165.13.14.55 - - [28/Jul/1995:13:22:22 -0400] "GET /facilities/tour.html HTTP/1.0" 200 3723
+182.200.120.1 - - [28/Jul/1995:13:22:27 -0400] "GET /history/mercury/mercury.html HTTP/1.0" 200 1871
+210.166.12.00 - - [28/Jul/1995:13:22:28 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:22:28 -0400] "GET /images/mercury-logo.gif HTTP/1.0" 200 6588
+182.200.120.1 - - [28/Jul/1995:13:22:29 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+182.200.120.1 - - [28/Jul/1995:13:22:29 -0400] "GET /history/apollo/images/apollo-logo.gif HTTP/1.0" 200 3047
+182.200.120.1 - - [28/Jul/1995:13:22:36 -0400] "GET /history/mercury/mercury-spacecraft.txt HTTP/1.0" 200 761
+128.159.77.122 - - [28/Jul/1995:13:22:45 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.77.122 - - [28/Jul/1995:13:22:46 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.159.77.122 - - [28/Jul/1995:13:22:47 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.159.77.122 - - [28/Jul/1995:13:22:47 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.159.77.122 - - [28/Jul/1995:13:22:47 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.159.77.122 - - [28/Jul/1995:13:22:47 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+210.166.12.00 - - [28/Jul/1995:13:22:48 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.92 - - [28/Jul/1995:13:22:54 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 40960
+198.155.12.92 - - [28/Jul/1995:13:22:54 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.92 - - [28/Jul/1995:13:23:00 -0400] "GET /shuttle/countdown/countdown.html HTTP/1.0" 200 4324
+182.200.120.1 - - [28/Jul/1995:13:23:01 -0400] "GET /shuttle/missions/sts-54/mission-sts-54.html HTTP/1.0" 200 5690
+163.205.156.16 - - [28/Jul/1995:13:23:02 -0400] "GET /elv/vidpicp.htm HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/TITAN/mars1s.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/TITAN/mars2s.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/TITAN/mars3s.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/ATLAS_CENTAUR/atc69s.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/ATLAS_CENTAUR/acsuns.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/ATLAS_CENTAUR/goess.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/DELTA/dsolidss.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/DELTA/del181s.gif HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:03 -0400] "GET /elv/DELTA/rosats.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:04 -0400] "GET /elv/DELTA/euves.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:04 -0400] "GET /elv/SCOUT/radcals.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:04 -0400] "GET /elv/SCOUT/s_216s.jpg HTTP/1.0" 304 0
+163.205.156.16 - - [28/Jul/1995:13:23:04 -0400] "GET /elv/SCOUT/sampexs.jpg HTTP/1.0" 304 0
+210.166.12.00 - - [28/Jul/1995:13:23:09 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+163.205.156.16 - - [28/Jul/1995:13:23:16 -0400] "GET /elv/TITAN/mars1.jpg HTTP/1.0" 200 15014
+161.130.55.23 - - [28/Jul/1995:13:23:16 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+161.130.55.23 - - [28/Jul/1995:13:23:17 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+161.130.55.23 - - [28/Jul/1995:13:23:17 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+161.130.55.23 - - [28/Jul/1995:13:23:18 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+128.159.53.131 - - [28/Jul/1995:13:23:18 -0400] "GET /images/ksclogo.gif HTTP/1.0" 200 14298
+182.200.120.1 - - [28/Jul/1995:13:23:20 -0400] "GET /images/ HTTP/1.0" 200 17688
+163.205.156.16 - - [28/Jul/1995:13:23:22 -0400] "GET /elv/TITAN/mars3.jpg HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:23:26 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+163.205.156.16 - - [28/Jul/1995:13:23:28 -0400] "GET /elv/TITAN/mars2.jpg HTTP/1.0" 200 20361
+182.200.120.1 - - [28/Jul/1995:13:23:28 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+210.166.12.00 - - [28/Jul/1995:13:23:29 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:23:30 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+193.81.242.40 - - [28/Jul/1995:13:23:32 -0400] "GET /shuttle/technology/sts-newsref/sts-apu.html HTTP/1.0" 200 161920
+182.200.120.1 - - [28/Jul/1995:13:23:32 -0400] "GET /icons/unknown.xbm HTTP/1.0" 200 515
+182.200.120.1 - - [28/Jul/1995:13:23:37 -0400] "GET / HTTP/1.0" 200 7280
+204.241.117.12 - - [28/Jul/1995:13:23:39 -0400] "GET / HTTP/1.0" 200 7280
+204.241.117.12 - - [28/Jul/1995:13:23:41 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+182.200.120.1 - - [28/Jul/1995:13:23:41 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+182.200.120.1 - - [28/Jul/1995:13:23:42 -0400] "GET /facts/faq04.html HTTP/1.0" 200 27063
+204.241.117.12 - - [28/Jul/1995:13:23:43 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+163.205.156.16 - - [28/Jul/1995:13:23:43 -0400] "GET /elv/SCOUT/radcal.jpg HTTP/1.0" 200 26478
+193.81.242.40 - - [28/Jul/1995:13:23:43 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+204.241.117.12 - - [28/Jul/1995:13:23:43 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+193.81.242.40 - - [28/Jul/1995:13:23:43 -0400] "GET /images/shuttle-patch-logo.gif HTTP/1.0" 200 891
+204.241.117.12 - - [28/Jul/1995:13:23:44 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+182.200.120.1 - - [28/Jul/1995:13:23:44 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+182.200.120.1 - - [28/Jul/1995:13:23:45 -0400] "GET /images/faq.gif HTTP/1.0" 200 263
+204.241.117.12 - - [28/Jul/1995:13:23:46 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1 - - [28/Jul/1995:13:23:47 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+182.200.120.1 - - [28/Jul/1995:13:23:48 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+182.200.120.1 - - [28/Jul/1995:13:23:49 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+210.166.12.00 - - [28/Jul/1995:13:23:49 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+163.205.156.16 - - [28/Jul/1995:13:23:51 -0400] "GET /elv/SCOUT/s_216.jpg HTTP/1.0" 200 27109
+182.200.120.1 - - [28/Jul/1995:13:23:51 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1 - - [28/Jul/1995:13:23:58 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556
+128.159.77.122 - - [28/Jul/1995:13:24:06 -0400] "GET /history/history.html HTTP/1.0" 200 1602
+128.159.77.122 - - [28/Jul/1995:13:24:07 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630
+128.159.77.122 - - [28/Jul/1995:13:24:07 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+182.200.120.1 - - [28/Jul/1995:13:24:09 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+182.200.120.1 - - [28/Jul/1995:13:24:09 -0400] "GET /images/launchmedium.gif HTTP/1.0" 304 0
+210.166.12.00 - - [28/Jul/1995:13:24:11 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:24:11 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:24:11 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:24:20 -0400] "GET /shuttle/missions/sts-57/mission-sts-57.html HTTP/1.0" 200 11510
+182.200.120.1 - - [28/Jul/1995:13:24:20 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 10136
+182.200.120.1 - - [28/Jul/1995:13:24:21 -0400] "GET /shuttle/missions/sts-69/sts-69-patch-small.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:24:23 -0400] "GET /images/launch-logo.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:24:23 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 304 0
+198.155.12.92 - - [28/Jul/1995:13:24:25 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 40960
+182.200.120.1 - - [28/Jul/1995:13:24:26 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9866
+222.218.120.1 - - [28/Jul/1995:13:24:27 -0400] "GET /shuttle/technology/images/mission_profile_2-small.gif HTTP/1.0" 200 35540
+163.205.56.149 - - [28/Jul/1995:13:24:27 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+182.200.120.1 - - [28/Jul/1995:13:24:30 -0400] "GET /shuttle/resources/orbiters/endeavour.html HTTP/1.0" 200 6168
+182.200.120.1 - - [28/Jul/1995:13:24:31 -0400] "GET /shuttle/resources/orbiters/endeavour-logo.gif HTTP/1.0" 200 5052
+210.166.12.00 - - [28/Jul/1995:13:24:31 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+199.242.69.156 - - [28/Jul/1995:13:24:31 -0400] "GET /images/construct.gif HTTP/1.0" 200 1414
+182.200.120.1 - - [28/Jul/1995:13:24:33 -0400] "GET /software/winvn/winvn.gif HTTP/1.0" 200 25218
+182.200.120.1 - - [28/Jul/1995:13:24:33 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+182.200.120.1 - - [28/Jul/1995:13:24:33 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932
+182.200.120.1 - - [28/Jul/1995:13:24:33 -0400] "GET /images/construct.gif HTTP/1.0" 200 1414
+182.200.120.1 - - [28/Jul/1995:13:24:33 -0400] "GET /software/winvn/bluemarb.gif HTTP/1.0" 200 4441
+222.218.120.1 - - [28/Jul/1995:13:24:34 -0400] "GET /shuttle/technology/images/sts_spec_6-small.gif HTTP/1.0" 200 47145
+182.200.120.1 - - [28/Jul/1995:13:24:35 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859
+182.200.120.1 - - [28/Jul/1995:13:24:36 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+128.159.77.122 - - [28/Jul/1995:13:24:36 -0400] "GET /history/early-astronauts.txt HTTP/1.0" 200 3850
+182.200.120.1 - - [28/Jul/1995:13:24:37 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+182.200.120.1 - - [28/Jul/1995:13:24:40 -0400] "GET /shuttle/missions/sts-71/sts-71-press-kit.txt HTTP/1.0" 200 78588
+182.200.120.1 - - [28/Jul/1995:13:24:40 -0400] "GET /software/winvn/wvsmall.gif HTTP/1.0" 200 13372
+182.200.120.1 - - [28/Jul/1995:13:24:41 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+192.112.239.11 - - [28/Jul/1995:13:24:42 -0400] "GET /cgi-bin/imagemap/countdown70?397,276 HTTP/1.0" 302 68
+182.200.120.1 - - [28/Jul/1995:13:24:44 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+182.200.120.1 - - [28/Jul/1995:13:24:47 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+182.200.120.1 - - [28/Jul/1995:13:24:47 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+210.166.12.00 - - [28/Jul/1995:13:24:52 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+222.218.120.1 - - [28/Jul/1995:13:24:53 -0400] "GET /shuttle/technology/images/launch_sites_8-small.gif HTTP/1.0" 200 73728
+199.242.69.156 - - [28/Jul/1995:13:24:53 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+198.155.12.13 - - [28/Jul/1995:13:24:53 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+199.242.69.156 - - [28/Jul/1995:13:24:55 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+182.200.120.1 - - [28/Jul/1995:13:24:55 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209
+198.155.12.13 - - [28/Jul/1995:13:24:55 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+182.200.120.1 - - [28/Jul/1995:13:24:55 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+198.155.12.13 - - [28/Jul/1995:13:24:57 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+198.155.12.13 - - [28/Jul/1995:13:24:58 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+199.242.69.156 - - [28/Jul/1995:13:24:59 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.155.12.13 - - [28/Jul/1995:13:24:59 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+222.218.120.1 - - [28/Jul/1995:13:25:00 -0400] "GET /history/history.html HTTP/1.0" 200 1602
+198.155.12.13 - - [28/Jul/1995:13:25:00 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+222.218.120.1 - - [28/Jul/1995:13:25:03 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630
+199.242.69.156 - - [28/Jul/1995:13:25:03 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:25:11 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+210.166.12.00 - - [28/Jul/1995:13:25:12 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+222.218.120.1 - - [28/Jul/1995:13:25:13 -0400] "GET /shuttle/missions/sts-71/movies/movies.html HTTP/1.0" 200 3381
+198.155.12.13 - - [28/Jul/1995:13:25:13 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+198.155.12.13 - - [28/Jul/1995:13:25:16 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+182.200.120.1 - - [28/Jul/1995:13:25:18 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+182.200.120.1 - - [28/Jul/1995:13:25:23 -0400] "GET /facts/facts.html HTTP/1.0" 200 4722
+180.176.12.00 - - [28/Jul/1995:13:25:24 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:25:24 -0400] "GET / HTTP/1.0" 200 7280
+180.176.12.00 - - [28/Jul/1995:13:25:25 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+182.200.120.1 - - [28/Jul/1995:13:25:25 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+182.200.120.1 - - [28/Jul/1995:13:25:26 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.176.12.00 - - [28/Jul/1995:13:25:27 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+180.176.12.00 - - [28/Jul/1995:13:25:27 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+180.176.12.00 - - [28/Jul/1995:13:25:28 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+180.176.12.00 - - [28/Jul/1995:13:25:28 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:25:28 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 304 0
+210.166.12.00 - - [28/Jul/1995:13:25:32 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:25:33 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:25:34 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:25:34 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 304 0
+222.218.120.1 - - [28/Jul/1995:13:25:36 -0400] "GET / HTTP/1.0" 200 7280
+222.218.120.1 - - [28/Jul/1995:13:25:36 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.155.12.13 - - [28/Jul/1995:13:25:37 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+222.218.120.1 - - [28/Jul/1995:13:25:38 -0400] "GET /shuttle/technology/images/srb_16-small.gif HTTP/1.0" 200 42732
+222.218.120.1 - - [28/Jul/1995:13:25:38 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+222.218.120.1 - - [28/Jul/1995:13:25:38 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+222.218.120.1 - - [28/Jul/1995:13:25:38 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+222.218.120.1 - - [28/Jul/1995:13:25:39 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:25:39 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+198.155.12.13 - - [28/Jul/1995:13:25:43 -0400] "GET /cgi-bin/imagemap/countdown70?71,194 HTTP/1.0" 302 96
+128.159.122.45 - - [28/Jul/1995:13:25:46 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:25:47 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+128.159.122.45 - - [28/Jul/1995:13:25:48 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.159.122.45 - - [28/Jul/1995:13:25:49 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.159.122.45 - - [28/Jul/1995:13:25:49 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.159.122.45 - - [28/Jul/1995:13:25:49 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.159.122.45 - - [28/Jul/1995:13:25:50 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1 - - [28/Jul/1995:13:25:50 -0400] "GET /facts/faq03.html HTTP/1.0" 200 44449
+182.200.120.1 - - [28/Jul/1995:13:25:50 -0400] "GET / HTTP/1.0" 200 7280
+210.166.12.00 - - [28/Jul/1995:13:25:54 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:25:54 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.155.12.13 - - [28/Jul/1995:13:25:58 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:26:00 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+222.218.120.1 - - [28/Jul/1995:13:26:01 -0400] "GET /htbin/wais.pl HTTP/1.0" 200 308
+198.155.12.13 - - [28/Jul/1995:13:26:03 -0400] "GET /history/history.html HTTP/1.0" 200 1602
+198.155.12.13 - - [28/Jul/1995:13:26:04 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630
+222.218.120.1 - - [28/Jul/1995:13:26:08 -0400] "GET /htbin/wais.pl?winvn HTTP/1.0" 200 6212
+128.159.77.122 - - [28/Jul/1995:13:26:11 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+152.140.45.108 - - [28/Jul/1995:13:26:15 -0400] "HEAD /shuttle/missions/sts-61/mission-sts-61.html HTTP/1.0" 200 0
+210.166.12.00 - - [28/Jul/1995:13:26:16 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+193.81.242.40 - - [28/Jul/1995:13:26:17 -0400] "GET /shuttle/technology/sts-newsref/sts-gear.html HTTP/1.0" 200 65575
+198.155.12.13 - - [28/Jul/1995:13:26:18 -0400] "GET /history/skylab/skylab.html HTTP/1.0" 200 1687
+198.155.12.13 - - [28/Jul/1995:13:26:19 -0400] "GET /history/skylab/skylab-small.gif HTTP/1.0" 200 9202
+198.155.12.13 - - [28/Jul/1995:13:26:20 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:26:20 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:26:21 -0400] "GET / HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:26:22 -0400] "GET /history/apollo/images/apollo-logo.gif HTTP/1.0" 200 3047
+198.155.12.13 - - [28/Jul/1995:13:26:22 -0400] "GET / HTTP/1.0" 304 0
+128.159.122.118 - - [28/Jul/1995:13:26:22 -0400] "GET / HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:26:24 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:26:24 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:26:25 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:26:29 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 304 0
+222.218.120.1 - - [28/Jul/1995:13:26:29 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+198.155.12.13 - - [28/Jul/1995:13:26:32 -0400] "GET /images/launchmedium.gif HTTP/1.0" 304 0
+198.155.12.13 - - [28/Jul/1995:13:26:36 -0400] "GET /history/skylab/skylab-4.html HTTP/1.0" 200 1165
+210.166.12.00 - - [28/Jul/1995:13:26:36 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:26:37 -0400] "GET /history/skylab/skylab-4-small.gif HTTP/1.0" 200 13775
+222.218.120.1 - - [28/Jul/1995:13:26:37 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+198.155.12.13 - - [28/Jul/1995:13:26:39 -0400] "GET /history/skylab/skylab-logo.gif HTTP/1.0" 200 3274
+222.218.120.1 - - [28/Jul/1995:13:26:41 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+222.218.120.1 - - [28/Jul/1995:13:26:41 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0
+222.218.120.1 - - [28/Jul/1995:13:26:42 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+193.81.242.40 - - [28/Jul/1995:13:26:42 -0400] "GET /shuttle/technology/sts-newsref/sts_asm.html HTTP/1.0" 200 71654
+222.218.120.1 - - [28/Jul/1995:13:26:43 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+222.218.120.1 - - [28/Jul/1995:13:26:43 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+222.218.120.1 - - [28/Jul/1995:13:26:44 -0400] "GET /statistics/statistics.html HTTP/1.0" 200 2813
+222.218.120.1 - - [28/Jul/1995:13:26:45 -0400] "GET /statistics/images/getstats_big.gif HTTP/1.0" 200 6777
+222.218.120.1 - - [28/Jul/1995:13:26:45 -0400] "GET /statistics/images/statsm.gif HTTP/1.0" 200 4413
+222.218.120.1 - - [28/Jul/1995:13:26:45 -0400] "GET /icon/new01.gif HTTP/1.0" 200 1016
+222.218.120.1 - - [28/Jul/1995:13:26:47 -0400] "GET / HTTP/1.0" 200 7280
+198.155.12.92 - - [28/Jul/1995:13:26:49 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 49152
+222.218.120.1 - - [28/Jul/1995:13:26:49 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.155.12.13 - - [28/Jul/1995:13:26:50 -0400] "GET /facts/faq04.html HTTP/1.0" 200 27063
+193.81.242.40 - - [28/Jul/1995:13:26:51 -0400] "GET /shuttle/technology/images/srb_mod_compare_1-small.gif HTTP/1.0" 200 36902
+222.218.120.1 - - [28/Jul/1995:13:26:51 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+222.218.120.1 - - [28/Jul/1995:13:26:51 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+193.81.242.40 - - [28/Jul/1995:13:26:52 -0400] "GET /shuttle/technology/images/srb_mod_compare_6-small.gif HTTP/1.0" 200 28219
+222.218.120.1 - - [28/Jul/1995:13:26:52 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+128.159.77.122 - - [28/Jul/1995:13:26:53 -0400] "GET /facts/facts.html HTTP/1.0" 200 4722
+222.218.120.1 - - [28/Jul/1995:13:26:54 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.159.77.122 - - [28/Jul/1995:13:26:54 -0400] "GET /images/faq.gif HTTP/1.0" 200 263
+193.81.242.40 - - [28/Jul/1995:13:26:56 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 49152
+222.218.120.1 - - [28/Jul/1995:13:26:56 -0400] "GET /facts/facts.html HTTP/1.0" 200 4722
+210.166.12.00 - - [28/Jul/1995:13:26:57 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+222.218.120.1 - - [28/Jul/1995:13:26:57 -0400] "GET /images/faq.gif HTTP/1.0" 200 263
+222.218.120.1 - - [28/Jul/1995:13:26:57 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+198.155.12.92 - - [28/Jul/1995:13:26:59 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 10136
+198.155.12.92 - - [28/Jul/1995:13:27:00 -0400] "GET /shuttle/missions/sts-69/sts-69-patch-small.gif HTTP/1.0" 200 8083
+128.159.77.122 - - [28/Jul/1995:13:27:00 -0400] "GET /facts/faq06.html HTTP/1.0" 200 12686
+128.159.77.122 - - [28/Jul/1995:13:27:01 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+222.218.120.1 - - [28/Jul/1995:13:27:12 -0400] "GET /history/history.html HTTP/1.0" 200 1602
+222.218.120.1 - - [28/Jul/1995:13:27:14 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630
+210.166.12.00 - - [28/Jul/1995:13:27:18 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+222.218.120.1 - - [28/Jul/1995:13:27:19 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+222.218.120.1 - - [28/Jul/1995:13:27:19 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+222.218.120.1 - - [28/Jul/1995:13:27:21 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+198.155.12.13 - - [28/Jul/1995:13:27:21 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260
+198.155.12.13 - - [28/Jul/1995:13:27:22 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149
+198.155.12.13 - - [28/Jul/1995:13:27:22 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+198.155.12.13 - - [28/Jul/1995:13:27:22 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+222.218.120.1 - - [28/Jul/1995:13:27:25 -0400] "GET /facilities/tour.html HTTP/1.0" 200 3723
+222.218.120.1 - - [28/Jul/1995:13:27:26 -0400] "GET /images/kscmap-small.gif HTTP/1.0" 200 39017
+222.218.120.1 - - [28/Jul/1995:13:27:26 -0400] "GET /history/history.html HTTP/1.0" 304 0
+222.218.120.1 - - [28/Jul/1995:13:27:28 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:27:30 -0400] "GET /shuttle/missions/sts-37/mission-sts-37.html HTTP/1.0" 200 5864
+222.218.120.1 - - [28/Jul/1995:13:27:31 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0
+222.218.120.1 - - [28/Jul/1995:13:27:32 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+182.200.120.1 - - [28/Jul/1995:13:27:32 -0400] "GET /shuttle/missions/sts-37/sts-37-patch-small.gif HTTP/1.0" 200 10371
+222.218.120.1 - - [28/Jul/1995:13:27:33 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+222.218.120.1 - - [28/Jul/1995:13:27:34 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+222.218.120.1 - - [28/Jul/1995:13:27:34 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:27:35 -0400] "GET /history/history.html HTTP/1.0" 200 1602
+222.218.120.1 - - [28/Jul/1995:13:27:37 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+222.218.120.1 - - [28/Jul/1995:13:27:38 -0400] "GET /cgi-bin/imagemap/countdown70?57,183 HTTP/1.0" 302 96
+210.166.12.00 - - [28/Jul/1995:13:27:38 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+128.159.77.122 - - [28/Jul/1995:13:27:38 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.122.45 - - [28/Jul/1995:13:27:39 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+222.218.120.1 - - [28/Jul/1995:13:27:42 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-mir-dock.mpg HTTP/1.0" 200 946425
+222.218.120.1 - - [28/Jul/1995:13:27:42 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+222.218.120.1 - - [28/Jul/1995:13:27:43 -0400] "GET /shuttle/technology/sts-newsref/stsref-toc.html HTTP/1.0" 200 84905
+128.159.122.45 - - [28/Jul/1995:13:27:43 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.159.122.45 - - [28/Jul/1995:13:27:48 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.159.122.45 - - [28/Jul/1995:13:27:48 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+222.218.120.1 - - [28/Jul/1995:13:27:48 -0400] "GET /shuttle/technology/images/srb_16.jpg HTTP/1.0" 200 107593
+128.159.122.45 - - [28/Jul/1995:13:27:48 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.159.122.45 - - [28/Jul/1995:13:27:49 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+128.159.77.122 - - [28/Jul/1995:13:27:50 -0400] "GET /facilities/tour.html HTTP/1.0" 200 3723
+128.159.77.122 - - [28/Jul/1995:13:27:51 -0400] "GET /images/kscmap-small.gif HTTP/1.0" 200 39017
+222.218.120.1 - - [28/Jul/1995:13:27:52 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 304 0
+222.218.120.1 - - [28/Jul/1995:13:27:54 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 304 0
+222.218.120.1 - - [28/Jul/1995:13:27:54 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 304 0
+182.200.120.1 - - [28/Jul/1995:13:27:54 -0400] "GET /history/apollo/apollo-13/apollo-13-info.html HTTP/1.0" 200 1583
+210.166.12.00 - - [28/Jul/1995:13:27:58 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.13 - - [28/Jul/1995:13:28:01 -0400] "GET /history/skylab/skylab-station.txt HTTP/1.0" 200 286
+222.218.120.1 - - [28/Jul/1995:13:28:03 -0400] "GET /htbin/wais.pl HTTP/1.0" 200 308
+182.200.120.1 - - [28/Jul/1995:13:28:03 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630
+180.176.12.00 - - [28/Jul/1995:13:28:08 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9866
+128.159.77.122 - - [28/Jul/1995:13:28:11 -0400] "GET /images/kscmap.gif HTTP/1.0" 200 177415
+180.176.12.00 - - [28/Jul/1995:13:28:11 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556
+180.176.12.00 - - [28/Jul/1995:13:28:12 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859
+198.155.12.13 - - [28/Jul/1995:13:28:12 -0400] "GET /history/apollo/apollo-spacecraft.txt HTTP/1.0" 200 2261
+128.217.61.99 - - [28/Jul/1995:13:28:13 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+180.176.12.00 - - [28/Jul/1995:13:28:13 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209
+180.176.12.00 - - [28/Jul/1995:13:28:13 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+128.217.61.99 - - [28/Jul/1995:13:28:13 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.217.61.99 - - [28/Jul/1995:13:28:14 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.217.61.99 - - [28/Jul/1995:13:28:15 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.217.61.99 - - [28/Jul/1995:13:28:15 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+222.218.120.1 - - [28/Jul/1995:13:28:16 -0400] "GET /htbin/wais.pl?camp HTTP/1.0" 200 5660
+128.217.61.99 - - [28/Jul/1995:13:28:17 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+210.166.12.00 - - [28/Jul/1995:13:28:18 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+180.176.12.00 - - [28/Jul/1995:13:28:20 -0400] "GET /facts/faq05.html HTTP/1.0" 200 38485
+198.209.221.200 - - [28/Jul/1995:13:28:21 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.121.64 - - [28/Jul/1995:13:28:21 -0400] "GET /finance/main.htm HTTP/1.0" 200 1974
+198.155.12.13 - - [28/Jul/1995:13:28:22 -0400] "GET /history/skylab/skylab-operations.txt HTTP/1.0" 200 13586
+128.159.121.64 - - [28/Jul/1995:13:28:24 -0400] "GET /finance/collsm1.gif HTTP/1.0" 200 52781
+128.159.121.64 - - [28/Jul/1995:13:28:25 -0400] "GET /finance/suit.gif HTTP/1.0" 200 1294
+128.159.121.64 - - [28/Jul/1995:13:28:25 -0400] "GET /finance/links.gif HTTP/1.0" 200 1069
+128.159.121.64 - - [28/Jul/1995:13:28:26 -0400] "GET /finance/ref_btn.gif HTTP/1.0" 200 2582
+128.159.121.64 - - [28/Jul/1995:13:28:26 -0400] "GET /finance/webserch.gif HTTP/1.0" 200 2682
+180.176.12.00 - - [28/Jul/1995:13:28:26 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 8529
+198.209.221.200 - - [28/Jul/1995:13:28:26 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.159.121.64 - - [28/Jul/1995:13:28:26 -0400] "GET /finance/toairpla.gif HTTP/1.0" 200 2498
+128.159.121.64 - - [28/Jul/1995:13:28:27 -0400] "GET /finance/book.gif HTTP/1.0" 200 3203
+128.159.121.64 - - [28/Jul/1995:13:28:27 -0400] "GET /finance/tour.gif HTTP/1.0" 200 2845
+128.159.121.64 - - [28/Jul/1995:13:28:27 -0400] "GET /finance/brrow_1t.gif HTTP/1.0" 200 632
+198.209.221.200 - - [28/Jul/1995:13:28:28 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+222.218.120.1 - - [28/Jul/1995:13:28:30 -0400] "GET /history/gemini/gemini.html HTTP/1.0" 200 2522
+182.200.120.1 - - [28/Jul/1995:13:28:31 -0400] "GET /shuttle/missions/sts-37/news HTTP/1.0" 302 -
+182.200.120.1 - - [28/Jul/1995:13:28:31 -0400] "GET /shuttle/missions/sts-37/news/ HTTP/1.0" 200 374
+182.200.120.1 - - [28/Jul/1995:13:28:32 -0400] "GET /history/apollo/apollo-13/images/ HTTP/1.0" 200 1851
+222.218.120.1 - - [28/Jul/1995:13:28:32 -0400] "GET /images/gemini-logo.gif HTTP/1.0" 200 4452
+222.218.120.1 - - [28/Jul/1995:13:28:33 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+222.218.120.1 - - [28/Jul/1995:13:28:33 -0400] "GET /history/apollo/images/apollo-logo.gif HTTP/1.0" 200 3047
+222.218.120.1 - - [28/Jul/1995:13:28:33 -0400] "GET / HTTP/1.0" 200 7280
+198.209.221.200 - - [28/Jul/1995:13:28:33 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+198.209.221.200 - - [28/Jul/1995:13:28:34 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+180.176.12.00 - - [28/Jul/1995:13:28:35 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+180.176.12.00 - - [28/Jul/1995:13:28:36 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.209.221.200 - - [28/Jul/1995:13:28:36 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+180.176.12.00 - - [28/Jul/1995:13:28:38 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+180.176.12.00 - - [28/Jul/1995:13:28:38 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+180.176.12.00 - - [28/Jul/1995:13:28:38 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+180.176.12.00 - - [28/Jul/1995:13:28:38 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+210.166.12.00 - - [28/Jul/1995:13:28:39 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+180.176.12.00 - - [28/Jul/1995:13:28:40 -0400] "GET /software/winvn/wvlarge.gif HTTP/1.0" 200 23416
+180.176.12.00 - - [28/Jul/1995:13:28:41 -0400] "GET /shuttle/missions/sts-62/sts-62-patch-small.gif HTTP/1.0" 200 14385
+222.218.120.1 - - [28/Jul/1995:13:28:42 -0400] "GET /shuttle/technology/images/sts_spec_6-small.gif HTTP/1.0" 200 47145
+222.218.120.1 - - [28/Jul/1995:13:28:42 -0400] "GET /shuttle/technology/images/launch_sites_8-small.gif HTTP/1.0" 200 40960
+163.205.53.14 - - [28/Jul/1995:13:28:49 -0400] "GET /images/shuttle-patch-small.gif HTTP/1.0" 200 4179
+163.205.53.14 - - [28/Jul/1995:13:28:51 -0400] "GET /shuttle/technology/sts-newsref/stsref-toc.html HTTP/1.0" 200 84905
+222.218.120.1 - - [28/Jul/1995:13:28:52 -0400] "GET /history/gemini/flight-summary.txt HTTP/1.0" 200 2794
+163.205.53.14 - - [28/Jul/1995:13:28:53 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+163.205.53.14 - - [28/Jul/1995:13:28:53 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.176.12.00 - - [28/Jul/1995:13:28:55 -0400] "GET /shuttle/missions/sts-62/mission-sts-62.html HTTP/1.0" 200 64619
+222.218.120.1 - - [28/Jul/1995:13:28:58 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+222.218.120.1 - - [28/Jul/1995:13:28:59 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.176.12.00 - - [28/Jul/1995:13:29:00 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 304 0
+210.166.12.00 - - [28/Jul/1995:13:29:00 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+182.200.120.1 - - [28/Jul/1995:13:29:01 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+180.176.12.00 - - [28/Jul/1995:13:29:01 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+180.176.12.00 - - [28/Jul/1995:13:29:02 -0400] "GET /shuttle/missions/sts-69/sts-69-patch-small.gif HTTP/1.0" 304 0
+180.176.12.00 - - [28/Jul/1995:13:29:02 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+180.176.12.00 - - [28/Jul/1995:13:29:02 -0400] "GET /images/launch-logo.gif HTTP/1.0" 304 0
+180.176.12.00 - - [28/Jul/1995:13:29:02 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+180.176.12.00 - - [28/Jul/1995:13:29:03 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 304 0
+163.205.53.14 - - [28/Jul/1995:13:29:04 -0400] "GET /shuttle/technology/sts-newsref/sts_asm.html HTTP/1.0" 200 71654
+180.176.12.00 - - [28/Jul/1995:13:29:04 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+180.176.12.00 - - [28/Jul/1995:13:29:04 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+163.205.53.14 - - [28/Jul/1995:13:29:06 -0400] "GET /shuttle/technology/images/srb_mod_compare_1-small.gif HTTP/1.0" 200 36902
+163.205.53.14 - - [28/Jul/1995:13:29:06 -0400] "GET /shuttle/technology/images/srb_mod_compare_6-small.gif HTTP/1.0" 200 28219
+182.200.120.1 - - [28/Jul/1995:13:29:06 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+163.205.53.14 - - [28/Jul/1995:13:29:06 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666
+163.205.53.14 - - [28/Jul/1995:13:29:06 -0400] "GET /images/shuttle-patch-logo.gif HTTP/1.0" 200 891
+182.200.120.1 - - [28/Jul/1995:13:29:08 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+182.200.120.1 - - [28/Jul/1995:13:29:12 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260
+180.176.12.00 - - [28/Jul/1995:13:29:12 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+180.176.12.00 - - [28/Jul/1995:13:29:12 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+180.176.12.00 - - [28/Jul/1995:13:29:12 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+130.151.90.75 - - [28/Jul/1995:13:29:13 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556
+128.158.57.20 - - [28/Jul/1995:13:29:14 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+130.151.90.75 - - [28/Jul/1995:13:29:15 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859
+128.158.57.20 - - [28/Jul/1995:13:29:15 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+130.151.90.75 - - [28/Jul/1995:13:29:16 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+130.151.90.75 - - [28/Jul/1995:13:29:16 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209
+128.158.57.20 - - [28/Jul/1995:13:29:18 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+222.218.120.1 - - [28/Jul/1995:13:29:18 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+180.176.12.00 - - [28/Jul/1995:13:29:18 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 10136
+128.158.57.20 - - [28/Jul/1995:13:29:19 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+180.176.12.00 - - [28/Jul/1995:13:29:19 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+180.176.12.00 - - [28/Jul/1995:13:29:19 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+194.166.2.31 - - [28/Jul/1995:13:29:20 -0400] "GET / HTTP/1.0" 200 7280
+210.166.12.00 - - [28/Jul/1995:13:29:21 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.209.221.200 - - [28/Jul/1995:13:29:23 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 10136
+180.176.12.00 - - [28/Jul/1995:13:29:24 -0400] "GET /shuttle/missions/sts-69/sts-69-patch-small.gif HTTP/1.0" 200 8083
+192.138.199.30 - - [28/Jul/1995:13:29:24 -0400] "GET /elv/uplink.htm HTTP/1.0" 200 1498
+192.138.199.30 - - [28/Jul/1995:13:29:26 -0400] "GET /elv/elvhead2.gif HTTP/1.0" 200 1733
+180.176.12.00- - [28/Jul/1995:13:29:27 -0400] "GET /shuttle/countdown/countdown.html HTTP/1.0" 200 4324
+182.198.120.1 - - [28/Jul/1995:13:29:27 -0400] "GET /images/ HTTP/1.0" 200 17688
+128.159.77.122 - - [28/Jul/1995:13:29:28 -0400] "GET /facilities/crawler.html HTTP/1.0" 200 3601
+182.198.120.1 - - [28/Jul/1995:13:29:28 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509
+182.198.120.1 - - [28/Jul/1995:13:29:28 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527
+128.159.77.122 - - [28/Jul/1995:13:29:29 -0400] "GET /images/crawler-logo.gif HTTP/1.0" 200 14108
+194.166.2.31 - - [28/Jul/1995:13:29:29 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.159.77.122 - - [28/Jul/1995:13:29:29 -0400] "GET /images/kscmap-tiny.gif HTTP/1.0" 200 2537
+180.176.12.00- - [28/Jul/1995:13:29:31 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+182.200.120.1 - - [28/Jul/1995:13:29:31 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149
+180.176.12.00- - [28/Jul/1995:13:29:32 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.176.12.00 - - [28/Jul/1995:13:29:32 -0400] "GET /msfc/astro_home.html HTTP/1.0" 200 2938
+163.205.53.14 - - [28/Jul/1995:13:29:33 -0400] "GET /shuttle/technology/images/srb_mod_compare_6-small.gif HTTP/1.0" 200 28219
+163.205.53.14 - - [28/Jul/1995:13:29:33 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+163.205.53.14 - - [28/Jul/1995:13:29:33 -0400] "GET /shuttle/technology/images/srb_mod_compare_1-small.gif HTTP/1.0" 200 36902
+163.205.53.14 - - [28/Jul/1995:13:29:34 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666
+182.198.120.1 - - [28/Jul/1995:13:29:35 -0400] "GET /icons/unknown.xbm HTTP/1.0" 200 515
+222.218.120.1 - - [28/Jul/1995:13:29:36 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260
+182.198.120.1 - - [28/Jul/1995:13:29:36 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509
+222.218.120.1 - - [28/Jul/1995:13:29:37 -0400] "GET /cgi-bin/imagemap/countdown70?11,351 HTTP/1.0" 302 102
+222.218.120.1 - - [28/Jul/1995:13:29:37 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149
+222.218.120.1 - - [28/Jul/1995:13:29:38 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+222.218.120.1 - - [28/Jul/1995:13:29:38 -0400] "GET /shuttle/countdown/countdown70.html HTTP/1.0" 200 4247
+180.166.12.00 - - [28/Jul/1995:13:29:38 -0400] "GET / HTTP/1.0" 200 7280
+222.218.120.1 - - [28/Jul/1995:13:29:38 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+128.217.63.13 - - [28/Jul/1995:13:29:41 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+210.166.12.00 - - [28/Jul/1995:13:29:41 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+128.217.63.13 - - [28/Jul/1995:13:29:43 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.158.57.20 - - [28/Jul/1995:13:29:43 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3674
+128.158.57.20 - - [28/Jul/1995:13:29:44 -0400] "GET /shuttle/countdown/images/countclock.gif HTTP/1.0" 200 13994
+128.217.63.13 - - [28/Jul/1995:13:29:45 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+163.205.53.14 - - [28/Jul/1995:13:29:46 -0400] "GET /images/shuttle-patch-logo.gif HTTP/1.0" 200 891
+194.166.2.31 - - [28/Jul/1995:13:29:46 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.217.63.13 - - [28/Jul/1995:13:29:47 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+194.166.2.31 - - [28/Jul/1995:13:29:47 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+194.166.2.31 - - [28/Jul/1995:13:29:47 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.217.63.13 - - [28/Jul/1995:13:29:47 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+222.218.120.1 - - [28/Jul/1995:13:29:48 -0400] "GET /history/apollo/flight-summary.txt HTTP/1.0" 200 5086
+128.217.63.13 - - [28/Jul/1995:13:29:48 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+180.176.12.00- - [28/Jul/1995:13:29:51 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+180.166.12.00 - - [28/Jul/1995:13:29:51 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+194.166.2.31 - - [28/Jul/1995:13:29:51 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+222.218.120.1 - - [28/Jul/1995:13:29:53 -0400] "GET /cgi-bin/imagemap/countdown70?277,289 HTTP/1.0" 302 85
+180.176.12.00 - - [28/Jul/1995:13:29:53 -0400] "GET /msfc/astro_home3.gif HTTP/1.0" 200 106535
+182.200.120.1 - - [28/Jul/1995:13:29:54 -0400] "GET /history/apollo/apollo-13/images/index.gif HTTP/1.0" 200 99942
+222.218.120.1 - - [28/Jul/1995:13:29:55 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3674
+198.209.221.200 - - [28/Jul/1995:13:29:56 -0400] "GET /shuttle/missions/sts-69/sts-69-patch-small.gif HTTP/1.0" 200 8083
+222.218.120.1 - - [28/Jul/1995:13:29:56 -0400] "GET /shuttle/countdown/images/countclock.gif HTTP/1.0" 200 13994
+128.217.63.13 - - [28/Jul/1995:13:29:57 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.77.122 - - [28/Jul/1995:13:29:57 -0400] "GET /facilities/slf.html HTTP/1.0" 200 3995
+128.159.77.122 - - [28/Jul/1995:13:29:57 -0400] "GET /images/slf-logo.gif HTTP/1.0" 200 10966
+180.166.12.00 - - [28/Jul/1995:13:30:02 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+210.166.12.00 - - [28/Jul/1995:13:30:02 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.209.221.200 - - [28/Jul/1995:13:30:05 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.166.12.00 - - [28/Jul/1995:13:30:05 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+180.166.12.00 - - [28/Jul/1995:13:30:07 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+222.218.120.1 - - [28/Jul/1995:13:30:09 -0400] "GET /history/apollo/apollo-goals.txt HTTP/1.0" 200 712
+180.166.12.00 - - [28/Jul/1995:13:30:09 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.209.221.200 - - [28/Jul/1995:13:30:10 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+192.138.199.30 - - [28/Jul/1995:13:30:10 -0400] "GET /elv/elvpage.htm HTTP/1.0" 200 7838
+128.159.77.122 - - [28/Jul/1995:13:30:12 -0400] "GET /facilities/opf.html HTTP/1.0" 200 2355
+192.138.199.30 - - [28/Jul/1995:13:30:12 -0400] "GET /elv/bakgro.gif HTTP/1.0" 200 526
+128.159.77.122 - - [28/Jul/1995:13:30:12 -0400] "GET /images/opf-logo.gif HTTP/1.0" 200 32511
+192.138.199.30 - - [28/Jul/1995:13:30:12 -0400] "GET /elv/elvhead3.gif HTTP/1.0" 200 9925
+192.138.199.30 - - [28/Jul/1995:13:30:13 -0400] "GET /elv/endball.gif HTTP/1.0" 200 306
+222.218.120.1 - - [28/Jul/1995:13:30:13 -0400] "GET /news/sci.space.news/archive/sci-space-news-1-feb-1995-80.txt HTTP/1.0" 200 241853
+180.176.12.00 - - [28/Jul/1995:13:30:14 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0613.jpg HTTP/1.0" 200 61716
+180.176.12.00 - - [28/Jul/1995:13:30:15 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+198.209.221.200 - - [28/Jul/1995:13:30:15 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+192.138.199.30 - - [28/Jul/1995:13:30:15 -0400] "GET /elv/hot.gif HTTP/1.0" 200 1007
+192.138.199.30 - - [28/Jul/1995:13:30:16 -0400] "GET /elv/PEGASUS/minpeg1.gif HTTP/1.0" 200 1055
+182.200.120.1 - - [28/Jul/1995:13:30:17 -0400] "GET /images/ HTTP/1.0" 200 17688
+192.138.199.30 - - [28/Jul/1995:13:30:17 -0400] "GET /elv/SCOUT/scout.gif HTTP/1.0" 200 1165
+180.176.12.00 - - [28/Jul/1995:13:30:19 -0400] "GET /elv/elvpage.htm HTTP/1.0" 200 7838
+180.176.12.00 - - [28/Jul/1995:13:30:20 -0400] "GET /elv/elvhead3.gif HTTP/1.0" 200 9925
+180.176.12.00 - - [28/Jul/1995:13:30:20 -0400] "GET /elv/endball.gif HTTP/1.0" 200 306
+180.176.12.00 - - [28/Jul/1995:13:30:21 -0400] "GET /elv/hot.gif HTTP/1.0" 200 1007
+180.176.12.00 - - [28/Jul/1995:13:30:21 -0400] "GET /elv/SCOUT/scout.gif HTTP/1.0" 200 1165
+180.176.12.00 - - [28/Jul/1995:13:30:21 -0400] "GET /elv/PEGASUS/minpeg1.gif HTTP/1.0" 200 1055
+180.176.12.00 - - [28/Jul/1995:13:30:22 -0400] "GET /elv/ATLAS_CENTAUR/atlas.gif HTTP/1.0" 200 2286
+180.176.12.00 - - [28/Jul/1995:13:30:22 -0400] "GET /elv/DELTA/delta.gif HTTP/1.0" 200 2244
+210.166.12.00 - - [28/Jul/1995:13:30:22 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+131.110.55.100 - - [28/Jul/1995:13:30:23 -0400] "GET /history/history.html HTTP/1.0" 200 1602
+180.176.12.00 - - [28/Jul/1995:13:30:23 -0400] "GET /elv/TITAN/titan.gif HTTP/1.0" 200 3530
+131.110.55.100 - - [28/Jul/1995:13:30:24 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630
+180.176.12.00 - - [28/Jul/1995:13:30:25 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.176.12.00 - - [28/Jul/1995:13:30:25 -0400] "GET /elv/struct.gif HTTP/1.0" 200 1318
+192.138.199.30 - - [28/Jul/1995:13:30:25 -0400] "GET /elv/DELTA/delta.gif HTTP/1.0" 200 2244
+192.138.199.30 - - [28/Jul/1995:13:30:25 -0400] "GET /elv/ATLAS_CENTAUR/atlas.gif HTTP/1.0" 200 2286
+192.138.199.30 - - [28/Jul/1995:13:30:25 -0400] "GET /elv/TITAN/titan.gif HTTP/1.0" 200 3530
+198.155.12.92 - - [28/Jul/1995:13:30:26 -0400] "GET /shuttle/technology/images/launch_sites_8-small.gif HTTP/1.0" 200 65536
+131.110.55.100 - - [28/Jul/1995:13:30:26 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+192.138.199.30 - - [28/Jul/1995:13:30:26 -0400] "GET /elv/struct.gif HTTP/1.0" 200 1318
+131.110.55.100 - - [28/Jul/1995:13:30:27 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.176.12.00 - - [28/Jul/1995:13:30:27 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+222.218.120.1 - - [28/Jul/1995:13:30:33 -0400] "GET /history/apollo/apollo-spacecraft.txt HTTP/1.0" 200 2261
+131.110.55.100 - - [28/Jul/1995:13:30:33 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260
+192.138.199.30 - - [28/Jul/1995:13:30:33 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+128.159.77.122 - - [28/Jul/1995:13:30:33 -0400] "GET /facilities/vab.html HTTP/1.0" 200 4045
+128.159.77.122 - - [28/Jul/1995:13:30:34 -0400] "GET /images/vab-small.gif HTTP/1.0" 200 35709
+192.138.199.30 - - [28/Jul/1995:13:30:34 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+198.155.12.13 - - [28/Jul/1995:13:30:36 -0400] "GET /shuttle/missions/sts-73/mission-sts-73.html HTTP/1.0" 200 4101
+193.81.242.40 - - [28/Jul/1995:13:30:37 -0400] "GET /shuttle/technology/images/sts_body_2-small.gif HTTP/1.0" 200 30067
+180.166.12.00 - - [28/Jul/1995:13:30:38 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324
+131.110.55.100 - - [28/Jul/1995:13:30:38 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149
+198.155.12.13 - - [28/Jul/1995:13:30:38 -0400] "GET /shuttle/missions/sts-73/sts-73-patch-small.gif HTTP/1.0" 200 4179
+180.176.12.00 - - [28/Jul/1995:13:30:39 -0400] "GET /elv/uplink.htm HTTP/1.0" 200 1498
+198.155.12.13 - - [28/Jul/1995:13:30:41 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+194.166.2.31 - - [28/Jul/1995:13:30:42 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 8529
+198.155.12.13 - - [28/Jul/1995:13:30:42 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260
+180.176.12.00 - - [28/Jul/1995:13:30:42 -0400] "GET /elv/elvhead2.gif HTTP/1.0" 200 1733
+210.166.12.00 - - [28/Jul/1995:13:30:43 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+198.155.12.92 - - [28/Jul/1995:13:30:43 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+131.110.55.100 - - [28/Jul/1995:13:30:43 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+198.155.12.13 - - [28/Jul/1995:13:30:43 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149
+198.155.12.92 - - [28/Jul/1995:13:30:43 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853
+198.155.12.13 - - [28/Jul/1995:13:30:46 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+180.176.12.00 - - [28/Jul/1995:13:30:46 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+180.166.12.00 - - [28/Jul/1995:13:30:47 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+128.159.77.122 - - [28/Jul/1995:13:30:50 -0400] "GET /facilities/lcc.html HTTP/1.0" 200 2489
+128.159.77.122 - - [28/Jul/1995:13:30:50 -0400] "GET /images/lcc-small2.gif HTTP/1.0" 200 58026
+131.110.55.100 - - [28/Jul/1995:13:30:50 -0400] "GET /history/apollo/flight-summary.txt HTTP/1.0" 200 5086
+198.155.12.13 - - [28/Jul/1995:13:30:55 -0400] "GET /shuttle/resources/orbiters/columbia.html HTTP/1.0" 200 6922
+180.176.12.00 - - [28/Jul/1995:13:30:56 -0400] "GET /history/apollo/flight-summary.txt HTTP/1.0" 200 5086
+128.217.63.13 - - [28/Jul/1995:13:30:58 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0" 200 20226
+198.155.12.13 - - [28/Jul/1995:13:30:59 -0400] "GET /shuttle/resources/orbiters/columbia-logo.gif HTTP/1.0" 200 11417
+163.205.53.14 - - [28/Jul/1995:13:31:01 -0400] "GET /shuttle/technology/images/srb_mod_compare_6-small.gif HTTP/1.0" 200 28219
+163.205.53.14 - - [28/Jul/1995:13:31:01 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+163.205.53.14 - - [28/Jul/1995:13:31:01 -0400] "GET /shuttle/technology/images/srb_mod_compare_1-small.gif HTTP/1.0" 200 36902
+163.205.53.14 - - [28/Jul/1995:13:31:01 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666
+128.217.63.13 - - [28/Jul/1995:13:31:02 -0400] "GET /shuttle/missions/sts-70/sts-70-patch-small.gif HTTP/1.0" 200 5978
+210.166.12.00 - - [28/Jul/1995:13:31:03 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+128.217.63.13 - - [28/Jul/1995:13:31:04 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+128.217.63.13 - - [28/Jul/1995:13:31:05 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+163.205.53.14 - - [28/Jul/1995:13:31:05 -0400] "GET /images/shuttle-patch-logo.gif HTTP/1.0" 200 891
+198.155.12.92 - - [28/Jul/1995:13:31:05 -0400] "GET /shuttle/missions/sts-73/mission-sts-73.html HTTP/1.0" 200 4101
+180.176.12.00 - - [28/Jul/1995:13:31:06 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3674
+198.155.12.13 - - [28/Jul/1995:13:31:06 -0400] "GET /history/apollo/apollo-7/apollo-7.html HTTP/1.0" 200 14440
+180.176.12.00 - - [28/Jul/1995:13:31:06 -0400] "GET /shuttle/countdown/images/countclock.gif HTTP/1.0" 200 13994
+128.217.63.13 - - [28/Jul/1995:13:31:07 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+180.176.12.00 - - [28/Jul/1995:13:31:07 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+180.176.12.00 - - [28/Jul/1995:13:31:07 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+180.176.12.00 - - [28/Jul/1995:13:31:07 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+180.176.12.00 - - [28/Jul/1995:13:31:07 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+198.155.12.13 - - [28/Jul/1995:13:31:08 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+198.155.12.13 - - [28/Jul/1995:13:31:09 -0400] "GET /history/apollo/apollo-7/apollo-7-patch-small.gif HTTP/1.0" 200 13218
+128.159.77.122 - - [28/Jul/1995:13:31:09 -0400] "GET /facilities/crawlerway.html HTTP/1.0" 200 1921
+128.159.77.122 - - [28/Jul/1995:13:31:10 -0400] "GET /images/crawlerway-logo.gif HTTP/1.0" 404 -
+180.176.12.00 - - [28/Jul/1995:13:31:10 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:31:11 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932
+198.155.12.92 - - [28/Jul/1995:13:31:12 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+198.155.12.92 - - [28/Jul/1995:13:31:12 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173
+193.81.242.40 - - [28/Jul/1995:13:31:13 -0400] "GET /shuttle/technology/sts-newsref/sts_coord.html HTTP/1.0" 200 136804
+198.155.12.92 - - [28/Jul/1995:13:31:17 -0400] "GET /shuttle/missions/sts-73/sts-73-patch-small.gif HTTP/1.0" 200 4179
+193.81.242.40 - - [28/Jul/1995:13:31:18 -0400] "GET /shuttle/technology/images/crew_compartment_13-small.gif HTTP/1.0" 200 79088
+182.200.120.1 - - [28/Jul/1995:13:31:19 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556
+182.200.120.1 - - [28/Jul/1995:13:31:20 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859
+182.200.120.1 - - [28/Jul/1995:13:31:21 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+182.200.120.1 - - [28/Jul/1995:13:31:21 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209
+128.159.77.122 - - [28/Jul/1995:13:31:22 -0400] "GET /facilities/mlp.html HTTP/1.0" 200 2653
+128.159.77.122 - - [28/Jul/1995:13:31:23 -0400] "GET /images/mlp-logo.gif HTTP/1.0" 200 28426
+194.166.2.31 - - [28/Jul/1995:13:31:23 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0876.gif HTTP/1.0" 200 51398
+128.158.57.20 - - [28/Jul/1995:13:31:24 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3674
+210.166.12.00 - - [28/Jul/1995:13:31:24 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+128.159.144.47 - - [28/Jul/1995:13:31:25 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.144.47 - - [28/Jul/1995:13:31:26 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+128.159.144.47 - - [28/Jul/1995:13:31:27 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+180.176.12.00 - - [28/Jul/1995:13:31:27 -0400] "GET /shuttle/countdown/countdown.html HTTP/1.0" 200 4324
+128.159.144.47 - - [28/Jul/1995:13:31:27 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.159.144.47 - - [28/Jul/1995:13:31:28 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.159.144.47 - - [28/Jul/1995:13:31:28 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+180.176.12.00 - - [28/Jul/1995:13:31:29 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+182.200.120.1 - - [28/Jul/1995:13:31:29 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556
+222.218.120.1 - - [28/Jul/1995:13:31:31 -0400] "GET /shuttle/technology/sts-newsref/stsover-prep.html HTTP/1.0" 200 142213
+170.166.12.00 - - [28/Jul/1995:13:31:33 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9866
+180.176.12.00 - - [28/Jul/1995:13:31:33 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573
+180.176.12.00 - - [28/Jul/1995:13:31:34 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+128.159.77.122 - - [28/Jul/1995:13:31:36 -0400] "GET /facilities/osb.html HTTP/1.0" 200 636
+128.159.77.122 - - [28/Jul/1995:13:31:36 -0400] "GET /images/construct.gif HTTP/1.0" 200 1414
+170.166.12.00 - - [28/Jul/1995:13:31:37 -0400] "GET /software/winvn/winvn.gif HTTP/1.0" 200 25218
+170.166.12.00 - - [28/Jul/1995:13:31:37 -0400] "GET /images/construct.gif HTTP/1.0" 200 1414
+198.155.12.13 - - [28/Jul/1995:13:31:41 -0400] "GET /history/apollo/apollo-8/apollo-8.html HTTP/1.0" 200 3625
+198.155.12.13 - - [28/Jul/1995:13:31:43 -0400] "GET /history/apollo/apollo-8/apollo-8-patch-small.gif HTTP/1.0" 200 11326
+193.81.242.40 - - [28/Jul/1995:13:31:43 -0400] "GET /shuttle/technology/images/aft_fuselage_2-small.gif HTTP/1.0" 200 45632
+198.155.12.92 - - [28/Jul/1995:13:31:44 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 10136
+210.166.12.00 - - [28/Jul/1995:13:31:46 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+222.218.120.1 - - [28/Jul/1995:13:31:46 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9866
+222.218.120.1 - - [28/Jul/1995:13:31:46 -0400] "GET /software/winvn/winvn.gif HTTP/1.0" 200 25218
+222.218.120.1 - - [28/Jul/1995:13:31:46 -0400] "GET /images/construct.gif HTTP/1.0" 200 1414
+170.166.12.00 - - [28/Jul/1995:13:31:47 -0400] "GET /software/winvn/bluemarb.gif HTTP/1.0" 200 4441
+180.176.12.00 - - [28/Jul/1995:13:31:47 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260
+222.218.120.1 - - [28/Jul/1995:13:31:47 -0400] "GET /software/winvn/bluemarb.gif HTTP/1.0" 200 4441
+222.218.120.1 - - [28/Jul/1995:13:31:49 -0400] "GET /software/winvn/wvsmall.gif HTTP/1.0" 200 13372
+163.205.46.54 - - [28/Jul/1995:13:31:49 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+222.218.120.1 - - [28/Jul/1995:13:31:49 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+222.218.120.1 - - [28/Jul/1995:13:31:49 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+163.205.46.54 - - [28/Jul/1995:13:31:49 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+222.218.120.1 - - [28/Jul/1995:13:31:49 -0400] "GET /history/history.html HTTP/1.0" 200 1602
+163.205.46.54 - - [28/Jul/1995:13:31:50 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+222.218.120.1 - - [28/Jul/1995:13:31:50 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+222.218.120.1 - - [28/Jul/1995:13:31:50 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+163.205.46.54 - - [28/Jul/1995:13:31:50 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+180.176.12.00 - - [28/Jul/1995:13:31:50 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149
+163.205.46.54 - - [28/Jul/1995:13:31:51 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+222.218.120.1 - - [28/Jul/1995:13:31:51 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630
+163.205.46.54 - - [28/Jul/1995:13:31:51 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+222.218.120.1 - - [28/Jul/1995:13:31:52 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+222.218.120.1 - - [28/Jul/1995:13:31:52 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+180.176.12.00 - - [28/Jul/1995:13:31:53 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 304 0
+180.176.12.00 - - [28/Jul/1995:13:31:53 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0
+218.166.12.92 - - [28/Jul/1995:13:31:54 -0400] "GET /images/shuttle-patch-small.gif HTTP/1.0" 200 4179
+163.205.56.149 - - [28/Jul/1995:13:31:55 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+182.200.120.1 - - [28/Jul/1995:13:31:55 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859
+218.166.12.92 - - [28/Jul/1995:13:31:57 -0400] "GET /shuttle/technology/sts-newsref/stsref-toc.html HTTP/1.0" 200 84905
+128.159.122.45 - - [28/Jul/1995:13:31:57 -0400] "GET /ksc.html HTTP/1.0" 200 7280
+128.159.122.45 - - [28/Jul/1995:13:31:58 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+170.166.12.00 - - [28/Jul/1995:13:31:59 -0400] "GET /software/winvn/wvsmall.gif HTTP/1.0" 200 13372
+128.159.122.45 - - [28/Jul/1995:13:31:59 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+128.159.122.45 - - [28/Jul/1995:13:32:00 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+128.159.122.45 - - [28/Jul/1995:13:32:00 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+128.159.122.45 - - [28/Jul/1995:13:32:00 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+182.200.120.1 - - [28/Jul/1995:13:32:01 -0400] "GET /images/p263_100.jpg HTTP/1.0" 200 49152
+170.166.12.00 - - [28/Jul/1995:13:32:03 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.176.12.00 - - [28/Jul/1995:13:32:04 -0400] "GET /history/apollo/apollo-spacecraft.txt HTTP/1.0" 200 2261
+218.166.12.92 - - [28/Jul/1995:13:32:04 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+218.166.12.92 - - [28/Jul/1995:13:32:04 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+180.166.12.00 - - [28/Jul/1995:13:32:06 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+210.166.12.00 - - [28/Jul/1995:13:32:06 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+128.159.77.122 - - [28/Jul/1995:13:32:11 -0400] "GET /facilities/lf.html HTTP/1.0" 200 1214
+128.159.77.122 - - [28/Jul/1995:13:32:11 -0400] "GET /images/lf-logo.gif HTTP/1.0" 404 -
+192.138.199.30 - - [28/Jul/1995:13:32:11 -0400] "GET /elv/uplink2.htm HTTP/1.0" 200 2031
+139.169.210.47 - - [28/Jul/1995:13:32:11 -0400] "GET /shuttle/technology/images/srb_mod_compare_1-small.gif HTTP/1.0" 200 36902
+163.205.53.14 - - [28/Jul/1995:13:32:12 -0400] "GET /images/shuttle-patch-small.gif HTTP/1.0" 200 4179
+182.198.120.1 - - [28/Jul/1995:13:32:12 -0400] "GET /images/launch.gif HTTP/1.0" 200 240458
+180.176.12.00 - - [28/Jul/1995:13:32:13 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149
+180.166.12.00 - - [28/Jul/1995:13:32:14 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 5220
+170.166.12.00 - - [28/Jul/1995:13:32:16 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+163.205.53.14 - - [28/Jul/1995:13:32:16 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+163.205.53.14 - - [28/Jul/1995:13:32:16 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713
+218.166.12.92 - - [28/Jul/1995:13:32:17 -0400] "GET /shuttle/technology/sts-newsref/sts_egress.html HTTP/1.0" 200 86379
+139.169.210.47 - - [28/Jul/1995:13:32:18 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666
+198.155.12.92 - - [28/Jul/1995:13:32:18 -0400] "GET /shuttle/missions/sts-74/mission-sts-74.html HTTP/1.0" 200 3790
+199.0.2.27 - - [28/Jul/1995:13:32:19 -0400] "GET / HTTP/1.0" 200 7280
+198.155.12.13 - - [28/Jul/1995:13:32:19 -0400] "GET /facts/faq.html HTTP/1.0" 200 18290
+182.200.120.1 - - [28/Jul/1995:13:32:20 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+199.0.2.27 - - [28/Jul/1995:13:32:20 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786
+199.0.2.27 - - [28/Jul/1995:13:32:20 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363
+199.0.2.27 - - [28/Jul/1995:13:32:20 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+199.0.2.27 - - [28/Jul/1995:13:32:21 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669
+198.155.12.13 - - [28/Jul/1995:13:32:21 -0400] "GET /images/faq.gif HTTP/1.0" 200 263
+198.155.12.13 - - [28/Jul/1995:13:32:21 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
+170.166.12.00 - - [28/Jul/1995:13:32:22 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234
+163.205.53.14 - - [28/Jul/1995:13:32:22 -0400] "GET /shuttle/technology/images/srb_mod_compare_1-small.gif HTTP/1.0" 200 36902
+218.166.12.92 - - [28/Jul/1995:13:32:22 -0400] "GET /images/shuttle-patch-logo.gif HTTP/1.0" 200 891
+163.205.53.14 - - [28/Jul/1995:13:32:22 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666
+163.205.53.14 - - [28/Jul/1995:13:32:22 -0400] "GET /shuttle/technology/images/srb_mod_compare_6-small.gif HTTP/1.0" 200 28219
+163.205.53.14 - - [28/Jul/1995:13:32:23 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204
+198.155.12.13 - - [28/Jul/1995:13:32:23 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677
+199.0.2.27 - - [28/Jul/1995:13:32:23 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866
+198.155.12.92 - - [28/Jul/1995:13:32:25 -0400] "GET /shuttle/missions/sts-74/sts-74-patch-small.gif HTTP/1.0" 200 5494
+198.155.12.92 - - [28/Jul/1995:13:33:00 -0400] "GET /shuttle/missions/sts-74/sts-74-patch-small.gif HTTP/1.0" 200 5494
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..ac9f1db
--- /dev/null
+++ b/main.go
@@ -0,0 +1,52 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "os/signal"
+
+ "github.com/satyrius/gonx"
+)
+
+const (
+ // https://en.wikipedia.org/wiki/Common_Log_Format
+ // 127.0.0.1 user-identifier frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
+ parserFormat = "$remote_addr $user_identifier $remote_user [$time_local] \"$request\" $status $bytes_sent"
+)
+
+var (
+ cfg *Config
+)
+
+func main() {
+ cfg = NewConfig()
+
+ s := NewSession(cfg.AlertThreshold, cfg.PollInt, gonx.NewParser(parserFormat))
+ err := s.SetLog(cfg.File)
+ if err != nil {
+ panic(err)
+ }
+ defer s.Close()
+
+ doneChan := make(chan struct{})
+ msgChan := make(chan msg)
+
+ go Monitor(cfg, s, doneChan, msgChan)
+
+ go Ctrl(doneChan)
+
+ go Printer(cfg, doneChan, msgChan)
+
+ <-doneChan
+
+ fmt.Print("\nMonitor stopped.\n")
+}
+
+// Ctrl handles monitor shutdown actions.
+func Ctrl(doneChan chan<- struct{}) {
+ sigChan := make(chan os.Signal, 1)
+ signal.Notify(sigChan, os.Interrupt, os.Kill)
+ for range sigChan {
+ doneChan <- struct{}{}
+ }
+}
diff --git a/monitor.go b/monitor.go
new file mode 100644
index 0000000..7e5f6f0
--- /dev/null
+++ b/monitor.go
@@ -0,0 +1,98 @@
+package main
+
+import (
+ "bufio"
+ "time"
+)
+
+// Monitor is a monitoring routine that tracks changes to a log file,
+// calculates metrics based on accumulated data
+// and issues messages based on changes to a log file and/or metrics.
+func Monitor(cfg *Config, s *Session, doneChan chan struct{}, msgChan chan<- msg) {
+
+ f := NewFrame(cfg.MTF, cfg.PollInt)
+ r := bufio.NewReader(s.File)
+
+ stat, err := s.File.Stat()
+ if err != nil {
+ panic(err)
+ }
+
+ prevSize := stat.Size() // starting file read position
+
+ // Move reader's needle to the position where we stopped reading last time or to the initial position.
+ if _, err := s.File.Seek(prevSize, 0); err != nil {
+ panic(err)
+ }
+
+ // Start tickers
+ tickerPolling := time.NewTicker(time.Second * time.Duration(cfg.PollInt))
+ tickerReporting := time.NewTicker(time.Second * time.Duration(cfg.ReportInt))
+
+ polls := 0
+
+monitorLoop:
+ for {
+ select {
+
+ // Main completion handler.
+ case <-doneChan:
+ tickerPolling.Stop()
+ tickerReporting.Stop()
+ break monitorLoop
+
+ // Poll ticker.
+ case t := <-tickerPolling.C:
+ {
+ polls++
+
+ // Capture point data.
+ p := NewPoint(s.File, r, prevSize)
+ err := p.GetChange()
+ if err != nil {
+ msgChan <- msgErr(err)
+ }
+
+ // Register current level of traffic, i.e.
+ // quantity of log entries since last poll.
+ f.Rec(p.linesQty)
+
+ // Pass entries to the session storage.
+ err = s.ConsumeLines(p.lines)
+ if err != nil {
+ msgChan <- msgErr(err)
+ }
+
+ // Print out current point data.
+ if cfg.SendTicks {
+ msgChan <- msgPoint(f.AvgTraffic, s.AlertThreshold)
+ }
+
+ // Monitor alert threshold.
+ if cfg.SendAlerts {
+ if s.ShouldEscalate(f.AvgTraffic) {
+ msgChan <- msgAlertEsc(f.AvgTraffic, t)
+ }
+
+ if s.ShouldDeescalate(f.AvgTraffic) {
+ msgChan <- msgAlertDeesc(f.AvgTraffic, t)
+ }
+ }
+
+ if polls == cfg.MaxPolls {
+ doneChan <- struct{}{}
+ }
+ }
+
+ // Reporting ticker.
+ case t := <-tickerReporting.C:
+ {
+ if cfg.SendReports {
+ // Get data accumulated during report interval and clean report buffer.
+ msgChan <- msgReport(s.FlushReport(cfg, &t))
+ }
+ }
+ }
+
+ }
+}
diff --git a/monitor_test.go b/monitor_test.go
new file mode 100644
index 0000000..d4ec8bd
--- /dev/null
+++ b/monitor_test.go
@@ -0,0 +1,209 @@
+package main
+
+import (
+ "os"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/satyrius/gonx"
+)
+
+// Test logic for alert escalation case:
+//
+// 1. Initial state is OK (default).
+// 2. Run for the MTF duration. In this test: 2 seconds.
+// 3. Imitate incoming traffic adding several lines to the temporary log file once per second.
+// 4. To trigger an alert, we set alert threshold level to 2 hits/s and add 2 entries per second.
+//
+// 5. Expected result:
+// - by the end of MTF avg. traffic will be 2 hits/sec,
+// - monitor will register that traffic reached a threshold level,
+// - monitor will set an alert state,
+// - alert escalation message will be sent to msgChan.
+func TestMonitor_AlertEscalation(t *testing.T) {
+ var err error
+ tempLogFile := getTempLoc(".TestMonitor_AlertEscalation.log")
+ alertThreshold := 2
+ pollInt := 1
+
+ cfg := &Config{
+ AlertThreshold: alertThreshold,
+ File: tempLogFile,
+ MTF: 2,
+ MaxPolls: 2, // As poll interval 1 sec, thus we limit test to 3 sec length.
+ TopN: 3,
+ PollInt: pollInt, // Poll once per second.
+ ReportInt: 2, // Irrelevant, as reports are off for this test.
+ SendAlerts: true,
+ SendReports: false,
+ SendTicks: false,
+ }
+
+ s := NewSession(alertThreshold, pollInt, gonx.NewParser(parserFormat))
+
+ // Ensure test log file is in place.
+ f, err := os.Create(tempLogFile)
+ if err != nil {
+ t.Fatalf("\n\nCannot open test file: %s\n", err.Error())
+ }
+ defer f.Close()
+
+ err = s.SetLog(cfg.File)
+ if err != nil {
+ // Suppress error as a test log file can be absent
+ }
+ // Also, not deferring a Close method, as the file will be created later.
+
+ doneChan := make(chan struct{})
+ msgChan := make(chan msg)
+
+ go Monitor(cfg, s, doneChan, msgChan)
+
+ // Handler for monitor closing.
+ go Ctrl(doneChan)
+
+ expected := 1
+ actual := 0
+
+ logUpdateTicker := time.NewTicker(time.Second * 1)
+
+ // str mimics one-time entry of 2 log lines
+ // In this case, with 1 poll per second, this equals to a traffic of 2 hits/s, while threshold is 2 hits/s.
+ // To trigger an alert, number of lines should be equal or higher than the "AlertThreshold" value.
+ str := `
+ 210.166.12.00 - - [28/Jul/1995:13:17:36 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 503
+ 198.155.12.16 - - [28/Jul/1995:13:17:09 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 400 786
+ `
+
+ // Intercept message channel.
+ // Instead of a printer we receive messages here to assert results based on message type.
+selectLoop:
+ for {
+ select {
+ case <-logUpdateTicker.C:
+ {
+ if _, err = f.WriteString(str); err != nil {
+ t.Fatalf("\n\nCannot writing to test log: %s\n\n", err.Error())
+ }
+ }
+
+ case msg := <-msgChan:
+ if msg.msgType == msgTypeAlertEsc {
+ actual++
+ }
+
+ case <-doneChan:
+ break selectLoop
+ }
+ }
+
+ if actual != 1 {
+ t.Errorf("Expected %d message, got %d", expected, actual)
+ }
+
+ if !s.IsAlert() {
+ t.Errorf("Expected %d state, got %d", stateAlert, s.State)
+ }
+
+ // Cleanup
+ err = os.Remove(tempLogFile)
+ if err != nil {
+ t.Errorf("Could not delete temp file: %s", err.Error())
+ }
+}
+
+// Test logic for alert deescalation:
+//
+// 1. Set initial state to Alert.
+// 2. Run for the MTF duration. In this test: 2 seconds.
+// 3. Do no additions to the log file imitating no traffic to the system.
+//
+// 4. Expected result:
+// - by the end of MTF avg. traffic will be 0 hits/sec,
+// - monitor will register that traffic dropped below a threshold level,
+// - monitor will set an OK state,
+// - alert deescalation message will be sent to msgChan.
+func TestMonitor_AlertDeescalation(t *testing.T) {
+ var err error
+ tempLogFile := getTempLoc(".TestMonitor_AlertDeescalation.log")
+ alertThreshold := 2
+ pollInt := 1
+
+ cfg := &Config{
+ AlertThreshold: alertThreshold,
+ File: tempLogFile,
+ MTF: 2,
+ MaxPolls: 2, // As poll interval 1 sec, thus we limit test to 3 sec length.
+ TopN: 3,
+ PollInt: pollInt, // Poll once per second.
+ ReportInt: 2, // Irrelevant, as reports are off for this test.
+ SendAlerts: true,
+ SendReports: false,
+ SendTicks: false,
+ }
+
+ s := NewSession(alertThreshold, pollInt, gonx.NewParser(parserFormat))
+ s.SetAlert()
+
+ // Ensure test log file is in place.
+ f, err := os.Create(tempLogFile)
+ if err != nil {
+ t.Fatalf("\n\nCannot open test file: %s\n", err.Error())
+ }
+ defer f.Close()
+
+ err = s.SetLog(cfg.File)
+ if err != nil {
+ // Suppress error as a test log file can be absent
+ }
+ // Also, not deferring a Close method, as the file will be created later.
+
+ doneChan := make(chan struct{})
+ msgChan := make(chan msg)
+
+ go Monitor(cfg, s, doneChan, msgChan)
+
+ // Handler for monitor closing.
+ go Ctrl(doneChan)
+
+ expected := 1
+ actual := 0
+
+ // Intercept message channel.
+selectLoop:
+ for {
+ select {
+
+ case msg := <-msgChan:
+ if msg.msgType == msgTypeAlertDeesc {
+ actual++
+ }
+
+ case <-doneChan:
+ break selectLoop
+ }
+ }
+
+ if actual != 1 {
+ t.Errorf("Expected %d message, got %d", expected, actual)
+ }
+
+ if s.IsAlert() {
+ t.Errorf("Expected %d state, got %d", stateOK, s.State)
+ }
+
+ // Cleanup
+ err = os.Remove(tempLogFile)
+ if err != nil {
+ t.Errorf("Could not delete temp file: %s", err.Error())
+ }
+}
+
+// getTempLoc prepares full temporary file location.
+// One of the purposes - workaround between differences of MacOS temp folder ending with a slash,
+// and Debian TMPDIR env var being empty and thus os.TempDir() was creating a temp dir
+// without an ending slash.
+func getTempLoc(filename string) string {
+ return strings.TrimRight(os.TempDir(), "/") + "/" + filename
+}
diff --git a/msg.go b/msg.go
new file mode 100644
index 0000000..bfd1b41
--- /dev/null
+++ b/msg.go
@@ -0,0 +1,62 @@
+package main
+
+import "time"
+
+type msg struct {
+ msgType string
+ body string
+ report *Report
+ time time.Time
+ traffic int
+ threshold int
+}
+
+const (
+ // Message types.
+
+ msgTypeAlertEsc = "alertEsc"
+ msgTypeAlertDeesc = "alertDeesc"
+ msgTypeError = "err"
+ msgTypePoint = "point"
+ msgTypeReport = "report"
+)
+
+// Message objects.
+
+func msgAlertEsc(tr int, t time.Time) msg {
+ return msg{
+ msgType: msgTypeAlertEsc,
+ traffic: tr,
+ time: t,
+ }
+}
+
+func msgAlertDeesc(tr int, t time.Time) msg {
+ return msg{
+ msgType: msgTypeAlertDeesc,
+ traffic: tr,
+ time: t,
+ }
+}
+
+func msgErr(err error) msg {
+ return msg{
+ msgType: msgTypeError,
+ body: err.Error(),
+ }
+}
+
+func msgPoint(tr, th int) msg {
+ return msg{
+ msgType: msgTypePoint,
+ threshold: th,
+ traffic: tr,
+ }
+}
+
+func msgReport(r *Report) msg {
+ return msg{
+ msgType: msgTypeReport,
+ report: r,
+ }
+}
diff --git a/point.go b/point.go
new file mode 100644
index 0000000..11279d0
--- /dev/null
+++ b/point.go
@@ -0,0 +1,86 @@
+package main
+
+import (
+ "bufio"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+)
+
+// Point represents data accumulated during last log check.
+type Point struct {
+ prevSize int64
+ size int64
+ diff int64
+ lines []string
+ linesQty int
+ reader *bufio.Reader
+ file *os.File
+}
+
+// NewPoint returns a new Point object.
+func NewPoint(f *os.File, r *bufio.Reader, prevSize int64) *Point {
+ return &Point{
+ file: f,
+ prevSize: prevSize,
+ reader: r,
+ }
+}
+
+// GetChange checks log file for size changes and reads added data into log entry strings.
+func (p *Point) GetChange() error {
+
+ stat, err := p.file.Stat()
+ if err != nil {
+ return err
+ }
+
+ p.size = stat.Size()
+ p.diff = p.size - p.prevSize
+
+ // If truncated, adjust for a new size and continue from beginning.
+ if p.diff > 0 {
+ p.lines, err = readIncrement(p.reader)
+ if err != nil {
+ return fmt.Errorf(" Error reading log chunk: %s ", err.Error())
+ }
+
+ p.linesQty = len(p.lines)
+ }
+
+ p.prevSize = p.size
+
+ return nil
+}
+
+// readIncrement reads a log file from a start position to EOF
+// returning result as a slice of (string) log entries.
+func readIncrement(r *bufio.Reader) ([]string, error) {
+
+ var data []byte
+ var err error
+ var out []string
+
+ for {
+ data, err = r.ReadBytes('\n')
+
+ if err == nil || err == io.EOF {
+ line := strings.TrimSpace(string(data))
+ if line != "" {
+ out = append(out, line)
+ }
+ }
+
+ if err != nil {
+ if err != io.EOF {
+ return out, err
+ }
+
+ // EOF
+ break
+ }
+ }
+
+ return out, nil
+}
diff --git a/printer.go b/printer.go
new file mode 100644
index 0000000..75afea0
--- /dev/null
+++ b/printer.go
@@ -0,0 +1,205 @@
+package main
+
+import (
+ "fmt"
+ "math"
+ "strconv"
+ "strings"
+ "time"
+
+ ct "github.com/daviddengcn/go-colortext"
+)
+
+var (
+ reportTimeFormat = time.RFC3339
+)
+
+// Printer is a handler for stdout outputs.
+func Printer(cfg *Config, doneChan <-chan struct{}, msgChan <-chan msg) {
+
+printerLoop:
+ for {
+ select {
+ case <-doneChan:
+ break printerLoop
+
+ case m := <-msgChan:
+ switch m.msgType {
+ case msgTypeError:
+ printErr(m.body)
+ case msgTypeAlertEsc:
+ printAlertEsc(m.traffic, m.time)
+ case msgTypeAlertDeesc:
+ printAlertDeesc(m.traffic, m.time)
+ case msgTypePoint:
+ printPoint(m.traffic, m.threshold)
+ case msgTypeReport:
+ printReport(cfg, m.report)
+ }
+ }
+ }
+
+}
+
+// printAlertEsc prints alert escalation message.
+func printAlertEsc(tr int, t time.Time) {
+ printBigMsg("\u00B7 High traffic generated an alert - hits = %d, triggered at %s", tr, t, ct.Red)
+
+}
+
+// printAlertDeesc prints alert de-escalation message.
+func printAlertDeesc(tr int, t time.Time) {
+ printBigMsg("\u00B7 High traffic alert recovered. Current hits = %d. At %s", tr, t, ct.Green)
+}
+
+// printReport prints out a report block.
+func printReport(cfg *Config, r *Report) {
+ if len(r.TopSectionHits) == 0 && len(r.StatusCodes) == 0 && r.TotalHits == 0 {
+ fmt.Print("REPORT: no changes\n\n")
+ } else {
+ fmt.Print("\n\n")
+ printHR()
+
+ fmt.Printf("REPORT: %s\n\n", r.Time.Format(reportTimeFormat))
+
+ printSections(cfg.TopN, r.TopSectionHits)
+
+ printSummary(cfg, r)
+
+ fmt.Print("\n\n")
+ }
+}
+
+// printPoint prints out a point data.
+func printPoint(traffic, threshold int) {
+ fmt.Print(" \u00B7 hits avg: ")
+ if traffic >= threshold {
+ printRed("%6d", traffic)
+ } else {
+ fmt.Printf("%6d", traffic)
+ }
+ fmt.Printf(" / %2d\n", threshold)
+}
+
+func printErr(s string, a ...interface{}) {
+ fmt.Print("\n")
+ labelYellow(s, a...)
+ fmt.Print("\n")
+}
+
+// printHR prints a horizontal ruler to stdout.
+func printHR() {
+ ct.ChangeColor(ct.White, false, ct.Black, false)
+ fmt.Print(strings.Repeat("-", 80))
+ ct.ResetColor()
+ fmt.Print("\n")
+}
+
+// Labels (fg & bg).
+
+// labelRed - white fg, red bg.
+func labelRed(s string, a ...interface{}) {
+ ct.ChangeColor(ct.White, true, ct.Red, true)
+ fmt.Printf(s, a...)
+ ct.ResetColor()
+}
+
+// labelYellow - black fg, yellow bg.
+func labelYellow(s string, a ...interface{}) {
+ ct.ChangeColor(ct.Black, false, ct.Yellow, false)
+ fmt.Printf(s, a...)
+ ct.ResetColor()
+}
+
+// Foreground text coloring only.
+
+// printRed - red fg.
+func printRed(s string, a ...interface{}) {
+ ct.ChangeColor(ct.Red, true, ct.Black, false)
+ fmt.Printf(s, a...)
+ ct.ResetColor()
+}
+
+// printSections prints out a top sections block of a report.
+func printSections(n uint, s map[int]Pair) {
+ if len(s) == 0 {
+ fmt.Printf("Top %d sections: no entries\n", n)
+ } else {
+ fmt.Printf("Top %d sections\n", n)
+ fmt.Print("| sections | count")
+ fmt.Print("\n")
+ printHR()
+ for i := 0; i < len(s); i++ {
+ fmt.Print("| " + rightPad2Len(s[i].Key, " ", 63))
+ fmt.Print("| " + rightPad2Len(strconv.Itoa(s[i].Value), " ", 10))
+ fmt.Print("\n")
+ }
+ }
+ fmt.Print("\n")
+}
+
+// printSummary prints out a summary part of a report.
+func printSummary(cfg *Config, r *Report) {
+
+ fmt.Print("Summary:\n")
+ fmt.Print("| hits total | hits/s | 2xx | 3xx | 4xx | 5xx ")
+ fmt.Print("\n")
+ printHR()
+ fmt.Print("| " + rightPad2Len(strconv.Itoa(r.TotalHits), " ", 11))
+
+ // total hits / seconds for this interval
+ hits := int(math.Ceil(float64(r.TotalHits / cfg.ReportInt)))
+ fmt.Print("| " + rightPad2Len(strconv.Itoa(hits), " ", 11))
+
+ fmt.Print("| " + rightPad2Len(strconv.Itoa(r.StatusCodes[2]), " ", 11))
+ fmt.Print("| " + rightPad2Len(strconv.Itoa(r.StatusCodes[3]), " ", 11))
+
+ if r.StatusCodes[4] > 0 {
+ fmt.Print("| ")
+ labelYellow("%s", rightPad2Len(strconv.Itoa(r.StatusCodes[4]), " ", 11))
+ } else {
+ fmt.Print("| 0 ")
+ }
+
+ if r.StatusCodes[5] > 0 {
+ fmt.Print("| ")
+ labelRed("%s", rightPad2Len(strconv.Itoa(r.StatusCodes[5]), " ", 11))
+ } else {
+ fmt.Print("| 0 ")
+ }
+
+ fmt.Print("\n")
+}
+
+func rightPad2Len(s string, padStr string, overallLen int) string {
+ var padCountInt int
+ padCountInt = 1 + ((overallLen - len(padStr)) / len(padStr))
+ var retStr = s + strings.Repeat(padStr, padCountInt)
+ return retStr[:overallLen]
+}
+
+func printBigMsg(s string, tr int, t time.Time, bg ct.Color) {
+ fmt.Print("\n")
+
+ ct.ChangeColor(ct.White, true, bg, true)
+ fmt.Printf("%87s", " ")
+ ct.ResetColor()
+
+ fmt.Print("\n")
+
+ str := fmt.Sprintf(s, tr, t.Format(time.RFC3339))
+ size := len(str)
+ remaining := strconv.Itoa(86 - size)
+
+ ct.ChangeColor(ct.White, true, bg, true)
+ fmt.Printf(` %s %`+remaining+`s`, str, " ")
+ ct.ResetColor()
+
+ fmt.Print("\n")
+
+ ct.ChangeColor(ct.White, true, bg, true)
+ fmt.Printf("%87s", " ")
+ ct.ResetColor()
+
+ fmt.Print("\n\n")
+}
diff --git a/session.go b/session.go
new file mode 100644
index 0000000..165f1bd
--- /dev/null
+++ b/session.go
@@ -0,0 +1,214 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "strconv"
+ "time"
+
+ "github.com/satyrius/gonx"
+)
+
+// Session represents a monitoring session and handles all accumulated data.
+type Session struct {
+ AlertThreshold int
+ Entries []*Entry
+ File *os.File
+ Parser *gonx.Parser
+ PollInt int
+ Report *Report
+ State uint8
+}
+
+// Report accumulates data for reports.
+type Report struct {
+ StatusCodes map[uint8]int // 4 status code groups: 2xx, 3xx, 4xx, 5xx
+ Time *time.Time
+ TopSectionHits map[int]Pair
+ TotalHits int
+}
+
+// NewSession returns a new Session object.
+func NewSession(threshold, pollInt int, p *gonx.Parser) *Session {
+ return &Session{
+ AlertThreshold: threshold,
+ Parser: p,
+ PollInt: pollInt,
+ Report: NewReport(nil),
+ State: stateOK,
+ }
+}
+
+// SetLog adds file to the session.
+func (s *Session) SetLog(f string) error {
+ var err error
+ if f == "" {
+ return errors.New("No file provided")
+ }
+ s.File, err = os.Open(f)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// Close closes log file opened for this session.
+func (s *Session) Close() {
+ if s.File != nil {
+ s.File.Close()
+ }
+}
+
+// NewReport represents traffic summary for a user-defined report period.
+func NewReport(t *time.Time) *Report {
+ return &Report{
+ StatusCodes: map[uint8]int{
+ 5: 0,
+ 4: 0,
+ 3: 0,
+ 2: 0,
+ },
+ Time: t,
+ TopSectionHits: make(map[int]Pair),
+ }
+}
+
+// ConsumeLines receives log entries accumulated since last poll,
+// converts them into Entry objects and adds to the session buffer.
+func (s *Session) ConsumeLines(l []string) error {
+ for _, line := range l {
+
+ err := s.AddLine(line)
+ if err != nil {
+ return fmt.Errorf(" Error adding log entry %s \n Err: %s ", line, err.Error())
+ }
+ }
+
+ return nil
+}
+
+// AddLine adds a log entry as an Entry object to the session buffer.
+func (s *Session) AddLine(line string) error {
+
+ r := NewEntry(s.Parser)
+ err := r.ParseLine(line)
+ if err != nil {
+ return err
+ }
+
+ s.Entries = append(s.Entries, r)
+ s.Report.TotalHits++
+
+ return nil
+}
+
+// FlushReport returns interval report and resets accumulated stats.
+func (s *Session) FlushReport(cfg *Config, t *time.Time) *Report {
+
+ s.GetSectionHits(cfg.TopN) // sets i.Summary.TopSectionHits
+
+ s.GetStatusCodes() // sets i.Summary.StatusCodes
+
+ out := NewReport(t)
+
+ out.TotalHits = s.Report.TotalHits
+
+ for k, v := range s.Report.StatusCodes {
+ out.StatusCodes[k] = v
+ }
+
+ for k, v := range s.Report.TopSectionHits {
+ out.TopSectionHits[k] = v
+ }
+
+ s.reset()
+
+ return out
+}
+
+// reset nullifies traffic data accumulated since last report.
+func (s *Session) reset() {
+ s.Report = NewReport(nil)
+ s.Entries = []*Entry{}
+}
+
+// GetStatusCodes calculates status code summary.
+func (s *Session) GetStatusCodes() {
+
+ for _, e := range s.Entries {
+ i, err := strconv.Atoi(e.StatusCode[0:1])
+ if err != nil {
+ // todo: add error-logging
+ continue
+ }
+ codeGroup := uint8(i)
+ _, ok := s.Report.StatusCodes[codeGroup]
+ if !ok {
+ s.Report.StatusCodes[codeGroup] = 1
+ } else {
+ s.Report.StatusCodes[codeGroup]++
+ }
+ }
+}
+
+// GetSectionHits calculates top n section hits during the interval poll time.
+func (s *Session) GetSectionHits(n uint) {
+
+ sectionHits := make(map[string]int, len(s.Entries))
+
+ // Get hits by section.
+ for _, e := range s.Entries {
+
+ _, ok := sectionHits[e.Section]
+ if !ok {
+ sectionHits[e.Section] = 1
+ } else {
+ sectionHits[e.Section]++
+ }
+ }
+
+ // Sort.
+ sorted := RankByHits(sectionHits)
+
+ // Limit to top n.
+ s.Report.TopSectionHits = CutTopN(sorted, n)
+}
+
+// ShouldEscalate returns escalation action code.
+func (s *Session) ShouldEscalate(traffic int) bool {
+
+ if !s.IsAlert() && traffic >= s.AlertThreshold {
+ s.SetAlert()
+ return true
+ }
+
+ return false
+}
+
+// ShouldDeescalate returns escalation action code.
+func (s *Session) ShouldDeescalate(traffic int) bool {
+
+ if s.IsAlert() && traffic < s.AlertThreshold {
+ s.SetOK()
+ return true
+ }
+
+ return false
+}
+
+// IsAlert checks for alert state.
+func (s *Session) IsAlert() bool {
+ return s.State == stateAlert
+}
+
+// SetAlert sets current sta te to Alert.
+func (s *Session) SetAlert() {
+ s.State = stateAlert
+}
+
+// SetOK sets current sta te to OK.
+func (s *Session) SetOK() {
+ s.State = stateOK
+}
diff --git a/session_test.go b/session_test.go
new file mode 100644
index 0000000..aaf5893
--- /dev/null
+++ b/session_test.go
@@ -0,0 +1,202 @@
+package main
+
+import (
+ "reflect"
+ "testing"
+
+ "github.com/satyrius/gonx"
+)
+
+func TestNewInterval(t *testing.T) {
+
+ actual := NewSession(2, 2, nil)
+ expected := &Session{
+ AlertThreshold: 2,
+ PollInt: 2,
+ Report: &Report{
+ StatusCodes: map[uint8]int{
+ 5: 0,
+ 4: 0,
+ 3: 0,
+ 2: 0,
+ },
+ TopSectionHits: make(map[int]Pair),
+ },
+ State: stateOK,
+ }
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Error("Failed NewInterval test!")
+ t.Log("Expected:")
+ t.Logf("%+v\n", expected)
+
+ t.Log("Actual:")
+ t.Logf("%+v\n", actual)
+ }
+}
+
+func TestInterval_AddEntry(t *testing.T) {
+
+ parser := gonx.NewParser(parserFormat)
+ s := NewSession(2, 2, parser)
+
+ testString := `182.198.120.1 - - [28/Jul/1995:13:16:47 -0400] "GET /shuttle/technology/sts-newsref/srb.html HTTP/1.0" 200 49553`
+
+ err := s.AddLine(testString)
+ if err != nil {
+ t.Fatalf("AddEntry should not fail. Error: %+v", err)
+ }
+ err = s.AddLine(testString)
+ if err != nil {
+ t.Fatalf("AddEntry should not fail. Error: %+v", err)
+ }
+
+ expected := 2
+ actual := len(s.Entries)
+
+ if expected != actual {
+ t.Errorf("Should have %d entries, got %v", expected, actual)
+ }
+}
+
+func TestInterval_GetSectionHits(t *testing.T) {
+
+ parser := gonx.NewParser(parserFormat)
+ s := NewSession(2, 2, parser)
+ var err error
+
+ // Section: /shuttle
+ // Hist: 2
+ for n := 0; n < 2; n++ {
+ err = s.AddLine(`182.198.120.1 - - [28/Jul/1995:13:16:47 -0400] "GET /shuttle/technology/sts-newsref/srb.html HTTP/1.0" 200 49553`)
+ if err != nil {
+ t.Fatalf("AddEntry should not fail. Error: %+v", err)
+ }
+ }
+
+ // Section: /images
+ // Hist: 3
+ for n := 0; n < 3; n++ {
+ err = s.AddLine(`198.155.12.13 - - [28/Jul/1995:13:17:09 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786`)
+ if err != nil {
+ t.Fatalf("AddEntry should not fail. Error: %+v", err)
+ }
+ }
+
+ // Section: /history
+ // Hist: 1
+ err = s.AddLine(`165.13.14.55 - - [28/Jul/1995:13:17:00 -0400] "GET /history/apollo/apollo-17/apollo-17-info.html HTTP/1.0" 200 1457`)
+ if err != nil {
+ t.Fatalf("AddEntry should not fail. Error: %+v", err)
+ }
+
+ expectedTopN := uint(3)
+ s.GetSectionHits(expectedTopN)
+
+ expected := map[int]Pair{
+ 0: {"/images", 3},
+ 1: {"/shuttle", 2},
+ 2: {"/history", 1},
+ }
+
+ actual := s.Report.TopSectionHits
+ actualTopN := uint(len(s.Report.TopSectionHits))
+
+ if expectedTopN != actualTopN {
+ t.Errorf("Expected Top N %d, got %d.", expectedTopN, actualTopN)
+ }
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Error("Failed GetTopHits test!")
+ t.Log("Expected:")
+ t.Logf("%+v\n", expected)
+
+ t.Log("Actual:")
+ t.Logf("%+v\n", actual)
+ }
+}
+
+func TestInterval_GetStatusCodes(t *testing.T) {
+
+ parser := gonx.NewParser(parserFormat)
+ s := NewSession(2, 2, parser)
+ var err error
+
+ // Code: 200
+ // Hits: 2
+ for n := 0; n < 2; n++ {
+ err = s.AddLine(`182.198.120.1 - - [28/Jul/1995:13:16:47 -0400] "GET /shuttle/technology/sts-newsref/srb.html HTTP/1.0" 200 49553`)
+ if err != nil {
+ t.Fatalf("AddEntry should not fail. Error: %+v", err)
+ }
+ }
+
+ // Code: 500
+ // Hits: 3
+ for n := 0; n < 3; n++ {
+ err = s.AddLine(`198.155.12.13 - - [28/Jul/1995:13:17:09 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 500 786`)
+ if err != nil {
+ t.Fatalf("AddEntry should not fail. Error: %+v", err)
+ }
+ }
+
+ // Code: 401
+ // Hits: 1
+ err = s.AddLine(`165.13.14.55 - - [28/Jul/1995:13:17:00 -0400] "GET /history/apollo/apollo-17/apollo-17-info.html HTTP/1.0" 401 1457`)
+ if err != nil {
+ t.Fatalf("AddEntry should not fail. Error: %+v", err)
+ }
+
+ expected := map[uint8]int{
+ 5: 3,
+ 4: 1,
+ 3: 0,
+ 2: 2,
+ }
+
+ s.GetStatusCodes()
+ actual := s.Report.StatusCodes
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Error("Failed GetStatusCodes test!")
+ t.Log("Expected:")
+ t.Logf("%+v\n", expected)
+
+ t.Log("Actual:")
+ t.Logf("%+v\n", actual)
+ }
+}
+
+func TestSession_ShouldEscalate_True(t *testing.T) {
+
+ threshold := 1
+ s := NewSession(threshold, 2, nil)
+ s.SetOK()
+
+ expected := true
+
+ traffic := 2
+
+ actual := s.ShouldEscalate(traffic) // traffic = 2, threshold = 1
+
+ if actual != expected {
+ t.Errorf("UpdateState(%d, %d): expected %d, actual %d", traffic, threshold, expected, actual)
+ }
+}
+
+func TestSession_ShouldEscalate_False(t *testing.T) {
+
+ threshold := 3
+ s := NewSession(threshold, 2, nil)
+ s.SetOK()
+
+ expected := false
+
+ traffic := 2
+
+ actual := s.ShouldEscalate(traffic) // traffic = 2, threshold = 1
+
+ if actual != expected {
+ t.Errorf("UpdateState(%d, %d): expected %t, actual %t", traffic, threshold, expected, actual)
+ }
+}
diff --git a/state.go b/state.go
new file mode 100644
index 0000000..1308d5b
--- /dev/null
+++ b/state.go
@@ -0,0 +1,9 @@
+package main
+
+const (
+ // State severity levels.
+
+ stateAlert uint8 = 2
+ //StateWarning uint8 = 1
+ stateOK uint8 = 0
+)
diff --git a/vendor/github.com/daviddengcn/go-colortext/.gitignore b/vendor/github.com/daviddengcn/go-colortext/.gitignore
new file mode 100644
index 0000000..0026861
--- /dev/null
+++ b/vendor/github.com/daviddengcn/go-colortext/.gitignore
@@ -0,0 +1,22 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
diff --git a/vendor/github.com/daviddengcn/go-colortext/LICENSE b/vendor/github.com/daviddengcn/go-colortext/LICENSE
new file mode 100644
index 0000000..62ca9ee
--- /dev/null
+++ b/vendor/github.com/daviddengcn/go-colortext/LICENSE
@@ -0,0 +1,54 @@
+BSD License
+===========
+
+Copyright (c) 2016, David Deng
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of go-colortext nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+MIT License
+===========
+
+Copyright (c) 2016 David Deng
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/daviddengcn/go-colortext/README.md b/vendor/github.com/daviddengcn/go-colortext/README.md
new file mode 100644
index 0000000..f7feca8
--- /dev/null
+++ b/vendor/github.com/daviddengcn/go-colortext/README.md
@@ -0,0 +1,21 @@
+go-colortext package [![GoSearch](http://go-search.org/badge?id=github.com%2Fdaviddengcn%2Fgo-colortext)](http://go-search.org/view?id=github.com%2Fdaviddengcn%2Fgo-colortext)
+====================
+
+This is a package to change the color of the text and background in the console, working both under Windows and other systems.
+
+Under Windows, the console APIs are used. Otherwise, ANSI texts are output.
+
+Docs: http://godoc.org/github.com/daviddengcn/go-colortext ([packages that import ct](http://go-search.org/view?id=github.com%2fdaviddengcn%2fgo-colortext))
+
+Usage:
+```go
+ct.Foreground(Green, false)
+fmt.Println("Green text starts here...")
+ct.ChangeColor(Red, true, White, false)
+fmt.Println(...)
+ct.ResetColor()
+```
+
+LICENSE
+=======
+BSD/MIT license
diff --git a/vendor/github.com/daviddengcn/go-colortext/ct.go b/vendor/github.com/daviddengcn/go-colortext/ct.go
new file mode 100644
index 0000000..d93bc88
--- /dev/null
+++ b/vendor/github.com/daviddengcn/go-colortext/ct.go
@@ -0,0 +1,45 @@
+/*
+ct package provides functions to change the color of console text.
+
+Under windows platform, the Console API is used. Under other systems, ANSI text mode is used.
+*/
+package ct
+
+// Color is the type of color to be set.
+type Color int
+
+const (
+ // No change of color
+ None = Color(iota)
+ Black
+ Red
+ Green
+ Yellow
+ Blue
+ Magenta
+ Cyan
+ White
+)
+
+// ResetColor resets the foreground and background to original colors
+func ResetColor() {
+ resetColor()
+}
+
+// ChangeColor sets the foreground and background colors. If the value of the color is None,
+// the corresponding color keeps unchanged.
+// If fgBright or bgBright is set true, corresponding color use bright color. bgBright may be
+// ignored in some OS environment.
+func ChangeColor(fg Color, fgBright bool, bg Color, bgBright bool) {
+ changeColor(fg, fgBright, bg, bgBright)
+}
+
+// Foreground changes the foreground color.
+func Foreground(cl Color, bright bool) {
+ ChangeColor(cl, bright, None, false)
+}
+
+// Background changes the background color.
+func Background(cl Color, bright bool) {
+ ChangeColor(None, false, cl, bright)
+}
diff --git a/vendor/github.com/daviddengcn/go-colortext/ct_ansi.go b/vendor/github.com/daviddengcn/go-colortext/ct_ansi.go
new file mode 100644
index 0000000..861e82d
--- /dev/null
+++ b/vendor/github.com/daviddengcn/go-colortext/ct_ansi.go
@@ -0,0 +1,51 @@
+// +build !windows
+
+package ct
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+)
+
+func isDumbTerm() bool {
+ return os.Getenv("TERM") == "dumb"
+}
+
+func resetColor() {
+ if isDumbTerm() {
+ return
+ }
+ fmt.Print("\x1b[0m")
+}
+
+func ansiText(fg Color, fgBright bool, bg Color, bgBright bool) string {
+ if fg == None && bg == None {
+ return ""
+ }
+ s := []byte("\x1b[0")
+ if fg != None {
+ s = strconv.AppendUint(append(s, ";"...), 30+(uint64)(fg-Black), 10)
+ if fgBright {
+ s = append(s, ";1"...)
+ }
+ }
+ if bg != None {
+ s = strconv.AppendUint(append(s, ";"...), 40+(uint64)(bg-Black), 10)
+ if bgBright {
+ s = append(s, ";1"...)
+ }
+ }
+ s = append(s, "m"...)
+ return string(s)
+}
+
+func changeColor(fg Color, fgBright bool, bg Color, bgBright bool) {
+ if isDumbTerm() {
+ return
+ }
+ if fg == None && bg == None {
+ return
+ }
+ fmt.Print(ansiText(fg, fgBright, bg, bgBright))
+}
diff --git a/vendor/github.com/daviddengcn/go-colortext/ct_win.go b/vendor/github.com/daviddengcn/go-colortext/ct_win.go
new file mode 100644
index 0000000..2b267f4
--- /dev/null
+++ b/vendor/github.com/daviddengcn/go-colortext/ct_win.go
@@ -0,0 +1,133 @@
+// +build windows
+
+package ct
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var fg_colors = []uint16{
+ 0,
+ 0,
+ foreground_red,
+ foreground_green,
+ foreground_red | foreground_green,
+ foreground_blue,
+ foreground_red | foreground_blue,
+ foreground_green | foreground_blue,
+ foreground_red | foreground_green | foreground_blue}
+
+var bg_colors = []uint16{
+ 0,
+ 0,
+ background_red,
+ background_green,
+ background_red | background_green,
+ background_blue,
+ background_red | background_blue,
+ background_green | background_blue,
+ background_red | background_green | background_blue}
+
+const (
+ foreground_blue = uint16(0x0001)
+ foreground_green = uint16(0x0002)
+ foreground_red = uint16(0x0004)
+ foreground_intensity = uint16(0x0008)
+ background_blue = uint16(0x0010)
+ background_green = uint16(0x0020)
+ background_red = uint16(0x0040)
+ background_intensity = uint16(0x0080)
+
+ foreground_mask = foreground_blue | foreground_green | foreground_red | foreground_intensity
+ background_mask = background_blue | background_green | background_red | background_intensity
+)
+
+var (
+ kernel32 = syscall.NewLazyDLL("kernel32.dll")
+
+ procGetStdHandle = kernel32.NewProc("GetStdHandle")
+ procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute")
+ procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
+
+ hStdout uintptr
+ initScreenInfo *console_screen_buffer_info
+)
+
+func setConsoleTextAttribute(hConsoleOutput uintptr, wAttributes uint16) bool {
+ ret, _, _ := procSetConsoleTextAttribute.Call(
+ hConsoleOutput,
+ uintptr(wAttributes))
+ return ret != 0
+}
+
+type coord struct {
+ X, Y int16
+}
+
+type small_rect struct {
+ Left, Top, Right, Bottom int16
+}
+
+type console_screen_buffer_info struct {
+ DwSize coord
+ DwCursorPosition coord
+ WAttributes uint16
+ SrWindow small_rect
+ DwMaximumWindowSize coord
+}
+
+func getConsoleScreenBufferInfo(hConsoleOutput uintptr) *console_screen_buffer_info {
+ var csbi console_screen_buffer_info
+ if ret, _, _ := procGetConsoleScreenBufferInfo.Call(hConsoleOutput, uintptr(unsafe.Pointer(&csbi))); ret == 0 {
+ return nil
+ }
+ return &csbi
+}
+
+const (
+ std_output_handle = uint32(-11 & 0xFFFFFFFF)
+)
+
+func init() {
+ kernel32 := syscall.NewLazyDLL("kernel32.dll")
+
+ procGetStdHandle = kernel32.NewProc("GetStdHandle")
+
+ hStdout, _, _ = procGetStdHandle.Call(uintptr(std_output_handle))
+
+ initScreenInfo = getConsoleScreenBufferInfo(hStdout)
+
+ syscall.LoadDLL("")
+}
+
+func resetColor() {
+ if initScreenInfo == nil { // No console info - Ex: stdout redirection
+ return
+ }
+ setConsoleTextAttribute(hStdout, initScreenInfo.WAttributes)
+}
+
+func changeColor(fg Color, fgBright bool, bg Color, bgBright bool) {
+ attr := uint16(0)
+ if fg == None || bg == None {
+ cbufinfo := getConsoleScreenBufferInfo(hStdout)
+ if cbufinfo == nil { // No console info - Ex: stdout redirection
+ return
+ }
+ attr = cbufinfo.WAttributes
+ }
+ if fg != None {
+ attr = attr & ^foreground_mask | fg_colors[fg]
+ if fgBright {
+ attr |= foreground_intensity
+ }
+ }
+ if bg != None {
+ attr = attr & ^background_mask | bg_colors[bg]
+ if bgBright {
+ attr |= background_intensity
+ }
+ }
+ setConsoleTextAttribute(hStdout, attr)
+}