9

I'm trying to write a module to use it in different scripts

import logging
from logging.handlers import RotatingFileHandler


_logger_name = "Nagios"
_print_format = "%(asctime)s - %(levelname)s - %(message)s"
_level = logging.DEBUG

class Log():


    def __init__(self,log_file,logger_name=_logger_name,level=_level):
        self.log_file = log_file
        self.logger_name = logger_name
        self.level = level

    def getLog(self):

        """
        Return the logging object

        """
       _logger = logging.getLogger(self.logger_name)
       _logger.setLevel(self.level)
       _logger.addHandler(self._rotateLog())

       return _logger

    def _rotateLog(self):

       """
       Rotating the log files if it exceed the size
       """
       rh = RotatingFileHandler(self.log_file,
                             maxBytes=20*1024*1024, backupCount=2)
       formatter = logging.Formatter(_print_format)
       rh.setFormatter(formatter)
       return rh

log = Log("kdfnknf").getLog()
log("hello")

I see the following error:

Traceback (most recent call last):
File "nagiosLog.py", line 45, in <module>
  log("hello")
TypeError: 'Logger' object is not callable

Any idea why I'm getting this error,

When debugged using pdb I do see it returns the object and printing the dir(log) I don't see the Logger module in it.

Am I missing something here

3 Answers 3

10

log("Hello")

This is wrong. Correct is

log.info("Hello")

log must be printed with logging level i.e. info/error/warning

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

Comments

3

See the logging docs:

You have to use a function, you can't just call Logger:

Logger.info(msg, *args, **kwargs)

Logs a message with level INFO on this logger. The arguments are interpreted as for debug().

or

Logger.warning(msg, *args, **kwargs)

Logs a message with level WARNING on this logger. The arguments are >interpreted as for debug().

so instead, do:

log.info("Test info level logging...")

Comments

0

I had the same problem as OP. Old instructions on implementing custom logging levels will have code that calls the logger constructor, instead of the log method. The newer-than-that-but-not-all-that-new functionality is to use self._log.log(level, et al...

Edit to add: so, instead of log("hello") you'd need to call log.log(logging.INFO, "hello") or write a wrapper for that function in the Log class that hardcoded the level you want everything logged at and takes only the the message.

1 Comment

this is the reason he's getting "logger module not callable" he's followed outdated instructions on how to use the logger. you can't call the constructor anymore to log to a file, you have to call the "log" method of the logger.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.