vizi_logger 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.
- data/README.rdoc +52 -0
- data/Rakefile +45 -0
- data/build_gem.sh +9 -0
- data/build_gem1.sh +1 -0
- data/build_gem2.sh +1 -0
- data/build_gem3.sh +3 -0
- data/geany_run_script.bat +6 -0
- data/lib/vizi/geany_run_script.bat +6 -0
- data/lib/vizi/vizi_logger.rb +55 -0
- data/lib/vizi_logger.rb +4 -0
- data/log/apache.log +7 -0
- data/log/vizidemo.log +26 -0
- data/test/parser_test.rb +48 -0
- data/test/test_helper.rb +3 -0
- data/testit.rb +30 -0
- data/testit_old.rb +49 -0
- data/vizi_logger.gemspec +20 -0
- metadata +90 -0
data/README.rdoc
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
= ViziLogger
|
2
|
+
|
3
|
+
== Introduction
|
4
|
+
|
5
|
+
This gem module creates a pagelogger that can used to log the visit to each
|
6
|
+
web page in a Ruby based web application (e.g., Ramaze, Rails). Each web page is
|
7
|
+
logged in Common Log Format to support analysis by an external Web Log Analyzer
|
8
|
+
|
9
|
+
== Installation
|
10
|
+
|
11
|
+
Just run:
|
12
|
+
|
13
|
+
gem install vizi_logger
|
14
|
+
|
15
|
+
The following code will simulate the implementation of the software in a Ruby
|
16
|
+
based web application. When used in a web application, the pagelogger should be
|
17
|
+
called with the following:
|
18
|
+
|
19
|
+
weblog.page page_url # where page_url provides the url information
|
20
|
+
|
21
|
+
The following example will allow for the testing of the gem in your development
|
22
|
+
environment.
|
23
|
+
|
24
|
+
You will need a Web Log Analyzer program to review the results of your application
|
25
|
+
logging. The output of this gem has been tested with the Summary web log analyzer.
|
26
|
+
Check it out at www.summary.net.
|
27
|
+
|
28
|
+
== Usage
|
29
|
+
|
30
|
+
require 'rubygems' # needed for ruby 1.8.7
|
31
|
+
require 'vizi_logger'
|
32
|
+
|
33
|
+
# weblog = Vizi::PageLogger.new(STDOUT)
|
34
|
+
|
35
|
+
weblog = Vizi::PageLogger.new('./log/vizidemo.log',shift_age = 'weekly')
|
36
|
+
|
37
|
+
weblog.addremote '127.0.0.1' # for batch testing
|
38
|
+
# weblog.addremote request.remote_addr # use this in live mode
|
39
|
+
|
40
|
+
weblog.formatter=Vizi::LogFormatter.new
|
41
|
+
|
42
|
+
urlist = ["/","/users/login","/users/list","/posts","/posts/view/1"]
|
43
|
+
|
44
|
+
25.times do
|
45
|
+
sleep rand*2 # create random interval
|
46
|
+
page_url = urlist[(5*rand).to_i] # select a random page url
|
47
|
+
weblog.page page_url
|
48
|
+
end
|
49
|
+
|
50
|
+
== License
|
51
|
+
|
52
|
+
This code is made available under the MIT license.
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
spec = Gem::Specification.new do |s|
|
7
|
+
s.name = "vizi_whois"
|
8
|
+
s.version = "0.1.0"
|
9
|
+
s.author = "Al Kivi"
|
10
|
+
s.email = "al.kivi at vizitrax.com"
|
11
|
+
s.homepage = "http://github.com/al-kivi/Vizi_Whois"
|
12
|
+
s.summary = "Global whois module to select the right whois server and get response data"
|
13
|
+
s.description = "This gem module provides a classes to find the right Regional Internet Registry
|
14
|
+
for a given IP Address. The query method will navigate each major RIR until a response is found"
|
15
|
+
|
16
|
+
s.platform = Gem::Platform::RUBY
|
17
|
+
s.has_rdoc = true
|
18
|
+
s.extra_rdoc_files = ["README.rdoc"]
|
19
|
+
|
20
|
+
s.require_path = "lib"
|
21
|
+
s.files = %w(README.rdoc Rakefile) + Dir.glob("lib/**/*")
|
22
|
+
end
|
23
|
+
|
24
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
25
|
+
pkg.need_tar = true
|
26
|
+
end
|
27
|
+
|
28
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
29
|
+
rdoc.rdoc_dir = 'rdoc'
|
30
|
+
rdoc.title = 'HttpLogParser'
|
31
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
32
|
+
rdoc.rdoc_files.include('README')
|
33
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
34
|
+
end
|
35
|
+
|
36
|
+
Rake::TestTask.new do |t|
|
37
|
+
t.libs << 'test'
|
38
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
39
|
+
t.verbose = true
|
40
|
+
end
|
41
|
+
|
42
|
+
task :default => "pkg/#{spec.name}-#{spec.version}.gem" do
|
43
|
+
puts "generated latest version"
|
44
|
+
end
|
45
|
+
|
data/build_gem.sh
ADDED
data/build_gem1.sh
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
sudo gem uninstall vizi_logger
|
data/build_gem2.sh
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
sudo gem build vizi_logger.gemspec
|
data/build_gem3.sh
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# This gem module creates a pagelogger that can used to log the visit to each
|
2
|
+
# web page in a Ruby based web application (e.g., Ramaze, Rails). Each web page is
|
3
|
+
# logged in Common Log Format to support analysis by an external Web Log Analyzer
|
4
|
+
#
|
5
|
+
# Author:: Al Kivi <al.kivi@vizitrax.com>
|
6
|
+
# License:: MIT
|
7
|
+
|
8
|
+
require 'logger'
|
9
|
+
|
10
|
+
module Vizi
|
11
|
+
# This class includes a set of methods that extend the Ruby Logger
|
12
|
+
class PageLogger < ::Logger
|
13
|
+
|
14
|
+
attr_accessor :ip
|
15
|
+
|
16
|
+
# This method will add the remote ip address to the Logger class
|
17
|
+
def initialize (*args)
|
18
|
+
super
|
19
|
+
ip = ''
|
20
|
+
end
|
21
|
+
|
22
|
+
# This method will add the ip address to the logger class
|
23
|
+
def addremote(ipaddr)
|
24
|
+
self.ip = ipaddr
|
25
|
+
end
|
26
|
+
|
27
|
+
# This method will create the log entry adding the request information
|
28
|
+
# Calling format is ... log.page '/admin/login.htm' or similar
|
29
|
+
def page(*args)
|
30
|
+
request = args.first
|
31
|
+
self.info([self.ip, request])
|
32
|
+
end
|
33
|
+
|
34
|
+
end # Pagelogger
|
35
|
+
|
36
|
+
# This class customizes the Logger::Formatter to match the Common Log Format
|
37
|
+
class LogFormatter < Logger::Formatter
|
38
|
+
# Provide a call() method that returns the formatted message.
|
39
|
+
def call(severity, time, program_name, message)
|
40
|
+
if severity == "INFO"
|
41
|
+
message.insert(1, ' -')
|
42
|
+
message.insert(2, ' - ')
|
43
|
+
message.insert(3, "["+Time.now.strftime("%d/%b/%Y:%H:%M:%S %z")+"] ")
|
44
|
+
request = message[4]
|
45
|
+
message[4] = '"'+request+'"'
|
46
|
+
message.insert(5, ' 200')
|
47
|
+
message.insert(7, ' 0')
|
48
|
+
print_message = "#{String(message)}\n"
|
49
|
+
else
|
50
|
+
super
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end # Vizi
|
data/lib/vizi_logger.rb
ADDED
data/log/apache.log
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
192.168.198.92 - - [22/Jul/2012:23:08:37 -0400] "GET / HTTP/1.1" 200 6394 www.yahoo.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1...)" "-"
|
2
|
+
192.168.198.92 - - [22/Jul/2012:23:08:38 -0400] "GET /images/logo.gif HTTP/1.1" 200 807 www.yahoo.com "http://www.some.com/" "Mozilla/4.0 (compatible; MSIE 6...)" "-"
|
3
|
+
192.168.72.177 - - [22/Jul/2012:23:32:14 -0400] "GET /news/sports.html HTTP/1.1" 200 3500 www.yahoo.com "http://www.some.com/" "Mozilla/4.0 (compatible; MSIE ...)" "-"
|
4
|
+
192.168.72.177 - - [22/Jul/2012:23:32:14 -0400] "GET /favicon.ico HTTP/1.1" 404 1997 www.yahoo.com "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3)..." "-"
|
5
|
+
192.168.72.177 - - [22/Jul/2012:23:32:15 -0400] "GET /style.css HTTP/1.1" 200 4138 www.yahoo.com "http://www.yahoo.com/index.html" "Mozilla/5.0 (Windows..." "-"
|
6
|
+
192.168.72.177 - - [22/Jul/2012:23:32:16 -0400] "GET /js/ads.js HTTP/1.1" 200 10229 www.yahoo.com "http://www.search.com/index.html" "Mozilla/5.0 (Windows..." "-"
|
7
|
+
192.168.72.177 - - [22/Jul/2012:23:32:19 -0400] "GET /search.php HTTP/1.1" 400 1997 www.yahoo.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ...)" "-"
|
data/log/vizidemo.log
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Logfile created on Sun Jul 22 12:14:42 -0400 2012 by logger.rb/1.2.6
|
2
|
+
127.0.0.1 - - [22/Jul/2012:12:14:42 -0400] "/users/list" 200 0
|
3
|
+
127.0.0.1 - - [22/Jul/2012:12:14:42 -0400] "/users/login" 200 0
|
4
|
+
127.0.0.1 - - [22/Jul/2012:12:14:43 -0400] "/users/login" 200 0
|
5
|
+
127.0.0.1 - - [22/Jul/2012:12:14:43 -0400] "/users/login" 200 0
|
6
|
+
127.0.0.1 - - [22/Jul/2012:12:14:43 -0400] "/" 200 0
|
7
|
+
127.0.0.1 - - [22/Jul/2012:12:14:44 -0400] "/users/login" 200 0
|
8
|
+
127.0.0.1 - - [22/Jul/2012:12:14:46 -0400] "/users/login" 200 0
|
9
|
+
127.0.0.1 - - [22/Jul/2012:12:14:47 -0400] "/users/list" 200 0
|
10
|
+
127.0.0.1 - - [22/Jul/2012:12:14:49 -0400] "/users/login" 200 0
|
11
|
+
127.0.0.1 - - [22/Jul/2012:12:14:49 -0400] "/posts" 200 0
|
12
|
+
127.0.0.1 - - [22/Jul/2012:12:14:50 -0400] "/posts" 200 0
|
13
|
+
127.0.0.1 - - [22/Jul/2012:12:14:50 -0400] "/users/login" 200 0
|
14
|
+
127.0.0.1 - - [22/Jul/2012:12:14:51 -0400] "/posts/view/1" 200 0
|
15
|
+
127.0.0.1 - - [22/Jul/2012:12:14:53 -0400] "/posts" 200 0
|
16
|
+
127.0.0.1 - - [22/Jul/2012:12:14:55 -0400] "/users/list" 200 0
|
17
|
+
127.0.0.1 - - [22/Jul/2012:12:14:55 -0400] "/posts/view/1" 200 0
|
18
|
+
127.0.0.1 - - [22/Jul/2012:12:14:57 -0400] "/posts/view/1" 200 0
|
19
|
+
127.0.0.1 - - [22/Jul/2012:12:14:59 -0400] "/users/login" 200 0
|
20
|
+
127.0.0.1 - - [22/Jul/2012:12:14:59 -0400] "/" 200 0
|
21
|
+
127.0.0.1 - - [22/Jul/2012:12:15:00 -0400] "/users/list" 200 0
|
22
|
+
127.0.0.1 - - [22/Jul/2012:12:15:00 -0400] "/users/login" 200 0
|
23
|
+
127.0.0.1 - - [22/Jul/2012:12:15:01 -0400] "/users/list" 200 0
|
24
|
+
127.0.0.1 - - [22/Jul/2012:12:15:02 -0400] "/" 200 0
|
25
|
+
127.0.0.1 - - [22/Jul/2012:12:15:03 -0400] "/users/login" 200 0
|
26
|
+
127.0.0.1 - - [22/Jul/2012:12:15:04 -0400] "/users/list" 200 0
|
data/test/parser_test.rb
ADDED
@@ -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
|
data/test/test_helper.rb
ADDED
data/testit.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# This is a sample application that uses the Vizi_logger gem classes
|
2
|
+
#
|
3
|
+
# This application will create a log file with a set of simulated web log records
|
4
|
+
# You will need a web log analyzer (e.g., Analog) to confirm the readability of this file
|
5
|
+
#
|
6
|
+
# Author:: Al Kivi <al.kivi@vizitrax.com>
|
7
|
+
|
8
|
+
# require '~/appgems/vizi_logger/lib/vizi_logger.rb' # use this line for testing
|
9
|
+
|
10
|
+
require 'rubygems' # needed for ruby 1.8.7
|
11
|
+
require 'vizi_logger'
|
12
|
+
|
13
|
+
# weblog = Vizi::PageLogger.new(STDOUT)
|
14
|
+
|
15
|
+
weblog = Vizi::PageLogger.new('./log/vizidemo.log',shift_age = 'weekly')
|
16
|
+
|
17
|
+
weblog.addremote '127.0.0.1' # for batch testing
|
18
|
+
# weblog.addremote request.remote_addr # use this in live mode
|
19
|
+
|
20
|
+
weblog.formatter=Vizi::LogFormatter.new
|
21
|
+
|
22
|
+
urlist = ["/","/users/login","/users/list","/posts","/posts/view/1"]
|
23
|
+
|
24
|
+
25.times do
|
25
|
+
sleep rand*2 # create random interval
|
26
|
+
page_url = urlist[(5*rand).to_i] # select a random page url
|
27
|
+
weblog.page page_url
|
28
|
+
end
|
29
|
+
|
30
|
+
#weblog.page
|
data/testit_old.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# This is a sample application that uses the Vizi_whois gem classes
|
2
|
+
#
|
3
|
+
# This application will read a text file with IP addresses.
|
4
|
+
# For each IP address, the whois method will be called and responses received.
|
5
|
+
#
|
6
|
+
# Author:: Al Kivi <al.kivi@vizitrax.com>
|
7
|
+
|
8
|
+
#require 'c:\rails\vizi_whois\lib\vizi_whois'
|
9
|
+
require 'rubygems' # needed for ruby 1.8.7
|
10
|
+
require 'vizi_whois'
|
11
|
+
|
12
|
+
require 'logger'
|
13
|
+
require 'socket'
|
14
|
+
require 'yaml'
|
15
|
+
|
16
|
+
syslog = Logger.new('./log/system.log',shift_age = 'weekly')
|
17
|
+
syslog.info "Starting IP address test file ... >>> "+Time.now.to_s
|
18
|
+
|
19
|
+
out_file = File.new('./log/output.log', 'w')
|
20
|
+
|
21
|
+
File.delete('./log/formatted.log') if File.exist?('./log/formatted.log')
|
22
|
+
parse_file = File.new('./log/formatted.log', 'w')
|
23
|
+
|
24
|
+
p 'starting'
|
25
|
+
|
26
|
+
# Open test file for reading
|
27
|
+
File.open('./data/testfile.txt', 'r') do |file|
|
28
|
+
rec_count = 0
|
29
|
+
while(line = file.gets) # Read each line of the test file, one IP address per line
|
30
|
+
p line
|
31
|
+
@whoisresult = Vizi::Gowhois.new
|
32
|
+
p line.chomp
|
33
|
+
rarray = @whoisresult.query(line.chomp)
|
34
|
+
@contents = rarray[0]
|
35
|
+
out_file.puts '----------------------------------------------------------------'
|
36
|
+
out_file.puts '> ' + line
|
37
|
+
out_file.puts '>> ' + rarray[1]
|
38
|
+
out_file.puts '>>> ' + rarray[2]
|
39
|
+
out_file.puts '----------------------------------------------------------------'
|
40
|
+
out_file.puts @contents
|
41
|
+
@result = Vizi::Formatter.new
|
42
|
+
@formatted = @result.parse(@contents, rarray[1])
|
43
|
+
@formatted = @formatted.gsub('\n','<br/>')
|
44
|
+
p @formatted
|
45
|
+
rec_count = rec_count + 1
|
46
|
+
end
|
47
|
+
syslog.info "Record count is "+rec_count.to_s
|
48
|
+
syslog.info "Ending ... >>> "+Time.now.to_s
|
49
|
+
end
|
data/vizi_logger.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
spec = Gem::Specification.new do |s|
|
4
|
+
s.name = 'vizi_logger'
|
5
|
+
s.version = '0.1.0'
|
6
|
+
s.summary = "Ruby based logger that will record web page visits in the common log format"
|
7
|
+
s.description = "This gem module provides a logger class and a log formatter class that will create
|
8
|
+
a log file in a common log format.
|
9
|
+
|
10
|
+
A ruby based application can generate a log file record with each page visit. This capability provides
|
11
|
+
logging that can be highly customized by the ruby developer. A web log analyzer will be needed to
|
12
|
+
summarize and analyze the web log records"
|
13
|
+
s.files = Dir.glob("**/**/**")
|
14
|
+
s.test_files = Dir.glob("test/*_test.rb")
|
15
|
+
s.author = "Al Kivi"
|
16
|
+
s.homepage = "http://www.vizitrax.com"
|
17
|
+
s.email = "al.kivi@yahoo.com"
|
18
|
+
s.has_rdoc = true
|
19
|
+
s.required_ruby_version = '>= 1.8.7'
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vizi_logger
|
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: 2012-07-22 00:00:00 Z
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: |-
|
22
|
+
This gem module provides a logger class and a log formatter class that will create
|
23
|
+
a log file in a common log format.
|
24
|
+
|
25
|
+
A ruby based application can generate a log file record with each page visit. This capability provides
|
26
|
+
logging that can be highly customized by the ruby developer. A web log analyzer will be needed to
|
27
|
+
summarize and analyze the web log records
|
28
|
+
email: al.kivi@yahoo.com
|
29
|
+
executables: []
|
30
|
+
|
31
|
+
extensions: []
|
32
|
+
|
33
|
+
extra_rdoc_files: []
|
34
|
+
|
35
|
+
files:
|
36
|
+
- log/vizidemo.log
|
37
|
+
- log/apache.log
|
38
|
+
- testit.rb
|
39
|
+
- test/test_helper.rb
|
40
|
+
- test/parser_test.rb
|
41
|
+
- build_gem.sh
|
42
|
+
- Rakefile
|
43
|
+
- build_gem3.sh
|
44
|
+
- geany_run_script.bat
|
45
|
+
- build_gem1.sh
|
46
|
+
- testit_old.rb
|
47
|
+
- build_gem2.sh
|
48
|
+
- vizi_logger.gemspec
|
49
|
+
- lib/vizi/geany_run_script.bat
|
50
|
+
- lib/vizi/vizi_logger.rb
|
51
|
+
- lib/vizi_logger.rb
|
52
|
+
- README.rdoc
|
53
|
+
- vizi_logger-0.1.0.gem
|
54
|
+
homepage: http://www.vizitrax.com
|
55
|
+
licenses: []
|
56
|
+
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
hash: 57
|
68
|
+
segments:
|
69
|
+
- 1
|
70
|
+
- 8
|
71
|
+
- 7
|
72
|
+
version: 1.8.7
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
hash: 3
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
version: "0"
|
82
|
+
requirements: []
|
83
|
+
|
84
|
+
rubyforge_project:
|
85
|
+
rubygems_version: 1.8.24
|
86
|
+
signing_key:
|
87
|
+
specification_version: 3
|
88
|
+
summary: Ruby based logger that will record web page visits in the common log format
|
89
|
+
test_files:
|
90
|
+
- test/parser_test.rb
|