1

print編集されたものは何でもテキストファイルに記録したいsys.stdout。より賢い人々がよりエレガントでPythonicなソリューションを思い付くことができることを私は理解していますが、ここに私のソリューションがあります

class logger:

  def __init__(self, filename='log.txt'):
    self.logf = open(filename, 'a')

    global print
    self.__print = print

    print = self.lognprint

  def __del__(self):
    self.logf.close()

  def lognprint(self, *args, **keywords):
    self.__print(*args, file = self.logf, **keywords)
    self.__print(*args, **keywords)

今、私のコードのどこかに追加します

mylog = logger()

print後で編集されたものもすべてログに記録されます。

しかし、多くの明らかな理由から、これは安全/適切ではありません。たとえば、複数のloggerオブジェクトが厄介になる可能性があります。

さらに、私は触発されています

from __future__ import print_function

(たとえばこれを参照してください)そして私は似たようなことをしたいので、import私のモジュールのとき、組み込みprintはコードのどこかで私のバージョンのprintによって上書きされます。

そんなことがあるものか?

4

2 に答える 2

1

同様の解決策、またはstd.outにも出力されるファイルへのロギングは、ロギングクックブックに記載されています。
単純に「spam.log」というファイルにログを記録し、特定のものをstd.outに出力する方法は次のとおりです。

import logging

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

この例では、すべてのメッセージがファイルに送信され、上位レベルのみがコンソールに送信されます。

于 2012-09-26T20:41:45.717 に答える
1

コードをクラス内に配置する代わりに、モジュール レベルに配置します。このようにして、モジュールが初めてインポートされたときに実行されます。

# logging.py
print = my_print
于 2012-09-26T20:24:01.353 に答える