私のアプリケーションは、JSON 形式でログを生成します。ログは次のようになります。
{"LogLevel":"error","Datetime":"2013-06-21T11:20:17Z","Module":"DB","Method":"ExecuteSelect","Request":"WS_VALIDATE","Error":"Procedure or function 'WS_VALIDATE' expects parameter '@LOGIN_ID', which was not supplied."}
現在、前述のログ行をそのまま mongoDB にプッシュしています。ただし、mongoDB は Datetime を文字列として格納します (これは予想されることです)。これらのログでデータ処理ジョブを実行したいので、Datetime を mongoDB のネイティブ ISODate データ型として保存することをお勧めします。
これを行うために私が考えることができる3つの方法があります:
i) すべての JSON ログ行を解析し、アプリケーション コードで文字列を ISODate 型に変換してから挿入します。短所:mongoDBにプッシュする前に、すべての行を解析する必要があります。これには少し費用がかかります
ii) 挿入のたびにクエリを実行して、最後に挿入されたドキュメントの文字列の日付時刻を ISODate に変換します。
element.Datetime = ISODate(element.Datetime);
短所 : 挿入ごとに 1 つの余分なクエリを実行するため、やはり費用がかかります iii) 生成時点でログを変更して、アプリケーション コード レベルで解析を行う必要がないようにするか、挿入ごとに更新クエリを実行する必要がないようにします
また、興味深いことに、日時文字列をネイティブの isodate 形式に自動変換するように mongoDB を構成する方法はありますか?
ティア
編集:jsonログを挿入するためにpymongoを使用しています
私のファイルは次のようになります。
{"LogLevel":"error","Datetime":"2013-06-21T11:20:17Z","Module":"DB","Method":"ExecuteSelect","Request":"WS_VALIDATE","エラー":"プロシージャまたは関数 'WS_VALIDATE' には、指定されていないパラメーター '@LOGIN_ID' が必要です。"}
上記のような行が何百もあります。そして、これは私がそれらをmongodbに挿入する方法です:
for line in logfile:
collection.insert(json.loads(line))
以下は私の問題を解決します:
for line in logfile:
data = json.loads(line)
data["Datetime"] = datetime.strptime(data["Datetime"], "%Y-%M-%DTHH:mmZ")
collection.insert(data)
私がやりたいことは、上でやらなければならない日時の余分な操作を取り除くことです。これで問題が解決することを願っています。