5

Linux Ubuntu 12.04 システムを使用しています。このコードを使用して、すべての stdout と stderr + INFO レベルの追加のログをファイルに記録しています。

class LogFile(object):
    def __init__(self, name=None):
        self.logger = logging.getLogger(name)

    def write(self, msg, level=logging.INFO):
        self.logger.log(level, msg)

    def flush(self):
        for handler in self.logger.handlers:
            handler.flush()

logging.basicConfig(level=logging.INFO, 
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d-%y %H:%M:%S',
                    filename='logging.log')
sys.stdout = LogFile('stdout')
sys.stderr = LogFile('stderr')

何らかの理由で、エントリを取得するたびに常に空白行が続きます。これが私のログの小さな出力です。

08-09-12 09:52:54 stdout       INFO     CheckCon: Checking Portal access.
08-09-12 09:52:54 stdout       INFO     

08-09-12 09:52:54 stdout       INFO     CheckCon: Portal ping successful.
08-09-12 09:52:54 stdout       INFO     

08-09-12 09:53:08 stderr       INFO     Bottle server starting up (using PasteServer())...

08-09-12 09:53:08 stderr       INFO     Listening on http://0.0.0.0:8654/

08-09-12 09:53:08 stderr       INFO     Hit Ctrl-C to quit.


08-09-12 09:53:08 stdout       INFO     URI: Generated https://*****
08-09-12 09:53:08 stdout       INFO     

08-09-12 09:53:08 stdout       INFO     CheckCon: Checking Portal access.
08-09-12 09:53:08 stdout       INFO     

08-09-12 09:53:08 stdout       INFO     serving on 0.0.0.0:8654 view at http://127.0.0.1:8654
08-09-12 09:53:08 stdout       INFO     

08-09-12 09:53:08 stdout       INFO     CheckCon: Google ping successful.
08-09-12 09:53:08 stdout       INFO     

これは、ファイル内でどのように表示されるかです。空の stdout 行と、その後に空白行全体が続きます。ボトルサーバーからの出力に空の行がないように見える場合は、各行の間にまだ空白行があります。

これを引き起こしている原因や、それを防ぐ方法を知っている人はいますか?

編集:

提案から、すべての印刷をlogging.infoに変更しましたが、ボトルアンドペーストサーバーが通常の印刷を行っているという問題がまだあります:\

だから私のログは今、変更された形式でformat='%(asctime)s %(levelname)-4s: %(message)s':

08-09-12 12:44:40 INFO: URI: Generated https://****
08-09-12 12:44:40 INFO: CheckCon: Checking Portal access.
08-09-12 12:44:40 INFO: serving on 0.0.0.0:9002 view at http://127.0.0.1:9002
08-09-12 12:44:40 INFO: 

08-09-12 12:44:40 INFO: CheckCon: Google ping successful.
08-09-12 12:44:40 INFO: FullW: opening url: ****
08-09-12 12:44:40 INFO: FullW: showing.
08-09-12 12:44:40 INFO: LOOP: starting.

私が見ることができることから、追加の空の行も空の情報行が原因であるため、今近づいています..

出力を明確にするために編集します:興味深いビット:

+++08-09-12 13:01:04 stdout       INFO     serving on 0.0.0.0:9002 view at     http://127.0.0.1:9002+++
+++08-09-12 13:01:04 stdout       INFO     
+++

最終編集:

メッセージの長さが2文字未満かどうかを確認するように書き込みを変更し、空白行を削除しました..理由はまだ100%わかりません.

def write(self, msg, level=logging.INFO):
    if len(msg) < 2:
        pass
    else:
        self.logger.log(level, msg)
4

2 に答える 2

1

これは、仕組みによるものprintです。

メソッドに があるように、例を変更しprint (level, msg)ましたwrite()

それは私に次のことを示しています:

>>> x=LogFile("foo")
>>> print >>x, "123\n321\n444", "321", "222",
(20, '123\n321\n444')
(20, ' ')
(20, '321')
(20, ' ')
(20, '222')
>>> print >>x, "123\n321\n444", "321", "222"
(20, ' ')
(20, '123\n321\n444')
(20, ' ')
(20, '321')
(20, ' ')
(20, '222')
(20, '\n')

そして、このコールのそれぞれがコールに転送される場合、loggerそれぞれのエントリを取得します。

それに対処するために、logger.log()完全な行と終了時にのみ呼び出す一種のバッファリングを実装できます。

于 2012-08-09T08:25:13.253 に答える
0

私が考えることができるのは、sys.stdout を上書きするため、ログ行を書き込む実際のコマンドには改行が追加されるということです: sys.stdout.write("log text\n"). ロギング モジュール/メソッド自体が改行を追加するため、2 つの改行が得られます。

ただし、それは完全に空白の行のみを表示する必要があり、<date> <name> <level>. これは、他の場所での単一sys.stdout.write("\n")ステートメントが原因である可能性があります。

これを防ぐために考えられる最も簡単な方法は、から改行を取り除き、msgメッセージが空かどうかを確認することです。最も美しいわけではありませんが、それが機能する場合は、おそらく改行が原因であり、そこから作業できます。

def write(self, msg, level=logging.INFO):
    msg = msg.rstrip("\n")
    if msg:
        self.logger.log(level, msg)
于 2012-08-09T08:29:46.767 に答える