背景介绍:
首先项目中在app文件夹外建立了logs文件夹,并在logs文件夹下建立admin.log,想再建立一个日志文件用来记录平常的一些操作。
app_root = os.path.dirname(__file__)
project_root = os.path.dirname(app_root)
file_handler = RotatingFileHandler(os.path.join(project_root, 'logs', 'admin.log'),maxBytes=100 * 1024 * 1024,
backupCount=10, encoding='utf-8')
file_handler.setLevel(logging.INFO)
file_formatter = logging.Formatter('[%(asctime)s] %(levelname)s in %(module)s %(lineno)d: %(message)s')
file_handler.setFormatter(file_formatter)
app.logger.addHandler(file_handler)
技术实现:
首先建立一个setup_logger函数可以用来创建logger与日志文件:
import logging
from logging.handlers import RotatingFileHandler
import os
app_root = os.path.dirname(__file__)
project_root = os.path.dirname(app_root)
def setup_logger(logger_name, log_file=os.path.join(project_root, 'logs', 'operation.log'), level=logging.INFO):
l = logging.getLogger(logger_name)
formatter = logging.Formatter('%(asctime)s : %(message)s')
# fileHandler = logging.FileHandler(log_file, mode='w')
fileHandler = RotatingFileHandler(log_file, maxBytes=100 * 1024 * 1024,
backupCount=10, encoding='utf-8')
fileHandler.setFormatter(formatter)
streamHandler = logging.StreamHandler()
streamHandler.setFormatter(formatter)
l.setLevel(level)
l.addHandler(fileHandler)
l.addHandler(streamHandler)
return l
然后在每一个需要的模块中创建不同的logger
from app.utils.log import setup_logger
operation_log = setup_logger('a') #这里的logger_name 一定不能够重复
operation_log.info('this is a')
from app.utils.log import setup_logger
operation_log = setup_logger('b')
operation_log.info('this is b')
from app.utils.log import setup_logger
operation_log = setup_logger('c')
operation_log.info('this is c')
这样就可以在不同的模块中写入同一个日志文件中了。
打印的日志总是有重复输出的原因是,建立的logger名字相同了,所以会打印多次
参考博客:
https://blog.csdn.net/sinat_42483341/article/details/102981661