aws-logs 0.3.1 → 0.4.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 +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +1 -1
- data/lib/aws_logs/base.rb +10 -0
- data/lib/aws_logs/cli.rb +8 -0
- data/lib/aws_logs/command.rb +7 -0
- data/lib/aws_logs/help/tail.md +1 -1
- data/lib/aws_logs/since.rb +1 -0
- data/lib/aws_logs/streams.rb +24 -0
- data/lib/aws_logs/tail.rb +42 -25
- data/lib/aws_logs/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f80b63c48f228ee6420c2d97226ac8fe1fab65fe42b847b15bfe80fd3f72197a
|
4
|
+
data.tar.gz: de12e2063cb6e25ee6505fa48ffb8d6d695b0bfa33afc9c3334a4cc132d82c00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec6276ffea2146c914704fb1021a0b3b4cc9b595640ef83cf444ef5217dbdb672504084f12cc3773afdb9ddf02018579512286c8ae25eb7399bf437b60d26c5c
|
7
|
+
data.tar.gz: 8af7b076de6042316a374321278dadee5d27dea00fcf08d97f58b5c1578fa07dd151b2cbb65f074d5457903c2fcb8ea77f7aa3c01af2a0ffff02ac8e28178050
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,20 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [0.4.0] - 2022-01-07
|
7
|
+
- [#3](https://github.com/tongueroo/aws-logs/pull/3) streams cli command and data method
|
8
|
+
- fix activesupport require
|
9
|
+
- streams cli command and data method
|
10
|
+
|
11
|
+
## [0.3.4]
|
12
|
+
- set next_token for large filter_log_events responses
|
13
|
+
|
14
|
+
## [0.3.3]
|
15
|
+
- #2 add overlap to window to account for delayed logs received at the same time
|
16
|
+
|
17
|
+
## [0.3.2]
|
18
|
+
- #1 clean up end_loop_signal logic
|
19
|
+
|
6
20
|
## [0.3.1]
|
7
21
|
- fix --no-follow option
|
8
22
|
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# aws-logs
|
2
2
|
|
3
|
-
[](http://badge.fury.io/rb/aws-logs)
|
4
4
|
|
5
5
|
[](https://www.boltops.com)
|
6
6
|
|
data/lib/aws_logs/cli.rb
CHANGED
@@ -13,6 +13,14 @@ module AwsLogs
|
|
13
13
|
Tail.new(options.merge(log_group_name: log_group_name)).run
|
14
14
|
end
|
15
15
|
|
16
|
+
desc "streams LOG_GROUP", "Show the log group stream names. Limits on only one page of results."
|
17
|
+
long_desc Help.text(:streams)
|
18
|
+
option :descending, desc: "True by default if order-by is LastEventTime, false if order-by is LogStreamName"
|
19
|
+
option :order_by, default: "LastEventTime", desc: "accepts LogStreamName, LastEventTime"
|
20
|
+
def streams(log_group_name)
|
21
|
+
Streams.new(options.merge(log_group_name: log_group_name)).run
|
22
|
+
end
|
23
|
+
|
16
24
|
desc "completion *PARAMS", "Prints words for auto-completion."
|
17
25
|
long_desc Help.text(:completion)
|
18
26
|
def completion(*params)
|
data/lib/aws_logs/command.rb
CHANGED
@@ -77,6 +77,13 @@ module AwsLogs
|
|
77
77
|
def website
|
78
78
|
""
|
79
79
|
end
|
80
|
+
|
81
|
+
# https://github.com/erikhuda/thor/issues/244
|
82
|
+
# Deprecation warning: Thor exit with status 0 on errors. To keep this behavior, you must define `exit_on_failure?` in `Lono::CLI`
|
83
|
+
# You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
|
84
|
+
def exit_on_failure?
|
85
|
+
true
|
86
|
+
end
|
80
87
|
end
|
81
88
|
end
|
82
89
|
end
|
data/lib/aws_logs/help/tail.md
CHANGED
@@ -52,6 +52,6 @@ To match terms with spaces in it, you'll need quotes around it. Otherise, the ma
|
|
52
52
|
|
53
53
|
aws-logs tail /aws/codebuild/demo --filter-pattern '"Wed Nov 27 23"' --since 3h --no-follow
|
54
54
|
|
55
|
-
Here's an example of matching with an exclude
|
55
|
+
Here's an example of matching with an exclude pattern using the `-` (minus sign).
|
56
56
|
|
57
57
|
aws-logs tail /aws/codebuild/demo --filter-pattern '"ERROR" - "Exiting"' --since 3h --no-follow
|
data/lib/aws_logs/since.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
module AwsLogs
|
2
|
+
class Streams < Base
|
3
|
+
def run
|
4
|
+
resp = cloudwatchlogs.describe_log_streams(
|
5
|
+
log_group_name: @log_group_name,
|
6
|
+
descending: descending,
|
7
|
+
order_by: order_by,
|
8
|
+
)
|
9
|
+
names = resp.log_streams.map { |s| s.log_stream_name }
|
10
|
+
puts names
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
# True by default if order-by is LastEventTime, false if order-by is LogStreamName
|
15
|
+
def descending
|
16
|
+
return @options[:descending] unless @options[:descending].nil?
|
17
|
+
order_by == "LastEventTime"
|
18
|
+
end
|
19
|
+
|
20
|
+
def order_by
|
21
|
+
@options[:order_by] || "LastEventTime" # accepts LogStreamName, LastEventTime
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/aws_logs/tail.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
require "json"
|
2
2
|
|
3
3
|
module AwsLogs
|
4
|
-
class Tail
|
5
|
-
include AwsServices
|
6
|
-
|
4
|
+
class Tail < Base
|
7
5
|
def initialize(options={})
|
8
|
-
|
9
|
-
@log_group_name = options[:log_group_name]
|
6
|
+
super
|
10
7
|
# Setting to ensure matches default CLI option
|
11
8
|
@follow = @options[:follow].nil? ? true : @options[:follow]
|
12
9
|
|
@@ -16,6 +13,15 @@ module AwsLogs
|
|
16
13
|
set_trap
|
17
14
|
end
|
18
15
|
|
16
|
+
def data(since="1d")
|
17
|
+
since, now = Since.new(since).to_i, current_now
|
18
|
+
resp = filter_log_events(since, now)
|
19
|
+
resp.events
|
20
|
+
rescue Aws::CloudWatchLogs::Errors::ResourceNotFoundException => e
|
21
|
+
puts "WARN: #{e.class}: #{e.message}"
|
22
|
+
[]
|
23
|
+
end
|
24
|
+
|
19
25
|
def reset
|
20
26
|
@events = [] # constantly replaced with recent events
|
21
27
|
@last_shown_event_id = nil
|
@@ -35,13 +41,17 @@ module AwsLogs
|
|
35
41
|
return
|
36
42
|
end
|
37
43
|
|
44
|
+
# We overlap the sliding window because CloudWatch logs can receive or send the logs out of order.
|
45
|
+
# For example, a bunch of logs can all come in at the same second, but they haven't registered to CloudWatch logs
|
46
|
+
# yet. If we don't overlap the sliding window then we'll miss the logs that were delayed in registering.
|
47
|
+
overlap = 60*1000 # overlap the sliding window by a minute
|
38
48
|
since, now = initial_since, current_now
|
39
49
|
until end_loop?
|
40
50
|
refresh_events(since, now)
|
41
51
|
display
|
42
|
-
since, now = now, current_now
|
52
|
+
since, now = now-overlap, current_now
|
43
53
|
loop_count!
|
44
|
-
sleep 5 if @follow &&
|
54
|
+
sleep 5 if @follow && !ENV["AWS_LOGS_TEST"]
|
45
55
|
end
|
46
56
|
# Refresh and display a final time in case the end_loop gets interrupted by stop_follow!
|
47
57
|
refresh_events(since, now)
|
@@ -57,17 +67,7 @@ module AwsLogs
|
|
57
67
|
|
58
68
|
# TODO: can hit throttle limit if there are lots of pages
|
59
69
|
while next_token
|
60
|
-
|
61
|
-
log_group_name: @log_group_name, # required
|
62
|
-
start_time: start_time,
|
63
|
-
end_time: end_time,
|
64
|
-
# limit: 10,
|
65
|
-
}
|
66
|
-
options[:log_stream_names] = @options[:log_stream_names] if @options[:log_stream_names]
|
67
|
-
options[:log_stream_name_prefix] = @options[:log_stream_name_prefix] if @options[:log_stream_name_prefix]
|
68
|
-
options[:filter_pattern] = @options[:filter_pattern] if @options[:filter_pattern]
|
69
|
-
resp = cloudwatchlogs.filter_log_events(options)
|
70
|
-
|
70
|
+
resp = filter_log_events(start_time, end_time, next_token)
|
71
71
|
@events += resp.events
|
72
72
|
next_token = resp.next_token
|
73
73
|
end
|
@@ -75,7 +75,24 @@ module AwsLogs
|
|
75
75
|
@events
|
76
76
|
end
|
77
77
|
|
78
|
-
|
78
|
+
def filter_log_events(start_time, end_time, next_token=nil)
|
79
|
+
options = {
|
80
|
+
log_group_name: @log_group_name, # required
|
81
|
+
start_time: start_time,
|
82
|
+
end_time: end_time,
|
83
|
+
# limit: 1000,
|
84
|
+
# interleaved: true,
|
85
|
+
}
|
86
|
+
|
87
|
+
options[:log_stream_names] = @options[:log_stream_names] if @options[:log_stream_names]
|
88
|
+
options[:log_stream_name_prefix] = @options[:log_stream_name_prefix] if @options[:log_stream_name_prefix]
|
89
|
+
options[:filter_pattern] = @options[:filter_pattern] if @options[:filter_pattern]
|
90
|
+
options[:next_token] = next_token if next_token != :start && !next_token.nil?
|
91
|
+
|
92
|
+
cloudwatchlogs.filter_log_events(options)
|
93
|
+
end
|
94
|
+
|
95
|
+
# There can be duplicated events as events can be written to the exact same timestamp.
|
79
96
|
# So also track the last_shown_event_id and prevent duplicate log lines from re-appearing.
|
80
97
|
def display
|
81
98
|
new_events = @events
|
@@ -89,7 +106,7 @@ module AwsLogs
|
|
89
106
|
line = [time.to_s.color(:green), e.message]
|
90
107
|
format = @options[:format] || "detailed"
|
91
108
|
line.insert(1, e.log_stream_name.color(:purple)) if format == "detailed"
|
92
|
-
say line.join(' ')
|
109
|
+
say line.join(' ') unless @options[:silence]
|
93
110
|
end
|
94
111
|
@last_shown_event_id = @events.last&.event_id
|
95
112
|
check_follow_until!
|
@@ -100,9 +117,7 @@ module AwsLogs
|
|
100
117
|
return unless follow_until
|
101
118
|
|
102
119
|
messages = @events.map(&:message)
|
103
|
-
|
104
|
-
@@end_loop_signal = true
|
105
|
-
end
|
120
|
+
@@end_loop_signal = messages.detect { |m| m.include?(follow_until) }
|
106
121
|
end
|
107
122
|
|
108
123
|
def say(text)
|
@@ -113,15 +128,17 @@ module AwsLogs
|
|
113
128
|
@output.join("\n") + "\n"
|
114
129
|
end
|
115
130
|
|
116
|
-
@@end_loop_signal = false
|
117
131
|
def set_trap
|
118
132
|
Signal.trap("INT") {
|
119
133
|
puts "\nCtrl-C detected. Exiting..."
|
120
|
-
@@end_loop_signal = true # useful to control loop
|
121
134
|
exit # immediate exit
|
122
135
|
}
|
123
136
|
end
|
124
137
|
|
138
|
+
# The stop_follow! results in a little waiting because it signals to break the polling loop.
|
139
|
+
# Since it's in the middle of the loop process, the loop will finish the sleep 5 first.
|
140
|
+
# So it can pause from 0-5 seconds.
|
141
|
+
@@end_loop_signal = false
|
125
142
|
def self.stop_follow!
|
126
143
|
@@end_loop_signal = true
|
127
144
|
end
|
data/lib/aws_logs/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-logs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -186,6 +186,7 @@ files:
|
|
186
186
|
- lib/aws_logs.rb
|
187
187
|
- lib/aws_logs/autoloader.rb
|
188
188
|
- lib/aws_logs/aws_services.rb
|
189
|
+
- lib/aws_logs/base.rb
|
189
190
|
- lib/aws_logs/cli.rb
|
190
191
|
- lib/aws_logs/command.rb
|
191
192
|
- lib/aws_logs/completer.rb
|
@@ -196,6 +197,7 @@ files:
|
|
196
197
|
- lib/aws_logs/help/completion_script.md
|
197
198
|
- lib/aws_logs/help/tail.md
|
198
199
|
- lib/aws_logs/since.rb
|
200
|
+
- lib/aws_logs/streams.rb
|
199
201
|
- lib/aws_logs/tail.rb
|
200
202
|
- lib/aws_logs/version.rb
|
201
203
|
- spec/fixtures/typical/events-1.json
|
@@ -225,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
227
|
- !ruby/object:Gem::Version
|
226
228
|
version: '0'
|
227
229
|
requirements: []
|
228
|
-
rubygems_version: 3.
|
230
|
+
rubygems_version: 3.2.32
|
229
231
|
signing_key:
|
230
232
|
specification_version: 4
|
231
233
|
summary: Tail AWS CloudWatch Logs
|