vizi_tracker 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/README.rdoc +116 -0
  2. data/Rakefile +44 -0
  3. data/config/logger-backup.yml +49 -0
  4. data/config/logger.yml +69 -0
  5. data/config/logger_apache.yml +65 -0
  6. data/config/logger_sample.yml +69 -0
  7. data/data/exlog.log +5458 -0
  8. data/data/sample-alter.log +11870 -0
  9. data/data/sample-surf.log +47 -0
  10. data/data/sample-wle.log +30474 -0
  11. data/data/testlog.log +270 -0
  12. data/data/vizitrax.log +17951 -0
  13. data/doc/Object.html +200 -0
  14. data/doc/ParserTest.html +268 -0
  15. data/doc/README_rdoc.html +128 -0
  16. data/doc/Rakefile.html +148 -0
  17. data/doc/Visit.html +487 -0
  18. data/doc/VisitList.html +385 -0
  19. data/doc/Vizi/LogFormat.html +377 -0
  20. data/doc/Vizi/LogParser.html +551 -0
  21. data/doc/Vizi/Visit.html +487 -0
  22. data/doc/Vizi/VisitList.html +386 -0
  23. data/doc/Vizi.html +168 -0
  24. data/doc/ViziLogFormat.html +382 -0
  25. data/doc/ViziLogParser.html +551 -0
  26. data/doc/created.rid +8 -0
  27. data/doc/formats/apache-custom-log.pdf +0 -0
  28. data/doc/formats/apache.rtf +238 -0
  29. data/doc/formats/format-descriptions.xls +0 -0
  30. data/doc/formats/w3c-extended.pdf +0 -0
  31. data/doc/formats/w3c-extended.rtf +135 -0
  32. data/doc/images/brick.png +0 -0
  33. data/doc/images/brick_link.png +0 -0
  34. data/doc/images/bug.png +0 -0
  35. data/doc/images/bullet_black.png +0 -0
  36. data/doc/images/bullet_toggle_minus.png +0 -0
  37. data/doc/images/bullet_toggle_plus.png +0 -0
  38. data/doc/images/date.png +0 -0
  39. data/doc/images/find.png +0 -0
  40. data/doc/images/loadingAnimation.gif +0 -0
  41. data/doc/images/macFFBgHack.png +0 -0
  42. data/doc/images/package.png +0 -0
  43. data/doc/images/page_green.png +0 -0
  44. data/doc/images/page_white_text.png +0 -0
  45. data/doc/images/page_white_width.png +0 -0
  46. data/doc/images/plugin.png +0 -0
  47. data/doc/images/ruby.png +0 -0
  48. data/doc/images/tag_green.png +0 -0
  49. data/doc/images/wrench.png +0 -0
  50. data/doc/images/wrench_orange.png +0 -0
  51. data/doc/images/zoom.png +0 -0
  52. data/doc/index.html +112 -0
  53. data/doc/js/darkfish.js +116 -0
  54. data/doc/js/jquery.js +32 -0
  55. data/doc/js/quicksearch.js +114 -0
  56. data/doc/js/thickbox-compressed.js +10 -0
  57. data/doc/lib/vizi/parser_rb.html +63 -0
  58. data/doc/lib/vizi/vizi_tracker_rb.html +63 -0
  59. data/doc/lib/vizi_log_parser_rb.html +56 -0
  60. data/doc/lib/vizi_tracker_rb.html +56 -0
  61. data/doc/rdoc.css +759 -0
  62. data/doc/test/parser_test_rb.html +54 -0
  63. data/doc/test/test_helper_rb.html +56 -0
  64. data/doc/testit_rb.html +63 -0
  65. data/lib/vizi/vizi_tracker.rb +406 -0
  66. data/lib/vizi_tracker.rb +5 -0
  67. data/log/parse.log +79 -0
  68. data/log/system.log +66 -0
  69. data/test/parser_test.rb +48 -0
  70. data/test/test_helper.rb +3 -0
  71. data/testit.rb +105 -0
  72. data/vizi_tracker.gemspec +21 -0
  73. metadata +146 -0
data/log/system.log ADDED
@@ -0,0 +1,66 @@
1
+ # Logfile created on 2011-06-05 21:46:30 -0400 by logger.rb/25413
2
+ I, [2011-06-05T21:46:30.867462 #3444] INFO -- : starting ... >>> 2011-06-05 21:46:30 -0400
3
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : Record count is 5458
4
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : Hit count is 5438
5
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : Page count is 506
6
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : Total visit count is 461
7
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : Human visit count is 119
8
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : Drop visit count is 78
9
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : Spider visit count is 264
10
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : Batch processing time 1.677403
11
+ I, [2011-06-05T21:46:32.576065 #3444] INFO -- : ending ... >>> 2011-06-05 21:46:32 -0400
12
+ I, [2011-06-05T21:46:53.028704 #5108] INFO -- : starting ... >>> 2011-06-05 21:46:53 -0400
13
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : Record count is 30474
14
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : Hit count is 30474
15
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : Page count is 0
16
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : Total visit count is 4484
17
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : Human visit count is 4227
18
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : Drop visit count is 0
19
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : Spider visit count is 257
20
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : Batch processing time 13.675125
21
+ I, [2011-06-05T21:47:06.719429 #5108] INFO -- : ending ... >>> 2011-06-05 21:47:06 -0400
22
+ I, [2011-06-05T21:47:44.613806 #1112] INFO -- : starting ... >>> 2011-06-05 21:47:44 -0400
23
+ I, [2011-06-05T21:48:01.451639 #4252] INFO -- : starting ... >>> 2011-06-05 21:48:01 -0400
24
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : Record count is 11870
25
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : Hit count is 11870
26
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : Page count is 0
27
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : Total visit count is 1
28
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : Human visit count is 1
29
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : Drop visit count is 0
30
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : Spider visit count is 0
31
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : Batch processing time 3.744208
32
+ I, [2011-06-05T21:48:05.195847 #4252] INFO -- : ending ... >>> 2011-06-05 21:48:05 -0400
33
+ I, [2011-06-05T21:48:20.829574 #4544] INFO -- : starting ... >>> 2011-06-05 21:48:20 -0400
34
+ I, [2011-06-05T21:50:44.333188 #960] INFO -- : starting ... >>> 2011-06-05 21:50:44 -0400
35
+ I, [2011-06-05T21:51:56.322305 #4712] INFO -- : starting ... >>> 2011-06-05 21:51:56 -0400
36
+ I, [2011-06-05T21:53:42.440375 #4832] INFO -- : starting ... >>> 2011-06-05 21:53:42 -0400
37
+ I, [2011-06-05T22:07:49.079943 #4560] INFO -- : starting ... >>> 2011-06-05 22:07:49 -0400
38
+ I, [2011-06-05T22:07:49.184949 #4560] INFO -- : Record count is 47
39
+ I, [2011-06-05T22:07:49.184949 #4560] INFO -- : Hit count is 42
40
+ I, [2011-06-05T22:07:49.184949 #4560] INFO -- : Page count is 0
41
+ I, [2011-06-05T22:07:49.184949 #4560] INFO -- : Total visit count is 1
42
+ I, [2011-06-05T22:07:49.184949 #4560] INFO -- : Human visit count is 1
43
+ I, [2011-06-05T22:07:49.185949 #4560] INFO -- : Drop visit count is 0
44
+ I, [2011-06-05T22:07:49.185949 #4560] INFO -- : Spider visit count is 0
45
+ I, [2011-06-05T22:07:49.185949 #4560] INFO -- : Batch processing time 0.105006
46
+ I, [2011-06-05T22:07:49.185949 #4560] INFO -- : ending ... >>> 2011-06-05 22:07:49 -0400
47
+ I, [2011-06-05T22:08:53.515628 #560] INFO -- : starting ... >>> 2011-06-05 22:08:53 -0400
48
+ I, [2011-06-05T22:08:53.529629 #560] INFO -- : Record count is 47
49
+ I, [2011-06-05T22:08:53.529629 #560] INFO -- : Hit count is 42
50
+ I, [2011-06-05T22:08:53.529629 #560] INFO -- : Page count is 0
51
+ I, [2011-06-05T22:08:53.530629 #560] INFO -- : Total visit count is 1
52
+ I, [2011-06-05T22:08:53.530629 #560] INFO -- : Human visit count is 1
53
+ I, [2011-06-05T22:08:53.530629 #560] INFO -- : Drop visit count is 0
54
+ I, [2011-06-05T22:08:53.530629 #560] INFO -- : Spider visit count is 0
55
+ I, [2011-06-05T22:08:53.530629 #560] INFO -- : Batch processing time 0.014
56
+ I, [2011-06-05T22:08:53.531629 #560] INFO -- : ending ... >>> 2011-06-05 22:08:53 -0400
57
+ I, [2011-06-05T22:37:50.150958 #3476] INFO -- : starting ... >>> 2011-06-05 22:37:50 -0400
58
+ I, [2011-06-05T22:37:51.664045 #3476] INFO -- : Record count is 5458
59
+ I, [2011-06-05T22:37:51.665045 #3476] INFO -- : Hit count is 5438
60
+ I, [2011-06-05T22:37:51.665045 #3476] INFO -- : Page count is 506
61
+ I, [2011-06-05T22:37:51.665045 #3476] INFO -- : Total visit count is 461
62
+ I, [2011-06-05T22:37:51.665045 #3476] INFO -- : Human visit count is 119
63
+ I, [2011-06-05T22:37:51.665045 #3476] INFO -- : Drop visit count is 78
64
+ I, [2011-06-05T22:37:51.665045 #3476] INFO -- : Spider visit count is 264
65
+ I, [2011-06-05T22:37:51.665045 #3476] INFO -- : Batch processing time 1.513087
66
+ I, [2011-06-05T22:37:51.665045 #3476] INFO -- : ending ... >>> 2011-06-05 22:37:51 -0400
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ require 'uri'
4
+
5
+ class ParserTest < Test::Unit::TestCase
6
+
7
+ def test_parser_creation
8
+
9
+ parser = HttpLogParser.new
10
+ assert_not_nil parser
11
+ assert_equal 5, parser.formats.size
12
+
13
+ parser = HttpLogParser.new('%h %l %u %t \"%r\" %>s %b')
14
+ assert_not_nil parser
15
+ assert_equal 1, parser.formats.size
16
+
17
+ parser = HttpLogParser.new({
18
+ :common => '%h %l %u %t \"%r\" %>s %b',
19
+ :common_with_virtual => '%v %h %l %u %t \"%r\" %>s %b',
20
+ })
21
+ assert_not_nil parser
22
+ assert_equal 2, parser.formats.size
23
+
24
+ end
25
+
26
+ def test_simple_parsing
27
+
28
+ parser = HttpLogParser.new
29
+ assert_not_nil parser
30
+
31
+ parsed = parser.parse_line('111.222.333.444 - - [21/Apr/2010:01:02:03 +0000] "GET /some/url?some=parameter HTTP/1.1" 302 123 "http://somewhere.com" "Browser (Version 1.0)"')
32
+
33
+ assert_equal '111.222.333.444', parsed[:ip]
34
+ assert_equal '111.222.333.444', parsed[:domain]
35
+ assert_equal '-', parsed[:auth]
36
+ assert_equal '-', parsed[:username]
37
+ assert_equal '21/Apr/2010:01:02:03 +0000', parsed[:datetime]
38
+ assert_equal 'GET /some/url?some=parameter HTTP/1.1', parsed[:request]
39
+ assert_equal '302', parsed[:status]
40
+ assert_equal '123', parsed[:bytecount]
41
+ assert_equal 'http://somewhere.com', parsed[:referer]
42
+ assert_equal 'Browser (Version 1.0)', parsed[:user_agent]
43
+
44
+ assert_equal 11, parsed.size
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,3 @@
1
+ require 'test/unit'
2
+ require "#{File.expand_path(File.dirname(__FILE__))}/../lib/http_log_parser.rb"
3
+ begin; require 'ruby-debug'; rescue LoadError; end
data/testit.rb ADDED
@@ -0,0 +1,105 @@
1
+ # This is a sample application that uses the Vizitracker gem classes
2
+ #
3
+ # This application will open a web log file (with either an IIS or Apache format).
4
+ # Each record will be parser, and Visit records will be created. When the visit
5
+ # timeout duration has been reached, an output record will be generated.
6
+ #
7
+ # Author:: Al Kivi <al.kivi@vizitrax.com>
8
+
9
+ # Use either the library version of the code
10
+ require './lib/vizi_tracker'
11
+ # Or replace the above line to reference the gem version, if installed
12
+ # require 'vizi_tracker'
13
+
14
+ require 'yaml'
15
+ require 'logger'
16
+
17
+ config = YAML.load_file("config/logger.yml")
18
+
19
+ @@download_page_number = config["download_page_number"]
20
+ @@visit_timeout = config["visit_timeout"]
21
+
22
+ # Initialize the log parser
23
+ parser = Vizi::LogParser.new(config["drop_ips"], config["spider_ips"],
24
+ config["spider_names"], config["page_urls"], config["hide_urls"],
25
+ config["homepage"], config["accept_only_homepage"],config["hostname"],
26
+ config["drop_refers_by_hostname"], config["use_local_time"],
27
+ config["assigned_numbers"], config["match_page_numbers"])
28
+
29
+ syslog = Logger.new('./log/system.log',shift_age = 'weekly')
30
+ case config["log_level"]
31
+ when "info"
32
+ syslog.level = Logger::INFO
33
+ when "warn"
34
+ syslog.level = Logger::WARN
35
+ when "error"
36
+ syslog.level = Logger::ERROR
37
+ when "fatal"
38
+ syslog.level = Logger::FATAL
39
+ else
40
+ syslog.level = Logger::DEBUG
41
+ end
42
+ syslog.info "starting ... >>> "+Time.now.to_s
43
+
44
+ # Open log file for reading
45
+ File.open('./data/exlog.log', 'r') do |file|
46
+ vlist = Vizi::VisitList.new
47
+ rec_count = 0
48
+ hit_count = 0
49
+ max_rec_count = 99999
50
+ max_rec_count = config["max_rec_count"] if config["max_rec_count"]
51
+ visit_count = 0
52
+ page_count = 0
53
+ human_count = 0
54
+ drop_count = 0
55
+ spider_count = 0
56
+ start_time = Time.now
57
+ logformat = nil
58
+ # Begin to parse each record
59
+ while(line = file.gets)
60
+ parsed_data = parser.parse_line(line, logformat)
61
+ logformat = parsed_data[:p_logformat]
62
+ rec_count = rec_count + 1
63
+ next if parsed_data[:p_linetype] != "V"
64
+ hit_count = hit_count + 1
65
+ page_count = page_count + 1 if parsed_data[:p_pageflag]
66
+ @visit=vlist.find_by_ip(parsed_data[:ip])
67
+ if @visit.nil?
68
+ vlist.append(Vizi::Visit.new(parsed_data[:ip],parsed_data[:datetime],parsed_data[:csuristem],parsed_data[:csuriquery], parsed_data[:timetaken],
69
+ parsed_data[:p_visitortype],parsed_data[:p_pageflag],parsed_data[:p_searchphrase],parsed_data[:p_pageid]))
70
+ @visit=vlist.find_by_ip(parsed_data[:ip])
71
+ visit_count = visit_count + 1
72
+ else
73
+ @visit.update(parsed_data[:datetime],parsed_data[:csuriquery],parsed_data[:timetaken],
74
+ parsed_data[:p_visitortype],parsed_data[:p_pageflag],parsed_data[:p_searchphrase], parsed_data[:p_pageid])
75
+ end
76
+ @visits = vlist.find_expired(@visit.start_dt)
77
+ if @visits
78
+ @visits.sendoutput
79
+ vlist.delete(@visits)
80
+ human_count = human_count + 1 if @visits.visitortype == "H"
81
+ drop_count = drop_count + 1 if @visits.visitortype == "D"
82
+ spider_count = spider_count + 1 if @visits.visitortype == "S"
83
+ end
84
+ break if rec_count == max_rec_count
85
+ end
86
+ @visits = vlist.find_all
87
+ @visits.each {|v|
88
+ v.sendoutput
89
+ human_count = human_count + 1 if v.visitortype == "H"
90
+ drop_count = drop_count + 1 if v.visitortype == "D"
91
+ spider_count = spider_count + 1 if v.visitortype == "S"
92
+ }
93
+ if config["summary_flag"]
94
+ syslog.info "Record count is "+rec_count.to_s
95
+ syslog.info "Hit count is "+hit_count.to_s
96
+ syslog.info "Page count is "+page_count.to_s
97
+ syslog.info "Total visit count is "+visit_count.to_s
98
+ syslog.info "Human visit count is "+human_count.to_s
99
+ syslog.info "Drop visit count is "+drop_count.to_s
100
+ syslog.info "Spider visit count is "+spider_count.to_s
101
+ syslog.info "Batch processing time "+(Time.now-start_time).to_s
102
+ end
103
+ syslog.info "ending ... >>> "+Time.now.to_s
104
+ end
105
+
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+
3
+ spec = Gem::Specification.new do |s|
4
+ s.name = 'vizi_tracker'
5
+ s.version = '0.1.0'
6
+ s.summary = "Visit tracking from Apache or IIS web log files"
7
+ s.description = "This module provides a set of classes to support the parsing of web log files and
8
+ the creation of visits from the individual parsed web log records.
9
+
10
+ The LogFormat and LogParser classes were derived in part from an Apache logger application
11
+ developed by Jan Wikholm. These two classes were extended to support both Apache and IIS
12
+ web logs. The details from the web logs are assembled to compose Visit objects and Visit
13
+ history detail"
14
+ s.files = Dir.glob("**/**/**")
15
+ s.test_files = Dir.glob("test/*_test.rb")
16
+ s.author = "Al Kivi"
17
+ s.homepage = "http://www.vizitrax.com"
18
+ s.email = "al.kivi@vizitrax.com"
19
+ s.has_rdoc = true
20
+ s.required_ruby_version = '>= 1.8.2'
21
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vizi_tracker
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Al Kivi
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-06-23 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: |-
22
+ This module provides a set of classes to support the parsing of web log files and
23
+ the creation of visits from the individual parsed web log records.
24
+
25
+ The LogFormat and LogParser classes were derived in part from an Apache logger application
26
+ developed by Jan Wikholm. These two classes were extended to support both Apache and IIS
27
+ web logs. The details from the web logs are assembled to compose Visit objects and Visit
28
+ history detail
29
+ email: al.kivi@vizitrax.com
30
+ executables: []
31
+
32
+ extensions: []
33
+
34
+ extra_rdoc_files: []
35
+
36
+ files:
37
+ - doc/Visit.html
38
+ - doc/testit_rb.html
39
+ - doc/Rakefile.html
40
+ - doc/formats/apache.rtf
41
+ - doc/formats/w3c-extended.rtf
42
+ - doc/formats/apache-custom-log.pdf
43
+ - doc/formats/format-descriptions.xls
44
+ - doc/formats/w3c-extended.pdf
45
+ - doc/Vizi/Visit.html
46
+ - doc/Vizi/VisitList.html
47
+ - doc/Vizi/LogFormat.html
48
+ - doc/Vizi/LogParser.html
49
+ - doc/images/bullet_black.png
50
+ - doc/images/bullet_toggle_plus.png
51
+ - doc/images/zoom.png
52
+ - doc/images/bug.png
53
+ - doc/images/wrench_orange.png
54
+ - doc/images/bullet_toggle_minus.png
55
+ - doc/images/loadingAnimation.gif
56
+ - doc/images/macFFBgHack.png
57
+ - doc/images/date.png
58
+ - doc/images/brick_link.png
59
+ - doc/images/tag_green.png
60
+ - doc/images/ruby.png
61
+ - doc/images/page_white_width.png
62
+ - doc/images/find.png
63
+ - doc/images/wrench.png
64
+ - doc/images/page_green.png
65
+ - doc/images/package.png
66
+ - doc/images/plugin.png
67
+ - doc/images/brick.png
68
+ - doc/images/page_white_text.png
69
+ - doc/VisitList.html
70
+ - doc/ViziLogParser.html
71
+ - doc/Object.html
72
+ - doc/Vizi.html
73
+ - doc/created.rid
74
+ - doc/lib/vizi_tracker_rb.html
75
+ - doc/lib/vizi/vizi_tracker_rb.html
76
+ - doc/lib/vizi/parser_rb.html
77
+ - doc/lib/vizi_log_parser_rb.html
78
+ - doc/ViziLogFormat.html
79
+ - doc/js/thickbox-compressed.js
80
+ - doc/js/jquery.js
81
+ - doc/js/darkfish.js
82
+ - doc/js/quicksearch.js
83
+ - doc/ParserTest.html
84
+ - doc/index.html
85
+ - doc/test/test_helper_rb.html
86
+ - doc/test/parser_test_rb.html
87
+ - doc/README_rdoc.html
88
+ - doc/rdoc.css
89
+ - data/sample-wle.log
90
+ - data/testlog.log
91
+ - data/exlog.log
92
+ - data/sample-surf.log
93
+ - data/sample-alter.log
94
+ - data/vizitrax.log
95
+ - lib/vizi/vizi_tracker.rb
96
+ - lib/vizi_tracker.rb
97
+ - README.rdoc
98
+ - vizi_tracker-0.1.0.gem
99
+ - Rakefile
100
+ - log/parse.log
101
+ - log/system.log
102
+ - test/parser_test.rb
103
+ - test/test_helper.rb
104
+ - config/logger.yml
105
+ - config/logger-backup.yml
106
+ - config/logger_sample.yml
107
+ - config/logger_apache.yml
108
+ - testit.rb
109
+ - vizi_tracker.gemspec
110
+ homepage: http://www.vizitrax.com
111
+ licenses: []
112
+
113
+ post_install_message:
114
+ rdoc_options: []
115
+
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ hash: 51
124
+ segments:
125
+ - 1
126
+ - 8
127
+ - 2
128
+ version: 1.8.2
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ hash: 3
135
+ segments:
136
+ - 0
137
+ version: "0"
138
+ requirements: []
139
+
140
+ rubyforge_project:
141
+ rubygems_version: 1.8.5
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: Visit tracking from Apache or IIS web log files
145
+ test_files:
146
+ - test/parser_test.rb