2

I have 3 files in myapp folder:

myapp
 ->test.py
 -> hybrid.py
 ->config.yaml

I have developed a custom logging handler in hybrid.py file:

class WatchedTimedRotatingFileHandler(RotatingFileHandler, WatchedFileHandler):

    def __init__(self, filename, **kwargs):
        super().__init__(filename, **kwargs)
        self.dev, self.ino = -1, -1
        self._statstream()
    

    def emit(self, record):
        self.reopenIfNeeded()
        super().emit(record)

I just need to specify the WatchedTimedRotatingFileHandler class in config.yaml to configure the logging

config.yaml

version: 1

formatters:
  simple:
    format: "%(asctime)s %(name)s: %(message)s"
  extended:
    format: "%(asctime)s %(name)s %(levelname)s: %(message)s"

 handlers:
    console:
       class: logging.StreamHandler
       level: INFO
       formatter: simple

    file_handler:
       class: logging.handlers.RotatingFileHandler
       level: INFO
       filename: abc.log
       formatter: extended
       maxBytes: 100
       backupCount: 3

    file:
      (): hybrid.WatchedTimedRotatingFileHandler
      filename: test.log
      formatter: extended
      maxBytes: 100
      backupCount: 3   

loggers:
    dev:
      handlers: [console, file_handler,file]
    test:
      handlers: [file_handler]
    root:
      handlers: [file_handler]

I have used () to refer the user defined object from https://docs.python.org/3.6/library/logging.config.html#logging-config-dict-userdef

and similar question in stackoverflow but no luck.

but getting error:

Traceback (most recent call last):
File "C:\python3.6\lib\logging\config.py", line 558, in configure
handler = self.configure_handler(handlers[name])
File "C:\python3.6\lib\logging\config.py", line 704, in configure_handler
c = self.resolve(c)
File "C:\python3.6\lib\logging\config.py", line 378, in resolve
found = self.importer(used)
File "C:\Users\akshay.ajay.indalkar\Downloads\client9\hybrid.py", line 5, in <module>
EmailConfig.loadProperties()
File "C:\Users\akshay.ajay.indalkar\Downloads\client9\email_config.py", line 19, in loadProperties
EmailConfig.config.read(root_dir)
File "C:\python3.6\lib\configparser.py", line 694, in read
for filename in filenames:
TypeError: 'NoneType' object is not iterable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "test_yaml.py", line 9, in <module>
logging.config.dictConfig(log_cfg)
File "C:\python3.6\lib\logging\config.py", line 795, in dictConfig
dictConfigClass(config).configure()
File "C:\python3.6\lib\logging\config.py", line 566, in configure
'%r: %s' % (name, e))
ValueError: Unable to configure handler 'file': 'NoneType' object is not iterable
1
  • @GHETTO.CHiLD Can you please help me on this as you have solved similar issue earlier Commented Aug 9, 2020 at 11:51

1 Answer 1

0

Please see this thread: Python, logging: use custom handler with dictionary configuration?

Namely this answer: https://stackoverflow.com/a/5346703/5160481

In addition to solution above it must be said, that first you have to load yaml into dictionary, and then call dictConfig.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.