Seeking for your advice, currently doing self studies regarding the Python Design Pattern. In chapter 2 I stock with this class. It has 2 module, logger_class.py and new_script_with_logger.py
for the module logger_class.py
class Logger(object):
"""A file-based message logger with the following properties
Attributes:
file_name: a string representing the full path of the log file to which this logger will write it messages
"""
def __init__(self, file_name):
"""Return a logger object whose file_name is * file_name*"""
self.file_name = file_name
def _write_log(self, level, msg):
"""Writes a message to the file_name for a specific Logger instance"""
with open(self.file_name, 'a') as log_file:
log_file.write('[{0} {1}\n'.format(level, msg))
def critical(self, level, msg):
self._write_log('CRITICAL', msg)
def error(self, level, msg):
self._write_log(self, level, msg)
def warn(self, level, msg):
self._write_log('WARN', msg)
def info(self, level, msg):
self._write_log('INFO', msg)
def debug(self, level, msg):
self._write_log('DEBUG', msg)
And here the other module new_script_with_logger.py
from logger_class import Logger
logger_object = Logger('/var/log/class_logger.log')
logger_object.info('this is an info message')
The above code is came from the book of "Practical Python Design Patterns Pythonic Solution to Common Problems by Wessel Badenhorst"
When I run the code of new_script_with_logger.py, I got error message from PyCharm IDE In the console command running it
python new_script_with_logger.py
The result is like this
Traceback (most recent call last):
File "C:\Users\Python Design Pattern\Practical_Design\Practical_Python_Design_PaTTERN\new_script_with_logger.py", line 4, in <module>
logger_object.info('this is an info message')
TypeError: Logger.info() missing 1 required positional argument: 'msg'
I'm newbie please respect and understand my post thank you in advance
Explanation of how the code run
There are multiple flaws in the definition of the Logger class.
_write_log
method is supposed to work as an "abstract method", a generic method that is supposed to do the work of logging no matter the level and the message.info
method is by nature forcing the level to be info.critical
to debug
) should have as an argument the log level, as they already define it by construction.error
method is also wrong in the way it calls the _write_log
with a generic level, (and the self argument at the beginning is redundant)Here is a revised version of the code you provided:
class Logger(object):
"""A file-based message logger with the following properties
Attributes:
file_name: a string representing the full path of the log file to which this logger will write it messages
"""
def __init__(self, file_name):
"""Return a logger object whose file_name is * file_name*"""
self.file_name = file_name
def _write_log(self, level, msg):
"""Writes a message to the file_name for a specific Logger instance"""
with open(self.file_name, 'a') as log_file:
log_file.write('[{0}] {1}\n'.format(level, msg))
def critical(self, msg):
self._write_log('CRITICAL', msg)
def error(self, msg):
self._write_log('ERROR', msg)
def warn(self, msg):
self._write_log('WARN', msg)
def info(self, msg):
self._write_log('INFO', msg)
def debug(self, msg):
self._write_log('DEBUG', msg)
Now you can see that there is a consistent use of the _write_log
accross every application below it. If you have more question feel free to ask them in comments