Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文件处理程序的日志级别与记录器的日志级别_Python_Logging - Fatal编程技术网

Python 文件处理程序的日志级别与记录器的日志级别

Python 文件处理程序的日志级别与记录器的日志级别,python,logging,Python,Logging,要在不使用basicConfig的情况下在Python中设置日志记录,我们将执行以下步骤: 设置一个文件处理程序 设置文件处理程序的日志记录级别 设置格式化程序 将文件处理程序指向格式化程序 获取记录器对象 设置记录器对象的日志记录级别 将文件处理程序作为处理程序添加到记录器对象 在记录器上使用.info()、.warning()等方法 这些步骤由以下代码执行: import logging file_handler = logging.FileHandler('./out.log', 'a'

要在不使用
basicConfig
的情况下在Python中设置日志记录,我们将执行以下步骤:

  • 设置一个文件处理程序
  • 设置文件处理程序的日志记录级别
  • 设置格式化程序
  • 将文件处理程序指向格式化程序
  • 获取记录器对象
  • 设置记录器对象的日志记录级别
  • 将文件处理程序作为处理程序添加到记录器对象
  • 在记录器上使用
    .info()
    .warning()
    等方法
  • 这些步骤由以下代码执行:

    import logging
    
    file_handler = logging.FileHandler('./out.log', 'a')
    file_handler.setLevel(logging.DEBUG)
    
    format_string = '%(asctime)s\t%(levelname)s: %(message)s'
    formatter = logging.Formatter(format_string)
    file_handler.setFormatter(formatter)
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    
    logger.addHandler(file_handler)
    
    logger.info('visible info')
    logger.debug('invisible debug')
    

    为文件处理程序设置日志记录级别和为记录器设置日志记录级别之间有什么区别?

    好的,下面是一些代码:

    import logging
    
    
    # Declare a function to log all 5 levels with different information
    def log_all_levels(logger):
        logger.debug("Debug from logger {}".format(logger.name))
        logger.info("Info from logger {}".format(logger.name))
        logger.warning("Warning from logger {}".format(logger.name))
        logger.error("Error from logger {}".format(logger.name))
        logger.critical("Fatal from logger {}".format(logger.name))
    
    
    # This file handler will track errors from all loggers
    all_errors_handler = logging.FileHandler('errors.log')
    all_errors_handler.setLevel(logging.ERROR)
    
    # This file handler will only be used in a specific region of code
    foo_info_handler = logging.FileHandler('foo_info.log')
    foo_info_handler.setLevel(logging.INFO)
    foo_info_handler.addFilter(lambda r: r.levelno == logging.INFO)
    
    # The following loggers will be used in the main execution
    foo_logger = logging.getLogger("Foo")
    nameless_logger = logging.getLogger("nameless")
    foo_logger.setLevel(logging.INFO)
    nameless_logger.setLevel(logging.DEBUG)
    loggers = (foo_logger, nameless_logger)
    
    # Set each logger up to use the file handlers
    # Each logger can have many handlers, each handler can be used by many loggers
    for logger in loggers:
        logger.addHandler(all_errors_handler)
        debug_file_handler = logging.FileHandler('{}.log'.format(logger.name))
        debug_file_handler.setLevel(logging.DEBUG)
        logger.addHandler(debug_file_handler)
        if logger.name == "Foo":
            logger.addHandler(foo_info_handler)
    
    
    # Let's run some logging operations
    for logger in loggers:
        log_all_levels(logger)
    
    有两个记录器-
    foo\u logger
    设置为信息级别,而
    nameless\u logger
    设置为调试级别。它们都使用错误和调试处理程序,但是只有
    foo\u记录器
    使用
    foo\u文件处理程序
    。现在有不同级别的记录器和文件处理程序,以多对多关系连接在一起

    您可以发现:

  • 错误。日志将包含来自两个记录器的错误。对于真实场景来说,这是不言自明的——读取只包含错误的日志有助于调试代码
  • Foo.log
    nameless.log
    将包含关于这些记录器的所有可能信息,并考虑其级别。因此,前者将包含信息和更高级别,而后者将跟踪调试和更高级别。每个对象的日志记录可能会创建大量文件,但在尝试检测某些特定于对象的错误时,这可能是至关重要的
  • foo_info
    是一个非常特殊的文件处理程序,它只允许从相关记录器获取信息级别。当您进入一个潜在的不安全或未测试的代码区域,并且希望查看该代码块中到底发生了什么,而不必浏览所有程序日志时,这样的文件可以起到救生作用
  • 您还可以通过日志记录做许多其他事情—设置您自己的日志记录规则、创建日志记录层次结构、创建日志记录工厂—可能性是无穷的。日志应该允许灵活性——例如,允许记录器对象和文件处理程序具有不同的单独日志级别,并允许程序员根据需要将它们组合在一起


    我希望小代码练习和我的解释能够消除任何进一步的疑问-但是如果您还需要更多的示例,我建议您查看或查看。这看起来很像一个家庭作业或面试问题。关于您的编辑-一个文件处理程序可以被许多日志记录者使用,因此可以设置不同的级别。例如,如果您将文件处理程序设置为仅接受
    logger.ERROR
    ,但希望任何记录器使用该文件(假设它是全局错误日志),则可以让每个记录器使用其自己的日志级别,同时将所有错误重定向到该文件。你想让我把这作为一个答案并加上一个例子吗?@Kacperflorianski让我问第二个问题,因为你(还)告诉了我一些我不知道的事情。@Kacperflorianski,如果可能的话,你能加上你的评论作为这个问题的答案吗,在对象图上?明天我将深入查看,但乍一看它在逻辑上是正确的。从技术上讲,文件处理程序可以指向同一个文件(但通常不会这样做),我认为Python日志只提供4个级别(调试、信息、警告和错误)。我将在这里发布一个例子,希望能回答你的第三个问题。