papertrail 0.9.9 → 0.9.10
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +19 -0
- data/Rakefile +1 -1
- data/lib/papertrail/cli.rb +26 -5
- data/lib/papertrail/cli_add_group.rb +3 -0
- data/lib/papertrail/cli_add_system.rb +3 -0
- data/lib/papertrail/cli_helpers.rb +15 -5
- data/lib/papertrail/cli_join_group.rb +3 -0
- data/lib/papertrail/cli_remove_system.rb +3 -0
- data/lib/papertrail/connection.rb +34 -3
- data/lib/papertrail/http_client.rb +6 -2
- data/lib/papertrail.rb +1 -1
- data/papertrail.gemspec +2 -2
- metadata +39 -51
data/README.md
CHANGED
@@ -154,6 +154,25 @@ example, to search for `-whatever`, run:
|
|
154
154
|
|
155
155
|
papertrail -- -whatever
|
156
156
|
|
157
|
+
### Quoted phrases
|
158
|
+
|
159
|
+
Because the Unix shell parses and strips one set of quotes around a
|
160
|
+
phrase, to search for a phrase, wrap the string in both single-quotes
|
161
|
+
and double-quotes. For example:
|
162
|
+
|
163
|
+
papertrail -f '"Connection reset by peer"'
|
164
|
+
|
165
|
+
Use one set of double-quotes and one set of single-quotes. The order
|
166
|
+
does not matter as long as the pairs are consistent.
|
167
|
+
|
168
|
+
Note that many phrases are unique enough that searching for the
|
169
|
+
words yields the same results as searching for the quoted phrase. As a
|
170
|
+
result, quoting strings twice is often not actually necessary. For
|
171
|
+
example, these two searches are likely to yield the same log messages,
|
172
|
+
even though one is for 4 words (AND) while the other is for a phrase:
|
173
|
+
|
174
|
+
papertrail -f Connection reset by peer
|
175
|
+
papertrail -f '"Connection reset by peer"'
|
157
176
|
|
158
177
|
## Add/Remove Systems, Create Group, Join Group
|
159
178
|
|
data/Rakefile
CHANGED
data/lib/papertrail/cli.rb
CHANGED
@@ -20,6 +20,7 @@ module Papertrail
|
|
20
20
|
}
|
21
21
|
|
22
22
|
@query_options = {}
|
23
|
+
@query = nil
|
23
24
|
end
|
24
25
|
|
25
26
|
def run
|
@@ -50,6 +51,9 @@ module Papertrail
|
|
50
51
|
opts.on("-g", "--group GROUP", "Group to search") do |v|
|
51
52
|
options[:group] = v
|
52
53
|
end
|
54
|
+
opts.on("-S", "--search SEARCH", "Saved search to search") do |v|
|
55
|
+
options[:search] = v
|
56
|
+
end
|
53
57
|
opts.on("-j", "--json", "Output raw json data") do |v|
|
54
58
|
options[:json] = true
|
55
59
|
end
|
@@ -67,6 +71,10 @@ module Papertrail
|
|
67
71
|
configfile_options = load_configfile(options[:configfile])
|
68
72
|
options.merge!(configfile_options)
|
69
73
|
end
|
74
|
+
|
75
|
+
unless options[:token]
|
76
|
+
abort 'Authentication token not found. Set config file "token" attribute or PAPERTRAIL_API_TOKEN.'
|
77
|
+
end
|
70
78
|
|
71
79
|
@connection = Papertrail::Connection.new(options)
|
72
80
|
|
@@ -84,8 +92,20 @@ module Papertrail
|
|
84
92
|
end
|
85
93
|
end
|
86
94
|
|
95
|
+
if options[:search]
|
96
|
+
search = connection.find_search(options[:search], query_options[:group_id])
|
97
|
+
unless search
|
98
|
+
abort "Search \"#{options[:search]}\" not found"
|
99
|
+
end
|
100
|
+
|
101
|
+
query_options[:group_id] ||= search['group_id']
|
102
|
+
@query = search['query']
|
103
|
+
end
|
104
|
+
|
105
|
+
@query ||= ARGV[0]
|
106
|
+
|
87
107
|
if options[:follow]
|
88
|
-
search_query = connection.query(
|
108
|
+
search_query = connection.query(@query, query_options)
|
89
109
|
|
90
110
|
loop do
|
91
111
|
display_results(search_query.search)
|
@@ -95,7 +115,7 @@ module Papertrail
|
|
95
115
|
query_time_range
|
96
116
|
else
|
97
117
|
set_min_max_time!(options, query_options)
|
98
|
-
search_query = connection.query(
|
118
|
+
search_query = connection.query(@query, query_options)
|
99
119
|
display_results(search_query.search)
|
100
120
|
end
|
101
121
|
end
|
@@ -107,7 +127,7 @@ module Papertrail
|
|
107
127
|
max_time = parse_time(options[:max_time])
|
108
128
|
end
|
109
129
|
|
110
|
-
search_results = connection.query(
|
130
|
+
search_results = connection.query(@query, query_options.merge(:min_time => min_time.to_i, :tail => false)).search
|
111
131
|
|
112
132
|
loop do
|
113
133
|
search_results.events.each do |event|
|
@@ -133,7 +153,7 @@ module Papertrail
|
|
133
153
|
end
|
134
154
|
|
135
155
|
# Perform the next search
|
136
|
-
search_results = connection.query(
|
156
|
+
search_results = connection.query(@query, query_options.merge(:min_id => search_results.max_id, :tail => false)).search
|
137
157
|
end
|
138
158
|
end
|
139
159
|
|
@@ -154,7 +174,8 @@ module Papertrail
|
|
154
174
|
<<-EOF
|
155
175
|
|
156
176
|
Usage:
|
157
|
-
papertrail [-f] [-s system] [-g group] [-
|
177
|
+
papertrail [-f] [-s system] [-g group] [-S search] [-d seconds] \
|
178
|
+
[-c papertrail.yml] [-j] [--min-time time] [--max-time time] [query]
|
158
179
|
|
159
180
|
Examples:
|
160
181
|
papertrail -f
|
@@ -1,11 +1,14 @@
|
|
1
1
|
module Papertrail
|
2
2
|
module CliHelpers
|
3
3
|
def find_configfile
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
begin
|
5
|
+
if File.exists?(path = File.expand_path('.papertrail.yml'))
|
6
|
+
return path
|
7
|
+
end
|
8
|
+
if File.exists?(path = File.expand_path('~/.papertrail.yml'))
|
9
|
+
return path
|
10
|
+
end
|
11
|
+
rescue ArgumentError => e
|
9
12
|
end
|
10
13
|
end
|
11
14
|
|
@@ -32,5 +35,12 @@ module Papertrail
|
|
32
35
|
raise(ArgumentError, "Could not parse time string '#{tstring}'")
|
33
36
|
end
|
34
37
|
|
38
|
+
def output_http_error(e)
|
39
|
+
if e.response && e.response.body
|
40
|
+
puts "Error: #{e.response.body}\n\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
puts e
|
44
|
+
end
|
35
45
|
end
|
36
46
|
end
|
@@ -49,14 +49,45 @@ module Papertrail
|
|
49
49
|
find_id_for_item(response.body, name)
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
52
|
+
def find_search(name, group_id = nil)
|
53
|
+
response = @connection.get('searches.json')
|
54
|
+
|
55
|
+
candidates = find_items_by_name(response.body, name)
|
56
|
+
return nil if candidates.empty?
|
57
|
+
|
58
|
+
candidates.each do |item|
|
59
|
+
if !group_id || group_id == item['group_id']
|
60
|
+
return item
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
return candidates.first
|
65
|
+
end
|
66
|
+
|
67
|
+
def find_items_by_name(items, name_wanted)
|
68
|
+
results = []
|
69
|
+
|
53
70
|
items.each do |item|
|
54
|
-
|
71
|
+
results << item if item['name'] == name_wanted
|
55
72
|
end
|
56
73
|
|
57
74
|
items.each do |item|
|
58
|
-
|
75
|
+
results << item if item['name'] =~ /#{Regexp.escape(name_wanted)}/i
|
76
|
+
end
|
77
|
+
|
78
|
+
results
|
79
|
+
end
|
80
|
+
|
81
|
+
def find_item_by_name(items, name_wanted)
|
82
|
+
find_items_by_name(items, name_wanted).first
|
83
|
+
end
|
84
|
+
|
85
|
+
def find_id_for_item(items, name_wanted)
|
86
|
+
item = find_item_by_name(items, name_wanted)
|
87
|
+
if item
|
88
|
+
return item['id']
|
59
89
|
end
|
90
|
+
|
60
91
|
return nil
|
61
92
|
end
|
62
93
|
|
@@ -5,7 +5,7 @@ require 'papertrail/okjson'
|
|
5
5
|
|
6
6
|
module Papertrail
|
7
7
|
|
8
|
-
# Used because Net::HTTPOK in Ruby 1.8
|
8
|
+
# Used because Net::HTTPOK in Ruby 1.8 has no body= method
|
9
9
|
class HttpResponse < SimpleDelegator
|
10
10
|
|
11
11
|
def initialize(response)
|
@@ -13,7 +13,11 @@ module Papertrail
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def body
|
16
|
-
|
16
|
+
if __getobj__.body.respond_to?(:force_encoding)
|
17
|
+
@body ||= Papertrail::OkJson.decode(__getobj__.body.dup.force_encoding('UTF-8'))
|
18
|
+
else
|
19
|
+
@body ||= Papertrail::OkJson.decode(__getobj__.body.dup)
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
23
|
end
|
data/lib/papertrail.rb
CHANGED
data/papertrail.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'papertrail'
|
16
|
-
s.version = '0.9.
|
17
|
-
s.date = '2014-
|
16
|
+
s.version = '0.9.10'
|
17
|
+
s.date = '2014-06-05'
|
18
18
|
s.rubyforge_project = 'papertrail'
|
19
19
|
|
20
20
|
## Make sure your summary is short. The description may be as long
|
metadata
CHANGED
@@ -1,49 +1,45 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: papertrail
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.10
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 9
|
9
|
-
- 9
|
10
|
-
version: 0.9.9
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Papertrail
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
date: 2014-06-05 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: chronic
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
22
17
|
none: false
|
23
|
-
requirements:
|
24
|
-
- -
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
|
27
|
-
segments:
|
28
|
-
- 0
|
29
|
-
version: "0"
|
30
|
-
prerelease: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
31
22
|
type: :runtime
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
+
description: Command-line client for Papertrail hosted log management service. Tails
|
31
|
+
and searches app server logs and system syslog. Supports Boolean search and works
|
32
|
+
with grep and pipe output (Unix).
|
35
33
|
email: troy@sevenscale.com
|
36
|
-
executables:
|
34
|
+
executables:
|
37
35
|
- papertrail
|
38
36
|
- papertrail-add-system
|
39
37
|
- papertrail-remove-system
|
40
38
|
- papertrail-add-group
|
41
39
|
- papertrail-join-group
|
42
40
|
extensions: []
|
43
|
-
|
44
41
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
42
|
+
files:
|
47
43
|
- Gemfile
|
48
44
|
- LICENSE
|
49
45
|
- README.md
|
@@ -70,36 +66,28 @@ files:
|
|
70
66
|
- papertrail.gemspec
|
71
67
|
homepage: http://github.com/papertrail/papertrail-cli
|
72
68
|
licenses: []
|
73
|
-
|
74
69
|
post_install_message:
|
75
|
-
rdoc_options:
|
70
|
+
rdoc_options:
|
76
71
|
- --charset=UTF-8
|
77
|
-
require_paths:
|
72
|
+
require_paths:
|
78
73
|
- lib
|
79
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
75
|
none: false
|
81
|
-
requirements:
|
82
|
-
- -
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
|
85
|
-
|
86
|
-
- 0
|
87
|
-
version: "0"
|
88
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
81
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
94
|
-
segments:
|
95
|
-
- 0
|
96
|
-
version: "0"
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
97
86
|
requirements: []
|
98
|
-
|
99
87
|
rubyforge_project: papertrail
|
100
|
-
rubygems_version: 1.8.
|
88
|
+
rubygems_version: 1.8.29
|
101
89
|
signing_key:
|
102
90
|
specification_version: 2
|
103
91
|
summary: Command-line client for Papertrail hosted log management service.
|
104
92
|
test_files: []
|
105
|
-
|
93
|
+
has_rdoc:
|