WIP

ログをembulkでbigqueryに投げるまでの一連の流れ

created at 2017.02.07
updated at 10ヶ月前 ago
vsanna / public DataAnalysis
  • embulkとは
    • ref: fluentdとの違い
    • 詳細は別記事
  • 流れ
    1. logを取得
      • (うちの場合だけど)rsyncでログファイルを取得
    2. csvにする
      • 適当なパーサーをかいた。後述。
      • このパーサーをembulk pluginにしてもいい
    3. 初めてのフォーマットであればguess
    4. embulkに放り込む
      • まずはpreview
      • runで本実行
    5. output pluginの力によりbig queryなどに放り込まれる
  • 要点
    • parserの準備
    • outptu pluginの選択
# 適当なparser

require 'csv'

class ToCsv
  attr_accessor :filename

  def initialize(filename)
    @filename = filename
  end

  def row_to_csv(row)
    # ActiveSupport::Logger < Loggerなるものがあって、そのデフォルトの出力がこちら。
    parsed = row.match(/\A([A-Z])*, \[([0-9T:.-]*) #([0-9]*)\] ([A-Z\s]*) -- : (.*)/)
    severity_id = parsed[1] # 重症度という意味らしい
    timestamp = parsed[2]
    pid = parsed[3]
    severity = parsed[4].gsub(/\s/, '')
    message = parsed[5]

    [severity_id, timestamp, pid, severity, message].map { |item| item.gsub(/,/, '-')}
  end

  def to_csv(output = 'stdout', output_filename)
    File.open(@filename) do |file|
      case output
      when 'stdout'
        file.each_line do |line|
          puts row_to_csv(line).join("\t")
        end
      when 'file'
        raise StandardError('出力先ファイル名が無いよ') if output_filename.nil?
        CSV.open(output_filename, 'wb') do |csv|
          file.each_line { |line| csv << row_to_csv(line) }
        end
      end
    end
  end
end

input_filename = ARGV[0]
output_mode = ARGV[1]
output_filename = ARGV[2]

transpiler = ToCsv.new(input_filename)
transpiler.to_csv(output_mode, output_filename)

shareシェアする

forumコメント

まだコメントはありません!
ログインしてコメントを残す
{{comment.user.name}} on {{commentCreatedAt()}}

content_copy前後のイシュー

{{message}}