【问题标题】:Refining the logging method in python tornado改进python tornado中的日志记录方法
【发布时间】:2016-01-30 14:14:18
【问题描述】:

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

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')

我面临的问题是每次调用函数时都会打印两次响应。

例如: 信息日志

hello world hello world

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

谢谢

【问题讨论】:

  • 使用FileHandler 打开文件的默认值是追加,你确定它实际上记录了两次,而不仅仅是你运行了两次?
  • @DimitrisJim 你确定它记录了两次。

标签: python logging file-handling log-rotation


【解决方案1】:

尝试:

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')

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

【讨论】:

  • 谢谢。实际上我的要求是做一个TimedRotatingFileHandler 并将不同的响应存储到不同的文件,如error.log、info.log 和debug.log,有没有办法我可以做到这一点而不必在2 个日志文件中打印。 (我只想拥有一个具有 TimedRotatingFileHandlerFileHandler 功能的文件。)有没有办法用 1 个处理程序而不是上面使用的 2 个处理程序来做类似的事情
  • 只需删除 FileHandler 并仅添加 TimedRotatingFileHandler 。
  • 通过删除 FileHandler,我只能打印同一个文件中的所有内容,我希望将错误保存在 error.log 中,将警告保存在 warning.log 和 info.log 中跨度>
  • 更新 anwser , error 到 error.log 和 warning 到 warning.log
猜你喜欢
  • 2016-03-31
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多