0

私は Python を初めて使用し、毎日のログ ファイルをすべて調べてエラーをチェックするスクリプトを作成しようとしています。

ファイルを開き、ログ ファイルが最後に変更された時刻を出力し、ログ ファイル内のエラーを出力できます。

ただし、これらのログには、過去 3 年間の毎日の情報が含まれています。ログの最終更新日からのログのセクションのみを読み取れるようにしたい (過去 3 年間のすべてのエラーを取得する代わりに、最終日のエラーのみが必要です。)

これまでのスクリプトの内容は次のとおりです。

import sys, string, os, time

from stat import *

from datetime import datetime

now = datetime.now()

f3 = 'C:\Path\filename.txt'

seconds = os.path.getmtime(f3)
print "Last Date Ran: ", time.strftime('%m/%d/%Y %H:%M:%S' , time.localtime(seconds))

for line in open(f3 , 'r'):
    if 'error' in line:
        print ">>> " , line
    elif 'Error' in line:
        print ">>> " , line
    elif 'ERROR' in line:
        print ">>> " , line

これを行う方法はありますか?高低を検索しましたが、問題に対する答えが見つかりませんでした。助けてください。

4

5 に答える 5

1

短い答え、いいえ。より長い答えは、多くの無駄な解析を行うか、ファイルの外部で一部のデータを追跡する必要があるということです。ファイル全体をループして、ログ メッセージのタイムスタンプを解析し、特定の時間後にのみ出力することができます。ただし、3 年間のデータを含むファイルの場合は、スクリプトが最後に読み取った行を追跡し、ファイルを開いて毎日解析するたびにその行を探した方がよいでしょう。別の方法として、プロセスの関連部分にアクセスできる場合は、ロギング メカニズムを変更することもできます。スクリプトを実行するたびにフラッシュする 2 番目のファイルにメッセージを複製するか、基本的に 2 番目のファイルを介してログをバッファリングし、ログを履歴ファイルにアーカイブすることをスクリプトの責任にすることができます。

于 2013-02-04T14:48:08.690 に答える
0

スクリプトを最後に実行したときのエラーを取得したい場合は、ログ ファイルの最後の読み取り位置を別のファイルに格納してみて、次回ログ ファイルを読み取るときにその位置をシークします。

于 2013-02-04T14:56:34.677 に答える
0

ログファイルのフォーマットなど、さらに情報を提供していただければ可能です。

メソッドを見てくださいdatetime.datetime.strptime。そこには、必要なものがすべて揃っています。

例えば

import os.path
from datetime import datetime

filename = "my.log"

def log_entry_is_interesting(line, reference_time):
    date_str = line.split()[0]
    date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
    return timedelta(current_datetime, date).days > reference_time:


last_time_opened = os.path.getmtime(filename)
with open(filename) as f:
    for line in filter(lambda x: log_entry_is_interesting(x, last_time_opened), f):
        do_something()

方法を使用しfilter()ます。これは Python 3 ではジェネレーターとして実装されていますが、Python 2.x では実装されていません。2.x を使用する場合、私は間違いなく-moduleifilterから使用します。itertools

于 2013-02-04T14:47:41.910 に答える
0

ファイル内の行が日付順に並べ替えられている場合 (追加のみのログでは妥当です)、逆の順序でファイルを読み取ることができます (tacユーティリティ- Python のバージョンがシステムで利用できない場合は検索または実装します)。日付が過去に過ぎている場合は読むのをやめてください:

# ..
if 'error' in line.lower():
   if getdate(line) < today:
      break # stop processing
于 2013-02-04T16:07:22.380 に答える