日志相信大家都不陌生,不管是开发还是测试运维,多多少少应该都接触过日志。当然啦,软件出问题后,日志是定位问题最有效的手段之一,这就要求有一个好的日志格式,今天分享的就是用python实现自己的日志。
自定义日志类
如下是一个用python实现的日志类
Logger.py
import logging
class Logger(object):
level_relations = {
'debug': logging.DEBUG,
'info': logging.INFO,
'warn': logging.WARNING,
'error': logging.ERROR,
'fatal': logging.FATAL
}
def __init__(self, filename, level='info', fmt='[%(asctime)s - %(levelname)s] - %(message)s'):
self.logger = logging.getLogger()
self.logger.setLevel(self.level_relations[level])
# 设置日志输出格式
formatter = logging.Formatter(fmt)
# 写入日志文件
fh = logging.FileHandler(filename)
fh.setFormatter(formatter)
# 输出到屏幕
screen = logging.StreamHandler()
screen.setFormatter(formatter)
# add handler to logger
self.logger.addHandler(fh)
self.logger.addHandler(screen)
日志级别
debug级别最低,从debug到fatal,日志级别越来越高,fatal级别最高。当设置日志级别为其中某个(如INFO)时,比它级别低的日志(DEBUG)不会输出。


使用自定义日志类
1)直接使用
直接将日志类放在python源文件中,如:
import logging
class Logger(object):
level_relations = {
'debug': logging.DEBUG,
'info': logging.INFO,
'warn': logging.WARNING,
'error': logging.ERROR,
'fatal': logging.FATAL
}
def __init__(self, filename, level='info', fmt='[%(asctime)s - %(levelname)s] - %(message)s'):
self.logger = logging.getLogger()
self.logger.setLevel(self.level_relations[level])
# 设置日志输出格式
formatter = logging.Formatter(fmt)
# 写入日志文件
fh = logging.FileHandler(filename)
fh.setFormatter(formatter)
# 输出到屏幕
screen = logging.StreamHandler()
screen.setFormatter(formatter)
# add handler to logger
self.logger.addHandler(fh)
self.logger.addHandler(screen)
if __name__ == '__main__':
log = Logger('test.log', level='info')
log.logger.info('Test for log')

2)日志类作为模块使用
推荐使用这种方式,将日志和其他部分的代码分开,降低耦合性。
你可能使用如下的目录结构,将日志类单独放在log目录下,在其他地方如main.py中使用

注意,log目录下除了日志类,还多了一个__init__.py,如果没有该文件,使用import导入Logger模块时,会报错日志模块无法调用。
在python中,__init__py标识了一个目录是python中的包(package),这意味着你可以使用import语句来导入这个目录中的模块或包。
该文件中的内容也非常简单

至此,已经可以在外部使用log目录下的日志类。
单独写一个main.py:
# main.py
from log import Logger
if __name__ == '__main__':
log = Logger('test.log', level='info')
log.logger.info('Test for log')
此时,你也可以把日志模块(log目录)拷贝到Linux下使用,

806






