server_log_parser 0.3.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 174e076ac740e1a63f57d94615a20cddda8bcfe9
4
+ data.tar.gz: d909fc0142439bcb563bca4162f8a7f872fb6cbd
5
+ SHA512:
6
+ metadata.gz: 5336fafef49466bce811718e31d332588076084f949cecec63ea8c633a85476a7e8027c1f8ae9a6e90bb99ff47698c4ea11bc5c90bb7caa46497ef492946bbdc
7
+ data.tar.gz: 8defc3398fe35189011fc6975c11ac8cddec1801cd69a7ce259ff7dc3ba88fcfbf545b167bb9bfe7ac906f8ee05cc774cb6e81ee3adec4fd85626503d905a631
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ .DS_Store
2
+ .idea
3
+ pkg
4
+ vendor/bundle
5
+ .bundle
6
+ tmp
7
+ *.lock
8
+ *.tmp
9
+ *.gem
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## 0.3.0 (2016-02-16)
4
+
5
+ Initial version
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in server_log_parser.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,24 @@
1
+ Copyright (c) 2008, 2009 Simone Carletti <weppos@weppos.net>
2
+ Copyright (c) 2013 Nick Charlton
3
+ Copyright (c) 2016 Alexander Kurakin <kuraga333@mail.ru
4
+
5
+ MIT License
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ "Software"), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be
16
+ included in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # ServerLogParser
2
+
3
+ ServerLogParser provides a high-level Ruby library for parsing apache server log files
4
+ (common log format, with or without virtual hosts and combined log format) as used
5
+ by Apache, Nginx and others.
6
+
7
+ It's a fork of [ApacheLogRegex](https://github.com/weppos/apachelogregex),
8
+ which was in turn a port of [Apache::LogRegex 1.4 Perl module](http://search.cpan.org/~akira/Apache-ParseLog-1.02/ParseLog.pm).
9
+ where much of the regex parts come from.
10
+
11
+ ## Installation
12
+
13
+ ```sh
14
+ gem install server_log_parser
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ### Initialization
20
+
21
+ ```ruby
22
+ require 'server_log_parser'
23
+
24
+ parser = ServerLogParser::Parser(ServerLogParser::COMBINED_VIRTUAL_HOST)
25
+ # or:
26
+ # parser = ServerLogParser::Parser.new('%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"')
27
+ ```
28
+
29
+ ### Parsing
30
+
31
+ ```ruby
32
+ File.foreach('/var/log/apache/access.log') do |line|
33
+ parsed = parser.parse(line)
34
+ # {
35
+ # '%h' => '212.74.15.68',
36
+ # '%l' => '-',
37
+ # '%u' => '-',
38
+ # '%t' => '[23/Jan/2004:11:36:20 +0000]',
39
+ # '%r' => 'GET /images/previous.png HTTP/1.1',
40
+ # '%>s' => '200',
41
+ # '%b' => '2607',
42
+ # '%{Referer}i' => 'http://peterhi.dyndns.org/bandwidth/index.html',
43
+ # '%{User-Agent}i' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202'
44
+ # }
45
+ end
46
+ ```
47
+
48
+ `ServerLogParser#parse` will silently ignore errors, but if you'd prefer,
49
+ `ServerLogParser#parse!` will raise a `ParseError` exception.
50
+
51
+ Apache log files use "-" to mean no data is present and these are replaced with nil,
52
+ like the "identity" and "user" values above. Request is split into a nested hash.
53
+
54
+ ### Log Formats
55
+
56
+ The log format is specified using a rather verbose constant, which map out like:
57
+
58
+ Name | Constant | Apache Format
59
+ ------------------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------
60
+ Common Log Format | `ServerLogParser::COMMON_LOG_FORMAT` | `%h %l %u %t \"%r\" %>s %b`
61
+ Common Log Format with virtual hosts | `ServerLogParser::COMMON_LOG_FORMAT_VIRTUAL_HOST` | `%v %h %l %u %t \"%r\" %>s %b`
62
+ Combined | `ServerLogParser::COMBINED` | `%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"`
63
+ Combined with virtual hosts | `ServerLogParser::COMBINDED_VIRTUAL_HOST` | `%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"`
64
+
65
+
66
+ ## Author
67
+
68
+ Alexander Kurakin <<kuraga333@mail.ru>>
69
+
70
+ ## Feedback and contribute
71
+
72
+ <https://github.com/kuraga/server_log_parser/issues>
73
+
74
+ ## License
75
+
76
+ MIT
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "rake/testtask"
2
+ Rake::TestTask.new do |t|
3
+ t.libs << "test"
4
+ t.test_files = FileList['test/*_test.rb']
5
+ t.verbose = true
6
+ end
7
+
8
+ require "bundler/gem_tasks"
9
+
10
+ task :default => [:test]
@@ -0,0 +1,93 @@
1
+ module ServerLogParser
2
+
3
+ class Parser
4
+
5
+ # Regexp instance used for parsing a log line.
6
+ attr_reader :regexp
7
+
8
+ # The list of field names that extracted from log format.
9
+ attr_reader :names
10
+
11
+
12
+ # Initializes a new parser instance with given log <tt>format</tt>.
13
+ def initialize(format)
14
+ @regexp = nil
15
+ @names = []
16
+ @format = parse_format(format)
17
+ end
18
+
19
+ # Parses <tt>line</tt> according to current log <tt>format</tt>
20
+ # and returns an hash of log field => value on success.
21
+ # Returns <tt>nil</tt> if <tt>line</tt> doesn't match current log <tt>format</tt>.
22
+ def parse(line)
23
+ row = line.to_s
24
+ row.chomp!
25
+ row.strip!
26
+ return unless match = regexp.match(row)
27
+
28
+ data = {}
29
+ names.each_with_index { |field, index| data[field] = match[index + 1] } # [0] == line
30
+ data
31
+ end
32
+
33
+ # Same as <tt>ServerLogParser#parse</tt> but raises a <tt>ParseError</tt>
34
+ # if <tt>line</tt> doesn't match current <tt>format</tt>.
35
+ #
36
+ # ==== Raises
37
+ #
38
+ # ParseError:: if <tt>line</tt> doesn't match current <tt>format</tt>
39
+ #
40
+ def parse!(line)
41
+ parse(line) || raise(ParseError, "Invalid format `%s` for line `%s`" % [@format, line])
42
+ end
43
+
44
+
45
+ protected
46
+
47
+ # Overwrite this method if you want to use some human-readable name for log fields.
48
+ # This method is called only once at <tt>parse_format</tt> time.
49
+ def rename_this_name(name)
50
+ name
51
+ end
52
+
53
+ # Parse log <tt>format</tt> into a suitable Regexp instance.
54
+ def parse_format(format)
55
+ format = format.to_s
56
+ format.chomp! # remove carriage return
57
+ format.strip! # remove leading and trailing space
58
+ format.gsub!(/[ \t]+/, ' ') # replace tabulations or spaces with a space
59
+
60
+ strip_quotes = proc { |string| string.gsub(/^\\"/, '').gsub(/\\"$/, '') }
61
+ find_quotes = proc { |string| string =~ /^\\"/ }
62
+ find_percent = proc { |string| string =~ /^%.*t$/ }
63
+ find_referrer_or_useragent = proc { |string| string =~ /Referer|User-Agent/ }
64
+
65
+ pattern = format.split(' ').map do |element|
66
+ has_quotes = !!find_quotes.call(element)
67
+ element = strip_quotes.call(element) if has_quotes
68
+
69
+ self.names << rename_this_name(element)
70
+
71
+ case
72
+ when has_quotes
73
+ if element == '%r' or find_referrer_or_useragent.call(element)
74
+ /"([^"\\]*(?:\\.[^"\\]*)*)"/
75
+ else
76
+ '\"([^\"]*)\"'
77
+ end
78
+ when find_percent.call(element)
79
+ '(\[[^\]]+\])'
80
+ when element == '%U'
81
+ '(.+?)'
82
+ else
83
+ '(\S*)'
84
+ end
85
+ end.join(' ')
86
+
87
+ @regexp = Regexp.new("^#{pattern}$")
88
+ format
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -0,0 +1,5 @@
1
+ module ServerLogParser
2
+
3
+ VERSION = "0.3.0"
4
+
5
+ end
@@ -0,0 +1,18 @@
1
+ module ServerLogParser
2
+
3
+ COMMON_LOG_FORMAT = '%h %l %u %t \"%r\" %>s %b'
4
+ COMMON_LOG_FORMAT_VIRTUAL_HOST = '%v %h %l %u %t \"%r\" %>s %b'
5
+ COMBINED = '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"'
6
+ COMBINED_VIRTUAL_HOST = '%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"'
7
+
8
+ #
9
+ # = ParseError
10
+ #
11
+ # Raised in case the parser can't parse a log line with current +format+.
12
+ #
13
+ class ParseError < RuntimeError; end
14
+
15
+ end
16
+
17
+ require 'server_log_parser/version'
18
+ require 'server_log_parser/parser'
@@ -0,0 +1,20 @@
1
+ require File.expand_path("../lib/server_log_parser/version", __FILE__)
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "server_log_parser"
5
+ spec.version = ServerLogParser::VERSION
6
+ spec.authors = ["Alexander Kurakin"]
7
+ spec.email = ["kuraga333@mail.ru"]
8
+ spec.summary = %q{Ruby library to parse server server log files using regular expressions.}
9
+ spec.description = %q{ServerLogParser provides a high-level Ruby library for parsing server server log files (common log format, with or without virtual hosts and combined log format) as used by Server, Nginx and others.}
10
+ spec.homepage = "https://github.com/kuraga/server_log_parser"
11
+ spec.license = "MIT"
12
+
13
+ spec.files = `git ls-files`.split($/)
14
+ spec.test_files = spec.files.grep(%r{^test/})
15
+ spec.require_paths = ["lib"]
16
+
17
+ spec.add_development_dependency "bundler", "~> 1.10"
18
+ spec.add_development_dependency "rake", "~> 10.5"
19
+ spec.add_development_dependency "minitest", "~> 5.8"
20
+ end
@@ -0,0 +1 @@
1
+ 4.224.234.46 - - [20/Jul/2004:13:18:55 -0700] "GET /core/listing/pl_boat_detail.jsp?&units=Feet&checked_boats=1176818&slim=broker&&hosturl=giffordmarine&&ywo=giffordmarine& HTTP/1.1" 200 2888 "http://search.yahoo.com/bin/search?p=\"grady%20white%20306%20bimini\"" "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; YPC 3.0.3; yplus 4.0.00d)"
@@ -0,0 +1 @@
1
+ 212.74.15.68 - - [23/Jan/2004:11:36:20 +0000] "GET /images/previous.png=\" HTTP/1.1" 200 2607 "http://peterhi.dyndns.org/bandwidth/index.html" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202"
@@ -0,0 +1 @@
1
+ 212.74.15.68 - - [23/Jan/2004:11:36:20 +0000] "GET /images/previous.png HTTP/1.1" 200 2607 "http://peterhi.dyndns.org/bandwidth/index.html" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202"
@@ -0,0 +1,5 @@
1
+ 87.18.183.252 - - [13/Aug/2008:00:50:49 -0700] "GET /blog/index.xml HTTP/1.1" 302 527 "-" "Feedreader 3.13 (Powered by Newsbrain)"
2
+ 79.28.16.191 - - [13/Aug/2008:00:50:55 -0700] "GET /blog/public/2008/08/gmail-offline-dati-a-rischio/gmaildown.png HTTP/1.1" 304 283 "-" "FeedDemon/2.7 (http://www.newsgator.com/; Microsoft Windows XP)"
3
+ 79.28.16.191 - - [13/Aug/2008:00:50:55 -0700] "GET /blog/public/2008/08/nuovo-microsoft-webmaster-center/overview.png HTTP/1.1" 304 283 "-" "FeedDemon/2.7 (http://www.newsgator.com/; Microsoft Windows XP)"
4
+ 69.150.40.169 - - [13/Aug/2008:00:51:06 -0700] "POST http://www.simonecarletti.com/mt4/mt-ttb.cgi/563 HTTP/1.1" 404 610 "-" "-"
5
+ 217.220.110.75 - - [13/Aug/2008:00:51:02 -0700] "GET /blog/2007/05/microsoft-outlook-pst.php HTTP/1.1" 200 82331 "http://www.google.it/search?hl=it&q=outlook+pst+file+4+GB&meta=" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
@@ -0,0 +1,109 @@
1
+ require 'test_helper'
2
+
3
+ describe ServerLogParser::Parser do
4
+
5
+ describe "regular expression" do
6
+
7
+ it "should be correct" do
8
+ regexp = '(?-mix:^(\\S*) (\\S*) (\\S*) (\\[[^\\]]+\\]) (?-mix:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)") (\\S*) (\\S*) (?-mix:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)") (?-mix:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)")$)'
9
+
10
+ assert_equal(@parser.regexp.to_s, regexp)
11
+ end
12
+
13
+ end
14
+
15
+ before do
16
+ @format = '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"'
17
+ @parser = ServerLogParser::Parser.new(@format)
18
+ end
19
+
20
+ describe "#parse" do
21
+
22
+ it "should parse line" do
23
+ expected = { '%h' => '212.74.15.68',
24
+ '%l' => '-',
25
+ '%u' => '-',
26
+ '%t' => '[23/Jan/2004:11:36:20 +0000]',
27
+ '%r' => 'GET /images/previous.png HTTP/1.1',
28
+ '%>s' => '200',
29
+ '%b' => '2607',
30
+ '%{Referer}i' => 'http://peterhi.dyndns.org/bandwidth/index.html',
31
+ '%{User-Agent}i' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202' }
32
+ results = @parser.parse(read_testcase('line.log'))
33
+
34
+ assert_kind_of(Hash, results)
35
+ assert_match_expected_hash(expected, results)
36
+ end
37
+
38
+ it "should parse line with slash quote in request" do
39
+ expected = { '%h' => '212.74.15.68',
40
+ '%l' => '-',
41
+ '%u' => '-',
42
+ '%t' => '[23/Jan/2004:11:36:20 +0000]',
43
+ '%r' => 'GET /images/previous.png=\" HTTP/1.1',
44
+ '%>s' => '200',
45
+ '%b' => '2607',
46
+ '%{Referer}i' => 'http://peterhi.dyndns.org/bandwidth/index.html',
47
+ '%{User-Agent}i' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202' }
48
+ results = @parser.parse(read_testcase('line-with-slash-quote-in-request.log'))
49
+
50
+ assert_kind_of(Hash, results)
51
+ assert_match_expected_hash(expected, results)
52
+ end
53
+
54
+ it "should parse line with slash quote in referer" do
55
+ expected = { '%h' => '4.224.234.46',
56
+ '%l' => '-',
57
+ '%u' => '-',
58
+ '%t' => '[20/Jul/2004:13:18:55 -0700]',
59
+ '%r' => 'GET /core/listing/pl_boat_detail.jsp?&units=Feet&checked_boats=1176818&slim=broker&&hosturl=giffordmarine&&ywo=giffordmarine& HTTP/1.1',
60
+ '%>s' => '200',
61
+ '%b' => '2888',
62
+ '%{Referer}i' => 'http://search.yahoo.com/bin/search?p=\"grady%20white%20306%20bimini\"',
63
+ '%{User-Agent}i' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; YPC 3.0.3; yplus 4.0.00d)' }
64
+ results = @parser.parse(read_testcase('line-with-slash-quote-in-referer.log'))
65
+
66
+ assert_kind_of(Hash, results)
67
+ assert_match_expected_hash(expected, results)
68
+ end
69
+
70
+ it "return nil on invalid format" do
71
+ results = @parser.parse('foobar')
72
+
73
+ assert_nil(results)
74
+ end
75
+
76
+ end
77
+
78
+ describe "#parse!" do
79
+
80
+ it "should work" do
81
+ testcase = read_testcase('line.log')
82
+
83
+ expected = @parser.parse(testcase)
84
+ results = @parser.parse!(testcase)
85
+
86
+ assert_equal(expected, results)
87
+ end
88
+
89
+ it "should raise on invalid format" do
90
+ error = assert_raises(ServerLogParser::ParseError) { @parser.parse!('foobar') }
91
+ assert_match(/Invalid format/, error.message)
92
+ end
93
+
94
+ end
95
+
96
+
97
+ protected
98
+
99
+ def read_testcase(filename)
100
+ File.read("#{FIXTURES_PATH}/#{filename}")
101
+ end
102
+
103
+ def assert_match_expected_hash(expected, current)
104
+ expected.each do |key, value|
105
+ assert_equal(value, current[key], "Expected `#{key}` to match value `#{value}` but `#{current[:key]}`")
106
+ end
107
+ end
108
+
109
+ end
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+
3
+ describe ServerLogParser do
4
+
5
+ describe "constants" do
6
+
7
+ it "should be correct" do
8
+ assert_equal(ServerLogParser::COMMON_LOG_FORMAT, '%h %l %u %t \"%r\" %>s %b')
9
+ assert_equal(ServerLogParser::COMMON_LOG_FORMAT_VIRTUAL_HOST, '%v %h %l %u %t \"%r\" %>s %b')
10
+ assert_equal(ServerLogParser::COMBINED, '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"')
11
+ assert_equal(ServerLogParser::COMBINED_VIRTUAL_HOST, '%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"')
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,7 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+
3
+ FIXTURES_PATH = File.dirname(__FILE__) + '/fixtures'
4
+
5
+ require 'server_log_parser'
6
+
7
+ require 'minitest/autorun'
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: server_log_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Kurakin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.8'
55
+ description: ServerLogParser provides a high-level Ruby library for parsing server
56
+ server log files (common log format, with or without virtual hosts and combined
57
+ log format) as used by Server, Nginx and others.
58
+ email:
59
+ - kuraga333@mail.ru
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".gitignore"
65
+ - CHANGELOG.md
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - lib/server_log_parser.rb
71
+ - lib/server_log_parser/parser.rb
72
+ - lib/server_log_parser/version.rb
73
+ - server_log_parser.gemspec
74
+ - test/fixtures/line-with-slash-quote-in-referer.log
75
+ - test/fixtures/line-with-slash-quote-in-request.log
76
+ - test/fixtures/line.log
77
+ - test/fixtures/log.log
78
+ - test/parse_test.rb
79
+ - test/server_log_parser_test.rb
80
+ - test/test_helper.rb
81
+ homepage: https://github.com/kuraga/server_log_parser
82
+ licenses:
83
+ - MIT
84
+ metadata: {}
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.4.5.1
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Ruby library to parse server server log files using regular expressions.
105
+ test_files:
106
+ - test/fixtures/line-with-slash-quote-in-referer.log
107
+ - test/fixtures/line-with-slash-quote-in-request.log
108
+ - test/fixtures/line.log
109
+ - test/fixtures/log.log
110
+ - test/parse_test.rb
111
+ - test/server_log_parser_test.rb
112
+ - test/test_helper.rb