日志配置模板
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 日志配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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('严重')
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法