简体   繁体   English

来自 fileConfig 设置的 Python 日志记录错误

[英]Python logging error from fileConfig setup

I'm trying to setup logging for my web server using fileConfig , but I'm getting the following error on setup:我正在尝试使用fileConfig为我的 Web 服务器设置日志记录,但在设置时出现以下错误:

File "/home/my/project/server.py", line 32, in <module>  
    fileConfig(fname='logging.conf')  
File "/usr/lib/python3.7/logging/config.py", line 79, in fileConfig  
    handlers = _install_handlers(cp, formatters)  
File "/usr/lib/python3.7/logging/config.py", line 145, in _install_handlers  
    h = klass(*args, **kwargs)  
TypeError: __init__() missing 1 required positional argument: 'filename' 

Here's my logging.conf file:这是我的 logging.conf 文件:

[loggers]  
keys=dev,prod  

[handlers]  
keys=consoleHandler,fileHandler  

[formatters]  
keys=full,simple  

[logger_prod]  
level=INFO  
handlers=fileHandler  
qualname=prod  

[logger_dev]  
level=DEBUG  
handlers=consoleHandler  
qualname=dev  
propagate=0  

[handler_consoleHandler]  
class=StreamHandler  
level=DEBUG  
formatter=full  
args=(sys.stdout,)  

[handler_fileHandler]  
class=handlers.RotatingFileHandler  
formatter=full  
filename='logs/server.log'  
maxBytes=1500  
backupCount=20
  
[formatter_full]  
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s  

[formatter_simple]  
format=%(asctime)s - %(message)s  

...and here's my initialization: ...这是我的初始化:

fileConfig(fname='logging.conf')
    
if os.getenv('FLASK_ENV') == 'development':
    app.logger = logging.getLogger('dev')
else:
    app.logger = logging.getLogger('prod')

Just to add... the dev logger works fine, it logs to the console, so it's just the prod logger that's causing the problem.只是补充一下...... dev记录器工作正常,它记录到控制台,所以它只是导致问题的prod记录器。

I've also tried replacing the filename , maxBytes and backupCount options with args('logs/server.log','a',1500,20) like I've seen in some examples but with that I get this error:我也试过用args('logs/server.log','a',1500,20)替换filenamemaxBytesbackupCount选项,就像我在一些例子中看到的那样,但我得到了这个错误:

File "/home/my/project/server.py", line 32, in <module>  
    fileConfig(fname='logging.conf')  
File "/usr/lib/python3.7/logging/config.py", line 69, in fileConfig  
    cp.read(fname)  
File "/usr/lib/python3.7/configparser.py", line 696, in read  
    self._read(fp, filename)  
File "/usr/lib/python3.7/configparser.py", line 1110, in _read  
    raise e  
configparser.ParsingError: Source contains parsing errors: 'logging.conf'  
    [line 30]: "args('logs/server.log','a',1500,20)\n"

In you last attempt you have a typo, ie, a = after args is missing.在您最后一次尝试中,您有一个错字,即缺少args之后的=

The config below "works", ie, works but will give you another error.下面的配置“有效”,即有效但会给你另一个错误。

[loggers]
keys=dev,prod

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=full,simple

[logger_prod]
level=INFO
handlers=fileHandler
qualname=prod

[logger_dev]
level=DEBUG
handlers=consoleHandler
qualname=dev
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=full
args=(sys.stdout,)

[handler_fileHandler]
class=handlers.RotatingFileHandler
level=INFO
formatter=full
args=('logs/server.log','a',1500,20)

[formatter_full]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_simple]
format=%(asctime)s - %(message)s

Now you will get an error because you have not specified what the root logger should do.现在你会得到一个错误,因为你没有指定root记录器应该做什么。

See Can I have logging.ini file without root logger?请参阅我可以在没有 root 记录器的情况下使用 logging.ini 文件吗? for the error and ways to resolve it.对于错误和解决方法。

Your configuration file should look like this:您的配置文件应如下所示:

[loggers]
keys=root,dev,prod

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=full,simple

[logger_root]
level=NOTSET
handlers=consoleHandler

[logger_prod]
level=INFO
handlers=fileHandler
qualname=prod

[logger_dev]
level=DEBUG
handlers=consoleHandler
qualname=dev
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=full
args=(sys.stdout,)

[handler_fileHandler]
class=handlers.RotatingFileHandler
formatter=full
args=('logs/server.log', 'w', 1500, 20)

[formatter_full]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_simple]
format=%(asctime)s - %(message)s

https://docs.python.org/3/library/logging.config.html#configuration-file-format https://docs.python.org/3/library/logging.config.html#configuration-file-format

Instead反而

[handler_fileHandler]  
class=handlers.RotatingFileHandler  
formatter=full  
filename='logs/server.log'  
maxBytes=1500  
backupCount=20

Use

[handler_fileHandler]  
class=handlers.RotatingFileHandler  
formatter=full  
args=('logs/server.log', 'w')
maxBytes=1500  
backupCount=20

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM