エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Amazon CloudWatch Logs からログを取得する gem を書いた

AWS に CloudWatch Logs というサービスがあります。

コンソールが用意されていますが、正直使いやすくありません。

awslogs という、CloudWatch Logs からログを取得するコマンドラインツールがあり使っていたいのですが、だんだんと不満な点が出てきました。

そんなわけなので

CloudWatch Logs からログを取得する gem を書きました。

実体は aws-sdk gem に薄い層を被せたものです。

使う

ここでの例は Thor gem を使ってコマンドにしたものです。

Gemfile

source 'https://rubygems.org'

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'aws_cloudwatch_logs', github: 'mattsan/aws_cloudwatch_logs'
gem 'thor'

command

#!/usr/bin/env ruby

require 'thor'
require 'time'
require 'aws_cloudwatch_logs'

class Logs < Thor
  default_command :logs

  desc :logs, 'get logs'
  option :start, aliases: '-s', type: :string, desc: 'start time'
  option :end, aliases: '-e', type: :string, desc: 'end time'
  option :group, aliases: '-g', type: :string, desc: 'log group'
  option :filter, aliases: '-f', type: :string, desc: 'filter pattern'
  def logs
    start_time = Time.parse(options[:start])
    end_time = Time.parse(options[:end])
    log_group = options[:group]
    filter_pattern = options[:filter]

    AwsCloudwatchLogs.extract(log_group, start_time, end_time, filter_pattern) do |event|
      time_string = event.timestamp.strftime('%Y-%m-%dT%H:%M:%S%Z')
      puts "#{time_string} #{event.message}"
    end
  end
end

Logs.start

logs というファイル名で保存して実行できるようにします。

$ chmod +x logs

実行

$ bundle exec logs -g foo-bar-baz -s '2017/11/01 00:00' -e '2017/11/01 12:00'

このように aws-sdk を使うときのメンドクサイ部分を隠しただけのものですがメンドクサイ部分を繰り返す必要がないだけ楽になります。

そんな感じで。