日志相信大家都不陌生,不管是开发还是测试运维,多多少少应该都接触过日志。当然啦,软件出问题后,日志是定位问题最有效的手段之一,这就要求有一个好的日志格式,今天分享的就是用python实现自己的日志。
自定义日志类
python">import loggingclass 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 loggerself.logger.addHandler(fh)self.logger.addHandler(screen)
日志级别
debug级别最低,从debug到fatal,日志级别越来越高,fatal级别最高。当设置日志级别为其中某个(如INFO)时,比它级别低的日志(DEBUG)不会输出。
使用自定义日志类
1)直接使用
python">import loggingclass 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 loggerself.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:
python"># main.py
from log import Loggerif __name__ == '__main__':log = Logger('test.log', level='info')log.logger.info('Test for log')
此时,你也可以把日志模块(log目录)拷贝到Linux下使用,