3

Ubuntu で作成されたログ メッセージの USB に関する行を出力したいと考えています。これが私のコードです:

>>> import re
>>> fd = open("/var/log/syslog.1", "r")
>>> for lines in fd:
...     if re.match("usb", lines):
...             print lines

(ちなみに、ファイル syslog.1 が正しいものかどうかはわかりません。ただし、その中に多くのメッセージがあり、USB に関連するものもあります)

4

2 に答える 2

3

@SidNoob:ログのトピックに追加します(Pythonに関連しない場合があります)。USBデーモンまたはドライバーからのログを探していると想定しています。その場合は、カーネル関連のメッセージ (ドライバーを含む) を記録する適切なログ ファイル "/var/log/syslog" を見ている可能性があります。アプリケーション (ログ レベルが異なる) の場合は、"/var/logs/messages" を確認する必要があります。

しかし、要点: 「/var/log/syslog」のようなファイルを読み取りのために開くと、ファイルを RAM にロードしているため、メモリを大量に消費することがあります。サーバー タイプの環境では、これは MB 単位またはそれ以上の長さに達する可能性があります。「var/log/syslog」ファイルの内容が何であれ、標準出力に出力するコマンド「dmesg」があります。したがって、この大きなファイルを開く代わりに、「dmesg」の出力を文字列に保存して、行ごとに解析します。

どちらの方法も同じで、python プログラムの実行時に同じメモリを占有すると考えるかもしれません。はい。ただし、「dmesg」出力を消去した場合はそうではありません。「dmesg」はリング バッファなので、USB アプリケーションを実行する前に「dmesg -c」を使用してクリアし、アプリケーションの起動後に「dmesg」を発行できます。このようにして、解析する行の量を減らし、プログラムを高速化します。

これがあなたの知識とプログラムに追加されることを願っています。

于 2013-07-23T06:48:35.603 に答える
1

最新のメッセージについては、基本的には古いメッセージのバックアップです/var/log/syslog/var/log/syslog.1

コードの動作を妨げているのは、re.match()代わりにre.search()- を使用していることです。これらのリンクのドキュメントからわかるように、re.match()検索対象のテキストの先頭にのみ一致します。

ただし、実際には、正規表現を使用する必要はまったくありません。あなたのコードに代わるものは次のとおりです。

>>> with open("/var/log/syslog") as f:
...     for line in f:
...         if "usb" in line.lower():
...             print line
... 

ここではいくつかの点が異なります。

  1. withコンテキスト マネージャーを使用してファイルを開きます。これは、何か問題が発生した場合でも、Python がファイルをクリーンアップして閉じるのに役立ちます。これは良い習慣です。

  2. Python では慣習的であるように、ファイル変数を呼び出しましたffdあなたのコードを読んでいる人に、あなたがfile descriptorについて話していると思わせるでしょうが、これは同じことではありません。

  3. これは 1 行を保持するため、文字列変数lineを ではなくと呼びますlines

  4. 正規表現ではなく、"usb"が行のどこかにあるかどうかを確認できます (元の行もキャッチできるように、確認する前に行を小文字に変換しています"USB"

于 2013-07-23T04:21:20.760 に答える