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



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

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

#events(stream = nil) ⇒ Object



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

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



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

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



41
42
43
44
45
# File 'lib/stax/mixin/logs.rb', line 41

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



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/stax/mixin/logs.rb', line 50

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



95
96
97
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
# File 'lib/stax/mixin/logs.rb', line 95

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