vizi_tracker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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