11

たとえば、log.info(「msg」)を行うときに改行をキャンセルしたいと思います。「印刷」するときは、

print msg,

だから私はロギングのためにcomaのようなものが必要です。

私はこの質問を Suppress newline in Python logging moduleに蒔きます が、誰かが参考文献や「Hello world」のような簡単な例を教えてくれますか?

4

2 に答える 2

7

同様の質問に対して私が答えたものは次のとおりです。

新しい行がクラスのメソッド\n内に挿入されます。StreamHandleremit(...)

本当にこの動作を修正したい場合は、logging.StreamHandler クラス内のメソッドにモンキーパッチを適用してこれを解決した例を次に示します。emit(self, record)

モンキー パッチは、元のソース コードを変更せずに動的言語のランタイム コードを拡張または変更する方法です。このプロセスは、ダックパンチングとも呼ばれています。

emit()以下は、改行を省略した のカスタム実装です。

def customEmit(self, record):
    # Monkey patch Emit function to avoid new lines between records
    try:
        msg = self.format(record)
        if not hasattr(types, "UnicodeType"): #if no unicode support...
            self.stream.write(msg)
        else:
            try:
                if getattr(self.stream, 'encoding', None) is not None:
                    self.stream.write(msg.encode(self.stream.encoding))
                else:
                    self.stream.write(msg)
            except UnicodeError:
                self.stream.write(msg.encode("UTF-8"))
        self.flush()
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        self.handleError(record)

次に、カスタム ロギング クラスを作成します (この場合は、からサブクラス化しTimedRotatingFileHandlerます)。

class SniffLogHandler(TimedRotatingFileHandler):
    def __init__(self, filename, when, interval, backupCount=0,
                 encoding=None, delay=0, utc=0):

        # Monkey patch 'emit' method
        setattr(StreamHandler, StreamHandler.emit.__name__, customEmit)

        TimedRotatingFileHandler.__init__(self, filename, when, interval,
                                          backupCount, encoding, delay, utc)

このタイプのソリューションはPythonicなどではないと主張する人もいるかもしれません。そうかもしれませんので、気をつけてください。

また、これはグローバルにパッチされることに注意してSteamHandler.emit(...)ください。したがって、複数のロギング クラスを使用している場合、このパッチは他のロギング クラスにも影響します。

それが役立つことを願っています。

于 2012-11-14T05:14:08.307 に答える
5

これは不可能です (logging モジュールへの深刻なハッキングがなければ)。この機能が必要な場合は、ログ文字列を部分的に作成し、改行を含むログ メッセージを表示する準備ができたときにのみログに記録します。

于 2012-10-02T23:14:07.913 に答える