3

現在、すべてが 1 つのログ ファイルに記録されていますが、それを複数のログ ファイルに分けたいと考えています。私はPythonのドキュメントのロギングを見ていますが、これについては議論していません。

log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
logging.basicConfig(filename=(os.path.join(OUT_DIR, + '-user.log')),
            format=log_format, level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S')

現在、これは私がロギングを行う方法です。私がやりたいことは、さまざまな種類のエラーや情報がさまざまなログファイルに記録されることです。私が行った瞬間にlogging.info('Logging IN')logging.error('unable to login')同じログファイルに移動します。私はそれらを分離したい。別のファイルへのロギングをサポートするには、別のロギング オブジェクトを作成する必要がありますか?

4

2 に答える 2

3

あなたが/できる/できること (私はモジュールをあまり掘り下げていないloggingので、これを行うためのより良い方法があるかもしれません) は、おそらくファイル オブジェクトではなくストリームを使用することです:

In [1]: class LogHandler(object):
   ...:     def write(self, msg):
   ...:         print 'a :%s' % msg
   ...:         print 'b :%s' % msg
   ...:         

In [3]: import logging
In [4]: logging.basicConfig(stream=LogHandler())
In [5]: logging.critical('foo')
a :CRITICAL:root:foo
b :CRITICAL:root:foo

In [6]: logging.warn('bar')
a :WARNING:root:bar
b :WARNING:root:bar

さらに処理して編集します:

ログ ファイルが既に存在すると仮定すると、次のようなことができます。

import logging

class LogHandler(object):
    format = '%(levelname)s %(message)s'
    files = { 
        'ERROR': 'error.log',
        'CRITICAL': 'error.log',
        'WARN': 'warn.log',
    }   
    def write(self, msg):
        type_ = msg[:msg.index(' ')] 
        with open(self.files.get(type_, 'log.log'), 'r+') as f:
            f.write(msg)

logging.basicConfig(format=LogHandler.format, stream=LogHandler())
logging.critical('foo')

これにより、ログ メッセージの条件に基づいて、ログをさまざまなファイルに分割できます。探しているものが見つからない場合は、単にデフォルトでlog.log.

于 2013-02-28T23:49:53.400 に答える
1

docs.python.org/2/howto/logging-cookbook.htmlからこのソリューションを作成しました

2 つのログ ファイル ハンドラーを作成し、それらのログ レベルを割り当てて、ロガーに追加するだけです。

import os
import logging

current_path = os.path.dirname(os.path.realpath(__file__))

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

#to log debug messages                               
debug_log = logging.FileHandler(os.path.join(current_path, 'debug.log'))
debug_log.setLevel(logging.DEBUG)

#to log errors messages
error_log = logging.FileHandler(os.path.join(current_path, 'error.log'))
error_log.setLevel(logging.ERROR)

logger.addHandler(debug_log)
logger.addHandler(error_log)

logger.debug('This message should go in the debug log')
logger.info('and so should this message')
logger.warning('and this message')
logger.error('This message should go in both the debug log and the error log')
于 2015-07-08T23:45:30.987 に答える