python 中不同级别的日志记录

2024-01-03

我想做一些我认为很简单的事情。

实际上,对于 python 日志记录模块,我对日志记录感兴趣 命令行上的所有内容均处于命令给出的级别 行参数,并以固定的 DEBUG 级别记录到文件。

创建两个具有不同级别的不同记录器不起作用,但是 设置添加到根的两个不同处理程序的级别 记录器也不起作用,所以知道我实际上应该如何做吗? (在其他链接上阅读第二种方法应该可行,所以我在做其他愚蠢的事情吗?)

这是目前设置我的日志系统的代码:

class LoggerSetup(object):
    """Setup the different logger objects
    """

    def __init__(self):
        self.root_logger = logging.getLogger()
        self.shell_hdlr = logging.StreamHandler()

    #TODO: add another logging handler which stores to a temporary file
    #which should be cleaned up later
    def setup_shell_logger(self, log_level):
        self.root_logger.setLevel(LOG_LEVELS[log_level])
        # in this way the root logger is not set but the handlers are set
        self.shell_hdlr = logging.StreamHandler()
        self.shell_hdlr.setLevel(LOG_LEVELS[log_level])
        self.shell_hdlr.setFormatter(StarFormatter())
        #FIXME: add the support for regular expression exclusion too
        self.root_logger.addHandler(self.shell_hdlr)

    def setup_log_include(self, log_include):
        """Set up the filter to include log messages
        """
        if log_include:
            incl = FilterInclude(log_include)
            self.shell_hdlr.addFilter(incl)

    def setup_log_exclude(self, log_exclude):
        """Set up the filters to exclude log messages
        """
        if log_exclude:
            excl = FilterExclude(log_exclude)
            self.shell_hdlr.addFilter(excl)

    def setup_file_logging(self):
        """Set up the file logger, which always logs in DEBUG mode
        even if the top level logger is set to another level
        """
        #XXX: not working, one possible way to make it work is to create
        #only one log, and different handler/filters to make to handle all
        #the different outputs
        file_handler = logging.FileHandler(LOG_FILENAME)
        # the file logging is always in debug mode
        file_handler.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s - %(asctime)s')
        file_handler.setFormatter(formatter)
        self.root_logger.addHandler(file_handler)

这是我在所有 Python 命令行应用程序中使用的东西。这有点冗长,但是您应该能够获得一个接受可选参数的记录器,以在任何级别创建控制台记录器,而不管记录到文件的内容是什么:

#!/usr/bin/env python
import logging
from argparse import ArgumentParser

COMPANY_LOGGER = 'COMPANY.Python.Logger'
CONSL_LEVEL_RANGE = range(0, 51)
LOG_FILE = 'company.log'
FORMAT_STR = '%(asctime)s %(levelname)s %(message)s'

parser = ArgumentParser()
parser.add_argument('-c', '--console-log', metavar='ARG',
                    type=int, choices=range(0, 51),
                    action='store', dest='console_log',
                    default=None,
                    help='Adds a console logger for the level specified in the range 1..50')

args = parser.parse_args()

# Create logger
logger = logging.getLogger(COMPANY_LOGGER)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(FORMAT_STR)

# Add FileHandler and only log WARNING and higher
fh = logging.FileHandler(LOG_FILE)
fh.name = 'File Logger'
fh.level = logging.WARNING
fh.formatter = formatter
logger.addHandler(fh)

# Add optional ConsoleHandler
if args.console_log:
    ch = logging.StreamHandler()
    ch.name = 'Console Logger'
    ch.level = args.console_log
    ch.formatter = formatter
    logger.addHandler(ch)

logger.debug('DEBUG')
logger.info('INFO')
logger.warning('WARNING')
logger.critical('CRITICAL')

从命令行运行时,我们可以看到记录级别的差异。

-c1相当于“DEBUG 及更高级别”(最详细),但 company.log 仍然只记录 WARNING 及更高级别:

~ zacharyyoung$ ./so.py -c1
2012-01-12 08:59:50,086 DEBUG DEBUG
2012-01-12 08:59:50,086 INFO INFO
2012-01-12 08:59:50,087 WARNING WARNING
2012-01-12 08:59:50,087 CRITICAL CRITICAL

~ zacharyyoung$ cat company.log 
2012-01-12 08:59:50,087 WARNING WARNING
2012-01-12 08:59:50,087 CRITICAL CRITICAL

-c20等于信息:

~ zacharyyoung$ ./so.py -c20
2012-01-12 09:00:09,393 INFO INFO
2012-01-12 09:00:09,393 WARNING WARNING
2012-01-12 09:00:09,393 CRITICAL CRITICAL

~ zacharyyoung$ cat company.log 
2012-01-12 08:59:50,087 WARNING WARNING
2012-01-12 08:59:50,087 CRITICAL CRITICAL
2012-01-12 09:00:09,393 WARNING WARNING
2012-01-12 09:00:09,393 CRITICAL CRITICAL
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 中不同级别的日志记录 的相关文章

随机推荐

  • MySQL:在结果之间使用日期条件

    我有一个执行此操作的 SQL 语句 group by date having date between 2010 07 01 and 2010 07 10 结果如下 sum test day 20 2010 07 03 120 2010 0
  • 基于条件标准寻找模式

    我希望能够在相邻列中根据特定标准找到最常见的值 例如 gt ROW A ROW B gt Blue Jason gt Blue Jason gt Blue Charles gt Red Alfred gt Red Alfred gt Red
  • 回调函数抛出意外的“不一致的参数”错误

    我正在使用 GNU Octave 版本 4 4 1 我正在尝试通过包含两个滑块来制作简单振荡器的交互式绘图 这两个滑块将允许更改初始速度和振荡器质量 绘图本身以及带有一个滑块 用于速度 的脚本都显示良好 这是带有回调函数的脚本的一部分 fu
  • GCD 和 RunLoop

    在我的应用程序中我添加了一个CFMach端口参考 via CFMachPortCreateRunLoopSource 到线程CF运行循环 现在我问自己 这可以使用 GCD 来完成吗 让我们说 而不是生成我自己的NSThread并添加创建的C
  • git:如何将某个作者的所有提交重新设置为单独的分支?

    I m using some code for which no SCM is used and receive occasional updates in the form of all project files although on
  • 适用于套接字流的 C++/Java 序列化库?

    我需要用 C Obj C 编写一个服务器 它可以从用 Java 和 C 构建的多个客户端接收流数据 挑战 我需要有效地序列化和反序列化数据结构 一个 C 客户端将生成 128x96x2 维浮点数组以及一些元数据 每秒大约 30 次 视频功能
  • 如何在客户端服务中动态加载SPRING_PROFILES_ACTIVE值?

    我是 Spring 新手 正在创建 Spring Cloud 配置服务 我已成功创建配置服务 其中所有配置都在那里 在我的客户端服务中 这将从配置服务中获取所有必要的配置 我需要根据SPRING PROFILES ACTIVE清单文件中定义
  • 使用纹理贴图对球体进行凹凸贴图

    我们想用纹理贴图对球体进行凹凸贴图 然而 表面 球体的面积是纹理贴图面积的 10 倍 两者的面积均以像素为单位 描述纹理贴图用于凹凸贴图的不同方式 通常矩形纹理用于球体 texture u v 坐标用作球坐标的角度 结果是 纹素在赤道附近较
  • EF6 中的急切加载、延迟加载和显式加载

    我读过这个tutorial http www entityframeworktutorial net EntityFramework5 entity framework5 introduction aspx和这个article https
  • 仅当省略号处于活动状态时才显示工具提示

    我有下一个 div div class div class style width 158px title 如何仅在省略号处于活动状态时显示工具提示 我发现这个功能 function isEllipsisActive e return e
  • 我可以记住通用方法吗?

    我有 2 个昂贵的通用方法 public T DoStuff
  • 在Python Pillow中设置图像分辨率

    我正在使用 Python Pillow 来修改图像 每当我保存 jpeg 时 内部分辨率都会设置为 72dpi 我想看看如何将其设置为不同的值 我意识到这只是一个数字 在很多方面它毫无意义 我的动机是当我将图像读入 Photoshop 时使
  • 想要在用户单击完成后调用presentingViewController中的方法

    新手 iOS 开发人员在这里使用了一款 iOS 应用程序 我有一个 iOS 应用程序的设置部分 当用户单击 完成 时 我需要模式视图控制器 目前是这样 并且我想在presentingViewController 中调用一个名为 update
  • Swift 4 中的文本到语音转换

    我正在尝试将文本到语音功能集成到我的 iOS 应用程序中 为此我正在使用AVSpeechUtterance and AVSpeechSynthesisVoice类的AVFoundation框架 extension String func s
  • Factory_girl 瞬态属性是什么?我为什么要使用一个?

    I read this https github com thoughtbot factory girl blob master GETTING STARTED md transient attributes来自 Thoughtbot 但它
  • kafka作为微服务中的消息总线可靠吗

    我使用 kafka 作为微服务架构的消息总线 因此多个服务监听一个主题的消息 因此 服务的上线高度依赖于主题 但是 有很多情况我得到leader not available broker not available and leader 1
  • C# 中 Excel 2016 的 oledb 连接字符串

    我一直在尝试使用 C 访问 2016 MS Excel 文件 但连接字符串只能在 2013 MS Excel 之前工作 我当前的连接字符串 提供程序 Microsoft ACE OLEDB 12 0 数据源 c myFolder myExc
  • 如何让 Solr 的拼写检查器忽略大小写?

    如何要求示例拼写检查器忽略大小写 我正在使用中显示的所有默认值demo http wiki apache org solr SpellCheckComponent Spell Checking Analysis 现在我看到如果我输入Anci
  • 如何轻松获取您正在处理的文件的网络路径?

    在 Excel 2003 中 我曾经在工具栏中添加了一个名为 地址 的命令 如果我没记错的话 它将显示我打开的文件的完全限定网络路径 例如 ads IT DEPT DFS data Users someguy somefile xls 当您
  • python 中不同级别的日志记录

    我想做一些我认为很简单的事情 实际上 对于 python 日志记录模块 我对日志记录感兴趣 命令行上的所有内容均处于命令给出的级别 行参数 并以固定的 DEBUG 级别记录到文件 创建两个具有不同级别的不同记录器不起作用 但是 设置添加到根