Python logging error from fileConfig setup

Viewed 1542

I'm trying to setup logging for my web server using fileConfig, but I'm getting the following error on setup:

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:

[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.

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:

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"
3 Answers

In you last attempt you have a typo, i.e., a = after args is missing.

The config below "works", i.e., 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.

See Can I have logging.ini file without root logger? 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

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
Related