Tejas
Tejas

Reputation: 309

Why non-root logger is not writing any log to log file?

I want to write into two log files by using two loggers with following .ini config file:

[loggers]
keys=root,teja

[handlers]
keys=fileHandler,tejaFileHandler

[formatters]
keys=simpleFormatter

[logger_teja]
level=DEBUG
handlers=tejaFileHandler
qualname='tejaLogger'


[logger_root]
level=DEBUG
handlers=fileHandler

[handler_fileHandler]
class=logging.FileHandler
level=DEBUG
formatter=simpleFormatter
args=("error.log", "a")

[handler_tejaFileHandler]
class=logging.FileHandler
level=DEBUG
formatter=simpleFormatter
args=("teja.log", "a")

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

And I am using this configuration in my python code as

import logging
import logging.config
# load my module

import my_module

# load the logging configuration

logging.config.fileConfig('logging.ini')

logger1=logging.getLogger('root')
logger1.info('Hi how are you?')

logger2=logging.getLogger('teja')
logger2.debug('checking teja logger?')

I see that logs are written to error.log file whereas no logs are written to teja.log file. Please correct me if I am doing something silly...

Upvotes: 2

Views: 921

Answers (2)

Martijn Pieters
Martijn Pieters

Reputation: 1122132

You named your logger object 'tejaLogger':

[logger_teja]
level=DEBUG
handlers=tejaFileHandler
qualname='tejaLogger'
#        ^^^^^^^^^^^^

Note that the quotes are part of the name.

but your test code picks up teja instead:

logger2=logging.getLogger('teja')

Rename one or the other; although you could use logging.getLogger("'tejaLogger'") you probably want to drop the quotes and / or rename the logger to what you expected it to be:

[logger_teja]
level=DEBUG
handlers=tejaFileHandler
qualname=teja

Upvotes: 2

matsjoyce
matsjoyce

Reputation: 5844

It turns out that the problem is on this line (in the [logger_teja] section):

qualname='tejaLogger'

If you add this to your code (it prints all the current loggers):

print(logging.Logger.manager.loggerDict)

You get:

{"'tejaLogger'": <logging.Logger object at 0x7f89631170b8>}

Which means that your logger is called literally 'tejaLogger'. Using:

logger2=logging.getLogger("'tejaLogger'")`

Actually works fine. Either do that, or change qualname='tejaLogger' to qualname=teja.

Upvotes: 1

Related Questions