2

私のアプリケーションは、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)

私がやりたいことは、上でやらなければならない日時の余分な操作を取り除くことです。これで問題が解決することを願っています。

4

3 に答える 3

2

あなたはすでに答えを持っているように見えます...私は固執します:

for line in logfile:
    data = json.loads(line)
    data["Datetime"] = datetime.strptime(data["Datetime"], "%Y-%M-%DTHH:mmZ")
    collection.insert(data)

私も同様の問題を抱えていましたが、日時オブジェクトでどこを置き換える必要があるかを事前に知りませんでした。そこで、json 情報を次のように変更しました。

{"LogLevel":"error","Datetime":{"__timestamp__": "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."}

そして、jsonを次のように解析しました:

json.loads(data, object_hook=logHook)

「logHook」は次のように定義されています。

def logHook(d):
    if '__timestamp__' in d:
        return datetime.strptime(d['__timestamp__'], "%Y-%M-%DTHH:mmZ")
    return d

このlogHook関数を拡張して、他の多くの「変数」をelif、elifなどに置き換えることもできます。

お役に立てれば!

于 2013-11-12T01:56:10.537 に答える
1

また、興味深いことに、日時文字列をネイティブの isodate 形式に自動変換するように mongoDB を構成する方法はありますか?

タイムスタンプ用のPythondatetimeオブジェクトを作成し、PyMongo を使用して挿入することをお勧めします。これは、MongoDB のネイティブの日付オブジェクトとして内部に保存されます。

たとえば、Python では次のようになります。

from datetime import datetime
object_with_timestamp = { "timestamp": datetime.now() }
your_collection.insert(object_with_timestamp)

このオブジェクトが Mongo シェルから照会されると、ISODate オブジェクトが存在します。

"timestamp" : ISODate("2013-06-24T09:29:58.615Z")

于 2013-06-24T16:35:17.020 に答える