改进python tornado中的日志记录方法

改进python tornado中的日志记录方法,python,logging,file-handling,log-rotation,Python,Logging,File Handling,Log Rotation,我正在尝试在函数中记录操作,我编写了以下函数,根据响应类型(即信息、错误、调试和警告)记录对不同文件的响应 logging.basicConfig(filename='indivi_service.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) def setup_logger(logger_name, log_file, level=logging.DEBUG):

我正在尝试在函数中记录操作,我编写了以下函数,根据响应类型(即信息、错误、调试和警告)记录对不同文件的响应

logging.basicConfig(filename='indivi_service.log',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
def setup_logger(logger_name, log_file, level=logging.DEBUG):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter()
    fileHandler = logging.FileHandler(log_file)
    fileHandler.setFormatter(formatter)
    handler = TimedRotatingFileHandler(logger_name,
                               when="d",
                               interval=1,
                               backupCount=100)


l.setLevel(level)
l.addHandler(fileHandler)
l.addHandler(handler)


setup_logger('debug', r'debug')
setup_logger('error', r'error')
setup_logger('warning', r'warning')
setup_logger('info', r'info')
debug = logging.getLogger('debug')
error = logging.getLogger('error')
warning = logging.getLogger('warning')
info = logging.getLogger('info')


class Info(APIHandler):
    @gen.coroutine
    def post(self):
        req = json.loads(self.request.body)
        resp, content = client(item_id=req['item_id'])
        debug.debug(content)
        info.info(hello world)
        warning.warn('warning message')
        error.error('error message')
我面临的问题是,每次调用函数时,都会打印两次响应

例如: 信息日志

你好,世界 你好,世界

谁能告诉我为什么会这样。所有日志文件都是这样

谢谢

试试:

import logging
import logging.handlers

logging.basicConfig(filename='indivi_service.log',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
def setup_logger(logger_name, log_file, level=logging.DEBUG):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler = logging.handlers.TimedRotatingFileHandler(str(log_file)+'.log', when="d", interval=1, backupCount=100)
    handler.setFormatter(formatter)

    l.setLevel(level)
    l.addHandler(handler)


setup_logger('debug', r'debug')
setup_logger('error', r'error')
setup_logger('warning', r'warning')
setup_logger('info', r'info')
debug = logging.getLogger('debug')
error = logging.getLogger('error')
warning = logging.getLogger('warning')
info = logging.getLogger('info')


if __name__ == "__main__":
    info.info('hello world')
    error.info('hello world')

运行此脚本后,file info.log有一个“hello world”,error.log也只有一个“hello world”。

使用文件处理程序打开文件的默认值是append,您确定它实际上记录了两次,而不仅仅是运行了两次吗?@dimitris Jim ya我确定它记录了两次。谢谢。实际上,我的要求是做一个TimedRotatingFileHandler,并将不同的响应存储到单独的文件中,如error.log、info.log和debug.log,是否有一种方法可以做到这一点,而不必在两个日志文件中打印。我只想要一个具有TimedRotatingFileHandler和FileHandler功能的文件。有没有一种方法可以用1个处理程序而不是上面使用的2个处理程序来执行类似的操作?必须删除FileHandler并只添加TimedRotatingFileHandler。通过删除FileHandler,我只能在同一个文件中打印所有内容,我希望错误保存在error.log中,警告保存在warning.log中,信息保存在info.logupdate anwser中,错误保存在error.log中,警告保存在warning.log中