Class: Stax::Cmd::Logs

Inherits:
SubCommand show all
Defined in:
lib/stax/mixin/logs.rb

Instance Method Summary collapse

Methods inherited from SubCommand

#info, stax_info, stax_info_tasks

Instance Method Details

#cleanupObject

lambdas create their own log groups, and when we delete stack they are left behind; this task looks up their names by stack prefix, and deletes them



168
# File 'lib/stax/mixin/logs.rb', line 168

desc 'cleanup', 'cleanup lambda log groups named for stack'

#events(stream = nil) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/stax/mixin/logs.rb', line 73

def events(stream = nil)
  trap('SIGINT', 'EXIT')    # clean exit with ctrl-c
  group  = ((g = options[:group]) ? log_groups[g] : log_groups.values.first).log_group_name
  stream ||= latest_stream(group).log_stream_name

  debug("Log stream #{group}/#{stream}")
  token = nil
  loop do
    resp = Aws::Logs.client.get_log_events(
      log_group_name: group,
      log_stream_name: stream,
      limit: options[:numlines],
      next_token: token,
    )
    resp.events.each do |e|
      puts("#{set_color(human_time(e.timestamp).utc, :green)}  #{e.message}")
    end
    token = resp.next_forward_token
    options[:follow] ? sleep(options[:sleep]) : break
  end
end

#filterObject



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/stax/mixin/logs.rb', line 139

def filter
  trap('SIGINT', 'EXIT')    # clean exit with ctrl-c
  group = ((g = options[:group]) ? log_groups[g] : log_groups.values.first).log_group_name
  debug("Log group #{group}")

  start_time = options[:start] ? Time.parse(options[:start]).to_i*1000 : nil
  end_time   = options[:end]   ? Time.parse(options[:end]).to_i*1000   : nil
  token = nil
  loop do
    resp = Aws::Logs.client.filter_log_events(
      log_group_name: group,
      log_stream_names: options[:streams],
      next_token: token,
      start_time: start_time,
      end_time: end_time,
      filter_pattern: options[:pattern],
    )
    resp.events.each do |e|
      time   = set_color(human_time(e.timestamp).utc, :green)
      stream = set_color(e.log_stream_name, :blue)
      puts("#{time}  #{stream}  #{e.message}")
    end
    token = resp.next_token
    break unless token
  end
end

#groupsObject



44
45
46
47
48
# File 'lib/stax/mixin/logs.rb', line 44

def groups
  print_table log_groups.map { |id, g|
    [id, g.log_group_name, g.retention_in_days, human_time(g.creation_time), human_bytes(g.stored_bytes)]
  }
end

#streamsObject



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/stax/mixin/logs.rb', line 53

def streams
  log_groups.each do |id, group|
    debug(group.log_group_name)
    streams = Aws::Logs.streams(
      log_group_name: group.log_group_name,
      order_by: options[:alpha] ? :LogStreamName : :LastEventTime,
      descending: !options[:alpha], # most recent first
      limit: options[:limit],
    )
    print_table streams.map { |s|
      [s.log_stream_name, human_time(s.last_event_timestamp), human_bytes(s.stored_bytes)]
    }
  end
end

#tailObject



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/stax/mixin/logs.rb', line 98

def tail
  trap('SIGINT', 'EXIT')    # clean exit with ctrl-c
  group  = ((g = options[:group]) ? log_groups[g] : log_groups.values.first).log_group_name

  debug("Log group #{group}")
  token = nil
  start_time = Time.now.to_i - 30 # start 30 sec ago

  loop do
    end_time = Time.now.to_i
    resp = Aws::Logs.client.filter_log_events(
      log_group_name: group,
      log_stream_names: options[:streams],
      start_time: start_time * 1000, # aws needs msec
      end_time: end_time * 1000,
      next_token: token,
      interleaved: true,
    )

    ## pretty-print the events
    resp.events.each do |e|
      puts("#{set_color(human_time(e.timestamp).utc, :green)}  #{set_color(e.log_stream_name, :blue)}  #{e.message}")
    end

    ## token means more data available from this request, so loop and get it right away
    token = resp.next_token

    ## no token, so sleep and start next request from end time of this one
    unless token
      start_time = end_time
      sleep 10
    end
  end
end