1,通用日志配置
import logging import os class My_log(object): logg = logging.getLogger(__name__) logg.setLevel(logging.INFO) path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) from logging.handlers import RotatingFileHandler fh = RotatingFileHandler(filename=path + '/my_log/test.log', mode='a', maxBytes=100 * 1024 * 1024, #每个日志文件100兆 backupCount=5, encoding='utf8') # fh = logging.FileHandler(path + '/my_log/test.log', mode='a') fh.setLevel(logging.INFO) log_format = logging.Formatter('%(asctime)s %(filename)s %(lineno)s %(levelname)s %(message)s') fh.setFormatter(log_format) logg.addHandler(fh) if __name__ == '__main__': log = My_log() log.logg.error('这是一个错误信息')
分开存储日志文件
import logging import os class My_log(object): def __init__(self,name): self.name = name @property def logger(self): logg = logging.getLogger(__name__) logg.setLevel(logging.INFO) path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) from logging.handlers import RotatingFileHandler fh = RotatingFileHandler(filename=path + '/' + self.name, mode='a', maxBytes=100 * 1024 * 1024, # 每个日志文件100兆 backupCount=5, encoding='utf8') # fh = logging.FileHandler(path + '/my_log/test.log', mode='a') fh.setLevel(logging.INFO) log_format = logging.Formatter('%(asctime)s %(filename)s %(lineno)s %(levelname)s %(message)s') fh.setFormatter(log_format) logg.addHandler(fh) return logg if __name__ == '__main__': log1 = My_log('error.log') log1.logger.error('this is a error log') log = My_log('info.log') log.logger.error('this is a info log')
2,flask 日志配置
import logging,os def create_logger(app): logging_file_dir = app.config['LOGGING_FILE_DIR'] flask_app_log = logging.getLogger('flask.app') flask_app_log.setLevel(logging.INFO) console_log_handler = logging.StreamHandler() # 控制台处理器 console_log_formatter = logging.Formatter( fmt='%(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s ') console_log_handler.setFormatter(console_log_formatter) flask_app_log.addHandler(console_log_handler) from logging.handlers import RotatingFileHandler file_log_handler = RotatingFileHandler( filename=os.path.join(logging_file_dir,'chat.log'), maxBytes=100 * 1024 * 1024, backupCount=10) file_log_format = logging.Formatter(fmt='%(asctime)s %(name)s %(levelname)s %(lineno)d %(message)s ') file_log_handler.setFormatter(file_log_format) # 单独设置文件日志的级别 # file_log_handler.setLevel(logging.INFO) flask_app_log.addHandler(file_log_handler) #调用方式,在init中 # 添加日志 app.config['PROPAGATE_EXCEPTIONS'] = False #设置传播异常,控制台和日志文件都有, from utils.log import create_logger create_logger(app)
4,分开存储日志,可以按时间分开

import logging from logging import handlers class Logger(object): level_relations = { 'debug':logging.DEBUG, 'info':logging.INFO, 'warning':logging.WARNING, 'error':logging.ERROR, 'crit':logging.CRITICAL }#日志级别关系映射 def __init__(self,filename,level='info',when='D',backCount=3,fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'): self.logger = logging.getLogger(filename) format_str = logging.Formatter(fmt)#设置日志格式 self.logger.setLevel(self.level_relations.get(level))#设置日志级别 sh = logging.StreamHandler()#往屏幕上输出 sh.setFormatter(format_str) #设置屏幕上显示的格式 th = handlers.TimedRotatingFileHandler(filename=filename,when=when,backupCount=backCount,encoding='utf-8')#往文件里写入#指定间隔时间自动生成文件的处理器 #实例化TimedRotatingFileHandler #interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种: # S 秒 # M 分 # H 小时、 # D 天、 # W 每星期(interval==0时代表星期一) # midnight 每天凌晨 th.setFormatter(format_str)#设置文件里写入的格式 self.logger.addHandler(sh) #把对象加到logger里 self.logger.addHandler(th) if __name__ == '__main__': log = Logger('all.log',level='debug') log.logger.debug('debug') log.logger.info('info') log.logger.warning('警告') log.logger.error('报错') log.logger.critical('严重') Logger('error.log', level='error').logger.error('error')
补充bug: 本人用定时任务启动脚本,在写如日志时,每启动一次,写入的日志就会多重复一行,第一次运行写入一行日志,第二次写入两行,第三次写入三行,
修改bug :在logg.addhandler 之前清空addhandler
修改bug 版本:
class Logger(object): level_relations = { 'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING, 'error': logging.ERROR, 'crit': logging.CRITICAL } # 日志级别关系映射 def __init__(self, filename, level='info', when='D', backCount=3, fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'): self.logger = logging.getLogger(filename) format_str = logging.Formatter(fmt) # 设置日志格式 self.logger.setLevel(self.level_relations.get(level)) # 设置日志级别 sh = logging.StreamHandler() # 往屏幕上输出 sh.setFormatter(format_str) # 设置屏幕上显示的格式 th = handlers.TimedRotatingFileHandler(filename=filename, when=when, backupCount=backCount,encoding='utf-8') # 往文件里写入#指定间隔时间自动生成文件的处理器 # 实例化TimedRotatingFileHandler # interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种: # S 秒 # M 分 # H 小时、 # D 天、 # W 每星期(interval==0时代表星期一) # midnight 每天凌晨 th.setFormatter(format_str) # 设置文件里写入的格式 self.logger.handlers.clear() self.logger.addHandler(sh) # 把对象加到logger里 self.logger.addHandler(th) if __name__ == '__main__': all_log_path = BASE_PATH + '/log/all.log' all_log = Logger(all_log_path, level='debug') error_log = Logger('error.log', level='error') error_log.logger.error('error') all_log.logger.debug('debug') all_log.logger.info('info') all_log.logger.warning('警告') all_log.logger.error('报错') all_log.logger.critical('严重')