kwikness
kwikness

Reputation: 1445

Simple Rotating Python Logger (RotatingFileHandler)

I'm trying to write a simple logger but I'm getting an exception thrown. I'd like some advice on why this exception's getting thrown, but will also appreciate some design suggestions (keeping in mind that i'd like to keep this simple).

Code:

import logging
import logging.handlers

class Logger:

    @staticmethod
    def log_to_file(logText):

        logFile = logging.handlers.RotatingFileHandler('/var/log/sosms/sosmsd.log', 'a', 1000, 5)
        formatter = logging.Formatter()
        logFile.setFormatter(formatter)

        logFile.emit(logText)

        return

Output:

kyle@boxmunch:/var/log/sosms$ /etc/rc.local
Traceback (most recent call last):
  File "/usr/lib/python2.7/logging/handlers.py", line 77, in emit
     if self.shouldRollover(record):
   File "/usr/lib/python2.7/logging/handlers.py", line 156, in shouldRollover
    msg = "%s\n" % self.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 719, in format
    return fmt.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 464, in format
    record.message = record.getMessage()
AttributeError: 'str' object has no attribute 'getMessage'
Traceback (most recent call last):
  File "/git/sosms/sosmsd/Main.py", line 10, in <module>
    Logger.Logger.log_to_file('SOSMSD starting..')
  File "/git/sosms/sosmsd/Logger.py", line 14, in log_to_file
    logFile.emit(logText)
  File "/usr/lib/python2.7/logging/handlers.py", line 83, in emit
    self.handleError(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 799, in handleError
    record.filename, record.lineno))
AttributeError: 'str' object has no attribute 'filename'

Upvotes: 0

Views: 8810

Answers (1)

oxc
oxc

Reputation: 687

Because the handler's .emit() takes a record, not a string.

http://docs.python.org/library/logging.handlers.html

You probably don't want to create your own logger class, just retrieve one using Logging.getLogger(__name__) (or similar) and call the appropriate method (.error(logText) for example).
EDIT: And you definitely don't want to create a new handler every time you log something, it normally should be created once per application. For simple cases, you're can simply use logging.basicConfig().

See http://docs.python.org/library/logging.html

Upvotes: 3

Related Questions