V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
JhOOOn
V2EX  ›  Python

请教 python 如何分日志级别分文件输出?

  •  
  •   JhOOOn · 2016-10-13 14:09:14 +08:00 · 5387 次点击
    这是一个创建于 2967 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如:

    1. logger.info() => info_file.log
    2. logger.error() => err_file.log

    目前的想法是生成不同级别的 logger ,每个 logger 打印到不同的文件。但不太好吧。

    请教: 有人做过吗?

    8 条回复    2016-10-14 11:51:41 +08:00
    backto17
        1
    backto17  
       2016-10-13 14:36:29 +08:00
    可以的,给 logger 添加不同级别的 filehandler
    hwsdien
        2
    hwsdien  
       2016-10-13 14:56:45 +08:00
    handler 有 setLevel
    lxy
        3
    lxy  
       2016-10-13 15:44:36 +08:00
    如果你给同一个 logger 设置不同级别的 FileHandler 会有一个缺陷:在该 FileHandler 设定级别以上的记录都会被记录。
    比如,如果你设置记录级别为 logging.INFO ,那么除了 INFO 以外 logging.WARNING 等以上级别的也会被记录,造成记录冗余。
    我也想知道有没有解决这个问题的方法或者第三方库。
    fds
        4
    fds  
       2016-10-13 15:55:11 +08:00
    哦,可以考虑后期通过 Logstash, Fluentd 等等处理,最近还有些 go 语言写的类似服务。
    backto17
        5
    backto17  
       2016-10-13 16:12:52 +08:00
    @lxy 你可以再给每个 filehandler 添加 filter 就行了
    yuyang
        6
    yuyang  
       2016-10-13 16:23:13 +08:00
    class DebugFilter(logging.Filter):
    def filter(self, record):
    return record.levelno == logging.DEBUG


    class InfoFilter(logging.Filter):
    def filter(self, record):
    return record.levelno == logging.INFO

    其它的自己改吧
    backto17
        7
    backto17  
       2016-10-13 16:29:02 +08:00   ❤️ 1
    完整的 demo

    # coding: utf-8
    '''
    @date: 2016-10-13
    @author: alex.lin
    '''
    import logging

    class LogLevelFilter(logging.Filter):

    def __init__(self, name='', level=logging.DEBUG):
    super(LogLevelFilter,self).__init__(name)
    self.level = level

    def filter(self, record):
    return record.levelno == self.level


    # create logger
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)

    fh_info = logging.FileHandler('logging_info.log')
    fh_info.setLevel(logging.INFO)

    fh_debug = logging.FileHandler('logging_debug.log')
    fh_debug.setLevel(logging.DEBUG)


    filter_info = LogLevelFilter(level=logging.INFO)
    filter_debug = LogLevelFilter(level=logging.DEBUG)


    fh_info.addFilter(filter_info)
    fh_debug.addFilter(filter_debug)

    logger.addHandler(fh_info)
    logger.addHandler(fh_debug)

    logger.debug('for debug')
    logger.info('for info')
    logger.error('for error')
    ryd994
        8
    ryd994  
       2016-10-14 11:51:41 +08:00 via Android
    其实一个 grep 就解决的问题…………
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5477 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 08:36 · PVG 16:36 · LAX 00:36 · JFK 03:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.