たとえば、log.info(「msg」)を行うときに改行をキャンセルしたいと思います。「印刷」するときは、
print msg,
だから私はロギングのためにcomaのようなものが必要です。
私はこの質問を Suppress newline in Python logging moduleに蒔きます が、誰かが参考文献や「Hello world」のような簡単な例を教えてくれますか?
たとえば、log.info(「msg」)を行うときに改行をキャンセルしたいと思います。「印刷」するときは、
print msg,
だから私はロギングのためにcomaのようなものが必要です。
私はこの質問を Suppress newline in Python logging moduleに蒔きます が、誰かが参考文献や「Hello world」のような簡単な例を教えてくれますか?
同様の質問に対して私が答えたものは次のとおりです。
新しい行がクラスのメソッド\n
内に挿入されます。StreamHandler
emit(...)
本当にこの動作を修正したい場合は、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(...)
ください。したがって、複数のロギング クラスを使用している場合、このパッチは他のロギング クラスにも影響します。
それが役立つことを願っています。
これは不可能です (logging モジュールへの深刻なハッキングがなければ)。この機能が必要な場合は、ログ文字列を部分的に作成し、改行を含むログ メッセージを表示する準備ができたときにのみログに記録します。