Http_Error_Log 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/.gitignore +8 -0
- data/Gemfile +6 -0
- data/Http_Error_Log.gemspec +32 -0
- data/README.md +53 -0
- data/Rakefile +3 -0
- data/lib/Http_Error_Log.rb +64 -0
- data/lib/Http_Error_Log/version.rb +1 -0
- data/spec/Http_Error_Log.rb +63 -0
- data/spec/bin.rb +13 -0
- data/spec/file/empty.log +0 -0
- data/spec/file/nginx.error.log +4 -0
- data/spec/lib/main.rb +48 -0
- metadata +138 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
$:.push File.expand_path("../lib", __FILE__)
|
4
|
+
require "Http_Error_Log/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "Http_Error_Log"
|
8
|
+
s.version = Http_Error_Log_VERSION
|
9
|
+
s.authors = ["da99"]
|
10
|
+
s.email = ["i-hate-spam-45671204@mailinator.com"]
|
11
|
+
s.homepage = "https://github.com/da99/Http_Error_Log"
|
12
|
+
s.summary = %q{Parse error.log from servers.}
|
13
|
+
s.description = %q{
|
14
|
+
|
15
|
+
Turns your error.log from a server into a Ruby data structure.
|
16
|
+
Read me at the homepage.
|
17
|
+
|
18
|
+
}
|
19
|
+
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
|
25
|
+
s.add_development_dependency 'bacon'
|
26
|
+
s.add_development_dependency 'rake'
|
27
|
+
s.add_development_dependency 'Bacon_Colored'
|
28
|
+
s.add_development_dependency 'pry'
|
29
|
+
|
30
|
+
# Specify any dependencies here; for example:
|
31
|
+
s.add_runtime_dependency 'Split_Lines'
|
32
|
+
end
|
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
Http\_Error\_Log
|
3
|
+
================
|
4
|
+
|
5
|
+
A Ruby gem to turn an error log (eg Nginx error.log) into
|
6
|
+
Ruby data structures:
|
7
|
+
|
8
|
+
2012/01/01 01:01:01 [error] 11563#0: *183 connect() failed (111: Connection refused) while connecting to upstream, client: 11.11.11.11, server: test.test.com, request: "GET /stylesheets/en-us/, , .css?time=1286211794 HTTP/1.1", upstream: "http://127.0.0.1:4567/test/en-us/Test-Page.css?time=1234.5678", host: "www.test.com", referrer: "http://www.test.com/"
|
9
|
+
|
10
|
+
# ->
|
11
|
+
[ { :created_at=>Time, :upstreatm=>String, ...} ]
|
12
|
+
|
13
|
+
Installation
|
14
|
+
------------
|
15
|
+
|
16
|
+
gem install Http_Error_Log
|
17
|
+
|
18
|
+
Usage
|
19
|
+
------
|
20
|
+
|
21
|
+
require "Http_Error_Log"
|
22
|
+
|
23
|
+
Http_Error_Log "/my/nginx/error.log"
|
24
|
+
# --> [ Hash, Hash, Hash ]
|
25
|
+
|
26
|
+
Each Hash object has:
|
27
|
+
|
28
|
+
:line => 12 # Integer
|
29
|
+
:created_at => Time.parse(str) # Time object.
|
30
|
+
:backtrace => [ "file:num:[error] 11563#0"]
|
31
|
+
:message => "*183 connect() failed (111: Connection refused) while connecting to upstream"
|
32
|
+
|
33
|
+
Skip records using a date/time string:
|
34
|
+
|
35
|
+
Http_Error_Log "err.log", '2012/04/04 04:04:04'
|
36
|
+
|
37
|
+
# --> Skips records that are less OR equal to:
|
38
|
+
# '2012/04/04 04:04:04'
|
39
|
+
|
40
|
+
Run Tests
|
41
|
+
---------
|
42
|
+
|
43
|
+
git clone git@github.com:da99/Http_Error_Log.git
|
44
|
+
cd Http_Error_Log
|
45
|
+
bundle update
|
46
|
+
bundle exec bacon spec/lib/main.rb
|
47
|
+
|
48
|
+
"I hate writing."
|
49
|
+
-----------------------------
|
50
|
+
|
51
|
+
If you know of existing software that makes the above redundant,
|
52
|
+
please tell me. The last thing I want to do is maintain code.
|
53
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'Http_Error_Log/version'
|
2
|
+
require 'Split_Lines'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
def Http_Error_Log file, skip = nil
|
6
|
+
h = Http_Error_Log_Helper
|
7
|
+
|
8
|
+
lines = Split_Lines(File.read( file ))
|
9
|
+
lines
|
10
|
+
.map { |l|
|
11
|
+
|
12
|
+
pieces = l.split %r!,?\s+([\w\_\.\-]+):\s+!
|
13
|
+
|
14
|
+
prefix = pieces.shift
|
15
|
+
time_str = prefix.split[0,2].join(' ')
|
16
|
+
|
17
|
+
next if skip && Time.parse(time_str) <= Time.parse(skip)
|
18
|
+
|
19
|
+
pieces.each_index { |i|
|
20
|
+
if i.even?
|
21
|
+
pieces[i] = pieces[i].to_sym
|
22
|
+
end
|
23
|
+
}
|
24
|
+
|
25
|
+
final = Hash[ *pieces ]
|
26
|
+
final[:created_at], final[:error], final[:msg] = h.to_time(prefix)
|
27
|
+
|
28
|
+
final
|
29
|
+
|
30
|
+
}.compact
|
31
|
+
end # === def Http_Error_Log
|
32
|
+
|
33
|
+
class Http_Error_Log_Helper
|
34
|
+
|
35
|
+
class << self
|
36
|
+
|
37
|
+
def to_kv str
|
38
|
+
pieces = str.split(':')
|
39
|
+
k = pieces.shift
|
40
|
+
v = pieces.join(':')
|
41
|
+
[ k.strip.to_sym, v.strip ]
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Example input:
|
46
|
+
# "2012/05/08 04:08:19 [error] 11563#0: *183 connect() failed (111: Connection refused) while connecting to upstream"
|
47
|
+
#
|
48
|
+
# Output:
|
49
|
+
# [ Time, '[error] 1156#0', rest ]
|
50
|
+
#
|
51
|
+
def to_time str
|
52
|
+
pieces = str.split
|
53
|
+
date = pieces.shift
|
54
|
+
time = pieces.shift
|
55
|
+
|
56
|
+
err, msg = pieces.join(' ').split(':')
|
57
|
+
|
58
|
+
[ Time.parse("#{date} #{time}" ), err, msg]
|
59
|
+
end
|
60
|
+
|
61
|
+
end # === << self
|
62
|
+
|
63
|
+
|
64
|
+
end # === Http_Error_Log_Helper
|
@@ -0,0 +1 @@
|
|
1
|
+
Http_Error_Log_VERSION = "0.1.0"
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
describe "Http_Error_Log 'file'" do
|
3
|
+
|
4
|
+
it "turns file into an Array" do
|
5
|
+
NGINX_ERROR_LOG
|
6
|
+
.should.is_a Array
|
7
|
+
end
|
8
|
+
|
9
|
+
it "defines keys as symbols: client server request upstream host referrer created_at error msg" do
|
10
|
+
%w{
|
11
|
+
client server request upstream host referrer created_at error msg
|
12
|
+
}.each { |k|
|
13
|
+
NGINX_ERROR_LOG.first.should.has_key k.to_sym
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
it "sets key: :created_at" do
|
18
|
+
key_should_be :created_at, Time.parse('2012/01/01 01:01:01')
|
19
|
+
end
|
20
|
+
|
21
|
+
it "sets key: :client" do
|
22
|
+
key_should_be :client, '11.11.11.11'
|
23
|
+
end
|
24
|
+
|
25
|
+
it "sets key: :server" do
|
26
|
+
key_should_be :server, 'test.test.com'
|
27
|
+
end
|
28
|
+
|
29
|
+
it "sets key: :host" do
|
30
|
+
key_should_be :host, '"www.test.com"'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "sets key: :request" do
|
34
|
+
key_should_be :request, "GET /stylesheets/en-us/, , .css?time=1286211794 HTTP/1.1".inspect
|
35
|
+
end
|
36
|
+
|
37
|
+
it "sets key: :referrer" do
|
38
|
+
key_should_be :referrer, '"http://www.test.com/"'
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
it "sets key: upstream" do
|
43
|
+
key_should_be :upstream, "http://127.0.0.1:4567/test/en-us/Test-Page.css?time=1234.5678".inspect
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
it "returns an empty array if file is empty" do
|
48
|
+
EMPTY_LOG
|
49
|
+
.should == []
|
50
|
+
end
|
51
|
+
|
52
|
+
end # === Http_Error_Log 'file'
|
53
|
+
|
54
|
+
describe "Http_Error_Log :file, \"date time\"" do
|
55
|
+
|
56
|
+
it "skips all entries that come after a specified" do
|
57
|
+
target = NGINX_ERROR_LOG[1, NGINX_ERROR_LOG.size]
|
58
|
+
Http_Error_Log("spec/file/nginx.error.log", "2012/01/01 01:01:01 ")
|
59
|
+
.should == target
|
60
|
+
end
|
61
|
+
|
62
|
+
end # === Http_Error_Log :file, \"skip\"
|
63
|
+
|
data/spec/bin.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
bins = Dir.glob("bin/*")
|
3
|
+
|
4
|
+
unless bins.empty?
|
5
|
+
describe "permissions of bin/" do
|
6
|
+
bins.each { |file|
|
7
|
+
it "should chmod 755 for: #{file}" do
|
8
|
+
`stat -c %a #{file}`.strip
|
9
|
+
.should.be == "755"
|
10
|
+
end
|
11
|
+
}
|
12
|
+
end # === permissions of bin/
|
13
|
+
end # === unless bins.empty?
|
data/spec/file/empty.log
ADDED
File without changes
|
@@ -0,0 +1,4 @@
|
|
1
|
+
2012/01/01 01:01:01 [error] 11563#0: *183 connect() failed (111: Connection refused) while connecting to upstream, client: 11.11.11.11, server: test.test.com, request: "GET /stylesheets/en-us/, , .css?time=1286211794 HTTP/1.1", upstream: "http://127.0.0.1:4567/test/en-us/Test-Page.css?time=1234.5678", host: "www.test.com", referrer: "http://www.test.com/"
|
2
|
+
2012/02/02 02:02:02 [error] 11563#0: *183 connect() failed (111: Connection refused) while connecting to upstream, client: 22.22.22.22, server: test.test.com, request: "GET /stylesheets/en-us/+, .css?time=1286211794 HTTP/1.1", upstream: "http://127.0.0.1:4567/2/en-us/+, 2.css?time=2", host: "www.test.com", referrer: "http://www.test.com/"
|
3
|
+
2012/03/03 03:03:03 [error] 11563#0: *183 connect() failed (111: Connection refused) while connecting to upstream, client: 33.33.33.33, server: test.test.com, request: "GET /stylesheets/en-us/+, .css?time=1386311794 HTTP/1.1", upstream: "http://137.0.0.1:4567/3/en-us/+, 3.css?time=3", host: "www.test.com", referrer: "http://www.test.com/"
|
4
|
+
2012/04/04 04:04:04 [error] 11563#0: *183 connect() failed (111: Connection refused) while connecting to upstream, client: 44.44.44.44, server: test.test.com, request: "GET /stylesheets/en-us/+, .css?time=1486411794 HTTP/1.1", upstream: "http://147.0.0.1:4567/4/en-us/+, 4.css?time=4", host: "www.test.com", referrer: "http://www.test.com/"
|
data/spec/lib/main.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler'
|
4
|
+
begin
|
5
|
+
Bundler.setup(:default, :development)
|
6
|
+
rescue Bundler::BundlerError => e
|
7
|
+
$stderr.print e.message, "\n"
|
8
|
+
$stderr.print "Run `bundle install` to install missing gems\n"
|
9
|
+
exit e.status_code
|
10
|
+
end
|
11
|
+
require 'bacon'
|
12
|
+
|
13
|
+
Gem_Dir = File.expand_path( File.join(File.dirname(__FILE__) + '/../..') )
|
14
|
+
$LOAD_PATH.unshift Gem_Dir
|
15
|
+
$LOAD_PATH.unshift( Gem_Dir + "/lib" )
|
16
|
+
|
17
|
+
Bacon.summary_on_exit
|
18
|
+
|
19
|
+
require 'Http_Error_Log'
|
20
|
+
require 'Bacon_Colored'
|
21
|
+
require 'pry'
|
22
|
+
|
23
|
+
# ======== Custom code =============
|
24
|
+
#
|
25
|
+
|
26
|
+
NGINX_ERROR_LOG = Http_Error_Log("spec/file/nginx.error.log")
|
27
|
+
EMPTY_LOG = Http_Error_Log("spec/file/empty.log")
|
28
|
+
|
29
|
+
class Bacon::Context
|
30
|
+
def key_should_be k, v
|
31
|
+
NGINX_ERROR_LOG.first[k].should == v
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# ======== Include the tests.
|
36
|
+
target_files = ARGV[1, ARGV.size - 1].select { |a| File.file?(a) }
|
37
|
+
|
38
|
+
if target_files.empty?
|
39
|
+
|
40
|
+
# include all files
|
41
|
+
Dir.glob('./spec/*.rb').each { |file|
|
42
|
+
require file.sub('.rb', '') if File.file?(file)
|
43
|
+
}
|
44
|
+
|
45
|
+
else
|
46
|
+
# Do nothing. Bacon grabs the file.
|
47
|
+
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: Http_Error_Log
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- da99
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-08 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bacon
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: Bacon_Colored
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: Split_Lines
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
description: ! "\n\n Turns your error.log from a server into a Ruby data structure.\n
|
95
|
+
\ Read me at the homepage.\n \n "
|
96
|
+
email:
|
97
|
+
- i-hate-spam-45671204@mailinator.com
|
98
|
+
executables: []
|
99
|
+
extensions: []
|
100
|
+
extra_rdoc_files: []
|
101
|
+
files:
|
102
|
+
- .gitignore
|
103
|
+
- Gemfile
|
104
|
+
- Http_Error_Log.gemspec
|
105
|
+
- README.md
|
106
|
+
- Rakefile
|
107
|
+
- lib/Http_Error_Log.rb
|
108
|
+
- lib/Http_Error_Log/version.rb
|
109
|
+
- spec/Http_Error_Log.rb
|
110
|
+
- spec/bin.rb
|
111
|
+
- spec/file/empty.log
|
112
|
+
- spec/file/nginx.error.log
|
113
|
+
- spec/lib/main.rb
|
114
|
+
homepage: https://github.com/da99/Http_Error_Log
|
115
|
+
licenses: []
|
116
|
+
post_install_message:
|
117
|
+
rdoc_options: []
|
118
|
+
require_paths:
|
119
|
+
- lib
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
requirements: []
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 1.8.23
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: Parse error.log from servers.
|
138
|
+
test_files: []
|