1

概念的な質問があります。s3からログをダウンロードし、そのデータの一部を解析してRailsアプリケーション内のデータベースに保存するコードを記述しようとしています。

これは厳密に内部的なものであるため、ログをダウンロードして解析するために必要なコードを備えたモデルしかありません。解析の主な方法はファイルを開き、データベースに保存したい特定のデータを解析して各行を繰り返します。

私の目標は、ファイル(複数のログが含まれている)のすべてのデータを要約して、データベースに保存することです。

私が把握するのに苦労しているのは、Rails内のデータベースにデータを保存する前に、どのようにデータを要約するのかということです。

たとえば、次のログがある場合:

ログ/アカウント/6100
ログ/アカウント/7250
ログ/アカウント/ 650
ログ/アカウント/5100

私の目標は、すべての行を繰り返し処理し、各アカウントIDの合計金額を保存することです。したがって、このため、アカウント6、150を合計として保存する必要があります。何らかの理由で、ファイルからログを要約して1つのデータベースエントリに変換するのではなく、1つのログに対して1つのデータベースエントリしか理解できません。

現在の解析プロセス:

   def self.create_from_log_file(file)
    s3log = File.open(file).each do |line|
    line_match = S3_LINE_REGEXP.match(line)# get the matchdata
    captures = Hash[ line_match.names.zip( line_match.captures ) ]# convert the matchdata to a hash key value pairs (both strings)
    validate_log_file(captures["timestamp"])# validate file is unique
    captures["http_status"] != 200 # figure out if API request was a http 200
    current_account = extract_account_id(captures["request_path"])# extract account id and find that account
    account_log = S3Log.new # instantiate a new S3Log instance
    account_log.account_id = Account.find_by_id(current_account) # assign the S3Log object its account id
    account_log.total_bytes = calculate_total_bytes_for_file(captures["bytes_sent"])# assign the log bytes to that accounts total for the file
    account_log.total_requests = calculate_total_requests_for_file(acount_log.account_id)# calculate total requests for that account on the file
    account_log.date = Date.parse(captures["timestamp"])
  end

  account_log.save!
end
4

1 に答える 1

0

いくつかの高レベルのポインター。まず、コードは長時間実行されるジョブである可能性があるため、 ResqueまたはSidekiqを使用してバックグラウンド ジョブとして実行する価値がある場合があります。

次に、作業を明確に定義された小さな関数に分割し、それらの小さな関数のテストを記述します。そうすれば、それらをより大きなピースに結合する自信が持てるようになります。つまり、機能分解を練習できます。または、オブジェクト指向の方法で、解析ロジックをカプセル化するモデルを作成します。別のモデルは関心のある行を表し、おそらく 3 番目のモデルは集計メソッドを実行できる行のコレクションを表します。

お役に立てれば。

于 2012-12-06T18:05:09.723 に答える