logging.config.dictConfig的完整示例在哪里?

Dav*_*ver 107 python logging python-logging

我想使用dictConfig,但文档有点抽象.我在哪里可以找到使用的字典的具体,复制+粘贴示例dictConfig

Dav*_*ave 170

这边怎么样!

LOGGING_CONFIG = { 
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': { 
        'standard': { 
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': { 
        'default': { 
            'level': 'INFO',
            'formatter': 'standard',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',  # Default is stderr
        },
    },
    'loggers': { 
        '': {  # root logger
            'handlers': ['default'],
            'level': 'INFO',
            'propagate': False
        },
        'my.packg': { 
            'handlers': ['default'],
            'level': 'WARNING',
            'propagate': False
        },
        '__main__': {  # if __name__ == '__main__'
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': False
        },
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 还有另一个指定`root`记录器的地方:在字典的顶层.它在[docs](https://docs.python.org/2/library/logging.config.html#logging-config-dictschema)中描述,优先于`['loggers'] [''] `当两者都存在时,但在我看来,`['loggers'] ['']`更符合逻辑.另见讨论[此处](http://stackoverflow.com/questions/20258986/root-logger-in-dictconfig) (9认同)
  • python logging.config 文档中所有那些简洁、漂亮的 YAML 片段都无法直接读取。无赖。 (3认同)

the*_*heo 35

接受的答案很好!但如果一个人可以从不那么复杂的事情开始呢?日志模块是非常强大的东西,文档有点压倒性,特别是对于新手.但是一开始你不需要配置格式化程序和处理程序.当你弄清楚你想要什么时,你可以添加它.

例如:

import logging.config

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'loggers': {
        '': {
            'level': 'INFO',
        },
        'another.module': {
            'level': 'DEBUG',
        },
    }
}

logging.config.dictConfig(DEFAULT_LOGGING)

logging.info('Hello, log')
Run Code Online (Sandbox Code Playgroud)

  • 这是更相关/有用的例子,至少就我而言。正是最后的“logging.info('Hello, log')”让我觉得事情很顺利。文档中令人困惑的是,使用 dictConfig,我们不再需要执行“getLogger”或任何这些操作。 (2认同)
  • @MikeWilliamson`getLogger`始终是可选的。直接使用`logging.info()`方法时,将使用根记录器,而`getLogger()`中,您可以具有不同的记录器,并具有不同的名称和级别。 (2认同)

Bre*_*ent 17

有一个更新的示例,声明埋在日志记录手册示例中的logging.config.dictConfig()字典模式。从该食谱链接向上滚动以查看 dictConfig() 的用法。

RotatingFileHandler以下是使用 StreamHandler 并使用自定义的format和记录到 stdout 和“logs”子目录的示例用例datefmt

  1. 导入模块并建立“logs”子目录的跨平台绝对路径

    from os.path import abspath, dirname, join
    import logging
    from logging.config import dictConfig
    base_dir = abspath(dirname(__file__))
    logs_target = join(base_dir + "\logs", "python_logs.log")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根据字典模式文档建立模式。

    logging_schema = {
        # Always 1. Schema versioning may be added in a future release of logging
        "version": 1,
        # "Name of formatter" : {Formatter Config Dict}
        "formatters": {
            # Formatter Name
            "standard": {
                # class is always "logging.Formatter"
                "class": "logging.Formatter",
                # Optional: logging output format
                "format": "%(asctime)s\t%(levelname)s\t%(filename)s\t%(message)s",
                # Optional: asctime format
                "datefmt": "%d %b %y %H:%M:%S"
            }
        },
        # Handlers use the formatter names declared above
        "handlers": {
            # Name of handler
            "console": {
                # The class of logger. A mixture of logging.config.dictConfig() and
                # logger class-specific keyword arguments (kwargs) are passed in here. 
                "class": "logging.StreamHandler",
                # This is the formatter name declared above
                "formatter": "standard",
                "level": "INFO",
                # The default is stderr
                "stream": "ext://sys.stdout"
            },
            # Same as the StreamHandler example above, but with different
            # handler-specific kwargs.
            "file": {  
                "class": "logging.handlers.RotatingFileHandler",
                "formatter": "standard",
                "level": "INFO",
                "filename": logs_target,
                "mode": "a",
                "encoding": "utf-8",
                "maxBytes": 500000,
                "backupCount": 4
            }
        },
        # Loggers use the handler names declared above
        "loggers" : {
            "__main__": {  # if __name__ == "__main__"
                # Use a list even if one handler is used
                "handlers": ["console", "file"],
                "level": "INFO",
                "propagate": False
            }
        },
        # Just a standalone kwarg for the root logger
        "root" : {
            "level": "INFO",
            "handlers": ["file"]
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. logging使用字典模式进行配置

    dictConfig(logging_schema)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 尝试一些测试用例,看看一切是否正常工作

    if __name__ == "__main__":
        logging.info("testing an info log entry")
        logging.warning("testing a warning log entry")
    
    Run Code Online (Sandbox Code Playgroud)

[编辑回答@baxx的问题]

  1. 要在代码库中重用此设置,请在调用 dictConfig() 的脚本中实例化记录器,然后将该记录器导入到其他地方

     # my_module/config/my_config.py
     dictConfig(logging_schema)
     my_logger = getLogger(__name__)
    
    Run Code Online (Sandbox Code Playgroud)

然后在另一个脚本中

    from my_module.config.my_config import my_logger as logger
    logger.info("Hello world!")
Run Code Online (Sandbox Code Playgroud)


Yog*_*dav 16

流处理程序、文件处理程序、旋转文件处理程序和 SMTP 处理程序的示例

from logging.config import dictConfig

LOGGING_CONFIG = {
    'version': 1,
    'loggers': {
        '': {  # root logger
            'level': 'NOTSET',
            'handlers': ['debug_console_handler', 'info_rotating_file_handler', 'error_file_handler', 'critical_mail_handler'],
        },
        'my.package': { 
            'level': 'WARNING',
            'propagate': False,
            'handlers': ['info_rotating_file_handler', 'error_file_handler' ],
        },
    },
    'handlers': {
        'debug_console_handler': {
            'level': 'DEBUG',
            'formatter': 'info',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',
        },
        'info_rotating_file_handler': {
            'level': 'INFO',
            'formatter': 'info',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'info.log',
            'mode': 'a',
            'maxBytes': 1048576,
            'backupCount': 10
        },
        'error_file_handler': {
            'level': 'WARNING',
            'formatter': 'error',
            'class': 'logging.FileHandler',
            'filename': 'error.log',
            'mode': 'a',
        },
        'critical_mail_handler': {
            'level': 'CRITICAL',
            'formatter': 'error',
            'class': 'logging.handlers.SMTPHandler',
            'mailhost' : 'localhost',
            'fromaddr': 'monitoring@domain.com',
            'toaddrs': ['dev@domain.com', 'qa@domain.com'],
            'subject': 'Critical error with application name'
        }
    },
    'formatters': {
        'info': {
            'format': '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
        },
        'error': {
            'format': '%(asctime)s-%(levelname)s-%(name)s-%(process)d::%(module)s|%(lineno)s:: %(message)s'
        },
    },

}

dictConfig(LOGGING_CONFIG)
Run Code Online (Sandbox Code Playgroud)


天才小*_*小飞猫 6

我在下面找到了Django v1.11.15默认配置,希望它有帮助

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[%(server_time)s] %(message)s',
        }
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个例子很好,但我认为要在公认的答案之外脱颖而出,一些解释会有所帮助。 (4认同)