代码之家  ›  专栏  ›  技术社区  ›  Alter

python3.6日志记录-fileConfig给出TypeError

  •  1
  • Alter  · 技术社区  · 7 年前

    我想用 logging.config.fileConfig .ini fileConfig('logging_config.ini') :

    TypeError: expected str, bytes or os.PathLike object, not _io.TextIOWrapper
    

    代码:

    import logging
    from logging.config import fileConfig
    
    fileConfig('logging_config.ini')
    logger = logging.getLogger()
    logger.debug('often makes a very good meal of %s', 'visiting tourists')
    

    日志配置ini:

    [loggers]
    keys=tcp_server
    
    [handlers]
    keys=stream_handler,file_handler
    
    [formatters]
    keys=formatter
    
    [logger_root]
    level=DEBUG
    handlers=stream_handler
    
    [handler_stream_handler]
    class=StreamHandler
    level=DEBUG
    formatter=formatter
    args=(sys.stderr,)
    
    [handler_file_handler]
    class=FileHandler
    filename="tcp_server.log"
    level=DEBUG
    formatter=formatter
    args=(sys.stderr,)
    
    [formatter_formatter]
    format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
    

    完整错误消息:

    Traceback (most recent call last):
        fileConfig('logging_config.ini')
      File "C:\Program Files (x86)\Anaconda3\lib\logging\config.py", line 84, in fileConfig
        handlers = _install_handlers(cp, formatters)
      File "C:\Program Files (x86)\Anaconda3\lib\logging\config.py", line 148, in _install_handlers
        h = klass(*args)
      File "C:\Program Files (x86)\Anaconda3\lib\logging\__init__.py", line 1012, in __init__
        filename = os.fspath(filename)
    TypeError: expected str, bytes or os.PathLike object, not _io.TextIOWrapper
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   torek    7 年前

    当有人回答(但马上删除)时 .ini 文件错误。尤其是 args=(sys.stderr,) sys.stderr 作为 FileHandler ,当 需要包含日志文件名的字符串。这在 the documentation for using fileConfig . 请到 the top of the same page 文件配置 通常是不安全的,不适合很多用例。

    args 只会给你带来另一个错误 keys 设置在 [loggers] root 钥匙。它还应该列出您可能使用的任何其他键,例如 tcp_server.log -文件 文件处理程序 实例。那你可以 使用 logging.getLogger 具有处理程序的限定名。

    diff --git a/logging_config.ini b/logging_config.ini
    index 8614b9f..ee1a66b 100644
    --- a/logging_config.ini
    +++ b/logging_config.ini
    @@ -1,5 +1,5 @@
     [loggers]
    -keys=tcp_server
    +keys=root,tcp_server
    
     [handlers]
     keys=stream_handler,file_handler
    @@ -11,6 +11,12 @@ keys=formatter
     level=DEBUG
     handlers=stream_handler
    
    +[logger_tcp_server]
    +level=DEBUG
    +handlers=file_handler
    +propagate=0
    +qualname=whatever
    +
     [handler_stream_handler]
     class=StreamHandler
     level=DEBUG
    @@ -19,10 +25,9 @@ args=(sys.stderr,)
    
     [handler_file_handler]
     class=FileHandler
    -filename="tcp_server.log"
     level=DEBUG
     formatter=formatter
    -args=(sys.stderr,)
    +args=("tcp_server.log",)
    
     [formatter_formatter]
     format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
    diff --git a/tlog.py b/tlog.py
    index 12a645a..bc3f07e 100644
    --- a/tlog.py
    +++ b/tlog.py
    @@ -4,3 +4,5 @@ from logging.config import fileConfig
     fileConfig('logging_config.ini')
     logger = logging.getLogger()
     logger.debug('often makes a very good meal of %s', 'visiting tourists')
    +logger = logging.getLogger('whatever')
    +logger.debug('tcp thing')