0

ログを読み、解析して最小の開始番号 (ヘッド) を取得し、それを出力する簡単なプログラムを作成しました。私は現在、そのプログラムを編集して、実際のログファイルを解析するために作成したクラスと組み合わせています。本質的に、以前のプログラムのログからの単純な数字に基づいてソートするのではなく、あるクラスから別のクラスへの解析された情報を参照する必要があります。これを行う最も便利な方法は何だろうと考えていました。私はPythonの初心者プログラマーで、クラスを明示的に参照できるかどうかわかりません。

ここにクラスがあります。

パーサー

class LogLine:

    SEVERITIES = ['EMERG','ALERT','CRIT','ERR','WARNING','NOTICE','INFO','DEBUG']
    severity = 1


    def __init__(self, line):
        try:
            m = re.match(r"^(\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2}),?(\d{3}),?(\s+\[(?:[^\]]+)\])+\s+[A-Z]+\s+(\s?[a-zA-Z0-9\.])+\s?(\((?:\s?\w)+\))\s?(\s?.)+", line)
            timestr, msstr, sevstr, self.filename, linestr, self.message = m.groups()
            self.line = int(linestr)
            self.sev = self.SEVERITIES.index(sevstr)
            self.time = float(calendar.timegm(time.strptime(timestr, "%Y-%m-%d %H:%M:%S,%f"))) + float(msstr)/1000.0
            dt = datetime.strptime(t, "%Y-%m-%d %H:%M:%S,%f")
        except Exception:
            print 'error',self.filename


    def get_time(self):
        return self.time
    def get_severity(self):
        return self.sev
    def get_message(self):
        return self.message
    def get_filename(self):
        return self.filename
    def get_line(self):
        return self.line

ソーター

class LogFile:

    def __init__(self,filepath):
        self.logfile = open(filepath, "r")
        self.head = None

    def __str__(self):
        return "x=" + str(self.x) + "y="+str(self.y)

    def readline(self):
        if self.head != None:
            h = self.head
            self.head = None
            return h
        else:
            return self.logfile.readline().rstrip(' ')

    def get_line(self):
        if self.head == None:
            self.head = self.readline().rstrip(' ')
            return self.head.get.line()
        else:
            return self.head.get.line()

    def close (self):
        self.logfile.close()

get_line 関数を追加して、2 番目のクラスの編集を開始しました。私が正しい軌道に乗っているかどうかはわかりません。

簡単に言えば、頭が「LogLine」になる必要があります

4

1 に答える 1

2

あるクラスを別のクラスから使用しても問題ありません。ログ ファイルから 1 行を解析し、その行を表すオブジェクトを構築するクラスが 1 つあります。ログファイルから行を読み取る別のクラスがあります。2 番目のクラスが 1 番目のクラスを呼び出すのは非常に自然なことです。

以下は、ログ ファイルからすべての行を読み取り、リストを作成する非常に単純なクラスです。

class LogFile(object):
    def __init__(self,filepath):
        with open(filepath, "r") as f:
            self.lst = [LogLine(line) for line in f]

self.lst入力ログ ファイルからの行のリストに設定されていることがわかりますが、行のテキストだけではありません。コードは のLogLine(line)インスタンスを格納するために呼び出していますLogLine。必要に応じて、作成後にリストを並べ替えることができます。

self.lst.sort(key=LogLine.get_line)

ログ ファイルが非常に大きい場合、リストを作成するのは実際的ではない可能性があります。.get_line()メソッド関数があり、それを使用できます。

class LogFile(object):
    def __init__(self,filepath):
        self.logfile = open(filepath, "r")

    def get_line(self):
        try:
            line = next(self.logfile)  # get next line from open file object
            return LogLine(line)
        except StopIteration:  # next() raises this when you reach the end of the file
            return None  # return 

    def close(self):
        self.logfile.close()

開いているファイル オブジェクト (open()関数によって返される) は反復できます。next()このオブジェクトを呼び出すと、次の入力行が得られます。ファイルの終わりに到達すると、Python はファイルStopIterationの終わりを知らせるために発生します。

StopIterationここで、コードは例外をキャッチしNone、ログ ファイルの最後に到達すると戻ります。しかし、これはこの問題を処理する最善の方法ではないと思います。forLogFile クラスをループなどで機能させましょう。

class LogFile(object):
    def __init__(self,filepath):
        self.f = open(filepath)

    def __next__(self):  # Python 3.x needs this to be named "__next__"
        try:
            line = next(self.f)
            return LogLine(line)
        except StopIteration:
            # when we reach the end of input, close the file object
            self.f.close()
            # re-raise the exception
            raise
    next = __next__  # Python 2.x needs this to be named "next"

Pythonのループは、例外が発生するまでメソッド関数 (Python 3.x) またはメソッド関数 (Python 2.x)forを繰り返し呼び出します。ここでは、両方のメソッド関数名を定義したので、このコードは Python 2.x または Python 3.x で動作するはずです。.__next__().next()StopIteration

今、あなたはこれを行うことができます:

for ll in LogFile("some_log_file"):
    ... # do something with ll, which will always be a LogLine instance
于 2012-07-27T19:37:28.547 に答える