如何解决python:如何配置多个记录器以记录到同一个文件
我有三个记录器记录到同一个文件
Case1 在这里,我只定义了一次处理程序,稍后将其添加到所有记录器中。它显示了正确的结果
import pytz
import datetime
import logging
class Formatter(logging.Formatter):
"""override logging.Formatter to use an aware datetime object"""
def converter(self,timestamp):
#dt = datetime.datetime.fromtimestamp(timestamp)
#we use
dt = datetime.datetime.utcnow()
current_time_utc = pytz.utc.localize(dt)
tzinfo = pytz.timezone('America/New_York')
current_time_time_zone = current_time_utc.astimezone(tzinfo)
#print(current_time_time_zone)
return current_time_time_zone
def formatTime(self,record,datefmt=None):
dt = self.converter(record.created)
if datefmt:
s = dt.strftime(datefmt)
else:
try:
s = dt.isoformat(timespec='milliseconds')
except TypeError:
s = dt.isoformat()
return s
import logging
from logging.handlers import RotatingFileHandler
filename1 = "./file.log"
handler = RotatingFileHandler(filename1,mode='a',maxBytes=400,backupCount=10,encoding='utf-8',delay=0)
handler.setLevel(logging.INFO)
handler.setFormatter(Formatter("\n%(asctime)s:::%(levelname)-8s:::%(message)s"))
# logger1
logger1 = logging.getLogger('name1')
logger1.setLevel(logging.INFO)
logger1.addHandler(handler)
#logger2
logger2 = logging.getLogger('name2')
logger2.setLevel(logging.INFO)
logger2.addHandler(handler)
#logger3
logger3 = logging.getLogger('name3')
logger3.setLevel(logging.INFO)
logger3.addHandler(handler)
for i in range(0,100):
logger1.info("form logging1")
logger2.info("form logging2")
logger3.info("form logging3")
# run this command to concatenate the logs
# python test.py; find ./ -name "file.*" | sort -r -V | xargs awk '(FNR==1){print ">> " FILENAME " <<"}1' > all_logs_test.txt
结果:合并所有日志
>> ./file.log.10 <<
2021-03-09T22:48:42.229-05:00:::INFO :::form logging1
2021-03-09T22:48:42.229-05:00:::INFO :::form logging2
2021-03-09T22:48:42.229-05:00:::INFO :::form logging3
2021-03-09T22:48:42.229-05:00:::INFO :::form logging1
2021-03-09T22:48:42.230-05:00:::INFO :::form logging2
2021-03-09T22:48:42.230-05:00:::INFO :::form logging3
>> ./file.log.9 <<
2021-03-09T22:48:42.230-05:00:::INFO :::form logging1
2021-03-09T22:48:42.230-05:00:::INFO :::form logging2
2021-03-09T22:48:42.230-05:00:::INFO :::form logging3
2021-03-09T22:48:42.230-05:00:::INFO :::form logging1
2021-03-09T22:48:42.230-05:00:::INFO :::form logging2
2021-03-09T22:48:42.231-05:00:::INFO :::form logging3
>> ./file.log.8 <<
2021-03-09T22:48:42.231-05:00:::INFO :::form logging1
2021-03-09T22:48:42.231-05:00:::INFO :::form logging2
2021-03-09T22:48:42.231-05:00:::INFO :::form logging3
2021-03-09T22:48:42.231-05:00:::INFO :::form logging1
2021-03-09T22:48:42.231-05:00:::INFO :::form logging2
2021-03-09T22:48:42.231-05:00:::INFO :::form logging3
>> ./file.log.7 <<
2021-03-09T22:48:42.232-05:00:::INFO :::form logging1
2021-03-09T22:48:42.232-05:00:::INFO :::form logging2
2021-03-09T22:48:42.232-05:00:::INFO :::form logging3
2021-03-09T22:48:42.232-05:00:::INFO :::form logging1
2021-03-09T22:48:42.233-05:00:::INFO :::form logging2
2021-03-09T22:48:42.233-05:00:::INFO :::form logging3
>> ./file.log.6 <<
2021-03-09T22:48:42.233-05:00:::INFO :::form logging1
2021-03-09T22:48:42.233-05:00:::INFO :::form logging2
2021-03-09T22:48:42.233-05:00:::INFO :::form logging3
2021-03-09T22:48:42.234-05:00:::INFO :::form logging1
2021-03-09T22:48:42.234-05:00:::INFO :::form logging2
2021-03-09T22:48:42.234-05:00:::INFO :::form logging3
>> ./file.log.5 <<
2021-03-09T22:48:42.234-05:00:::INFO :::form logging1
2021-03-09T22:48:42.234-05:00:::INFO :::form logging2
2021-03-09T22:48:42.235-05:00:::INFO :::form logging3
2021-03-09T22:48:42.235-05:00:::INFO :::form logging1
2021-03-09T22:48:42.235-05:00:::INFO :::form logging2
2021-03-09T22:48:42.235-05:00:::INFO :::form logging3
>> ./file.log.4 <<
2021-03-09T22:48:42.235-05:00:::INFO :::form logging1
2021-03-09T22:48:42.236-05:00:::INFO :::form logging2
2021-03-09T22:48:42.236-05:00:::INFO :::form logging3
2021-03-09T22:48:42.236-05:00:::INFO :::form logging1
2021-03-09T22:48:42.236-05:00:::INFO :::form logging2
2021-03-09T22:48:42.236-05:00:::INFO :::form logging3
>> ./file.log.3 <<
2021-03-09T22:48:42.237-05:00:::INFO :::form logging1
2021-03-09T22:48:42.237-05:00:::INFO :::form logging2
2021-03-09T22:48:42.237-05:00:::INFO :::form logging3
2021-03-09T22:48:42.237-05:00:::INFO :::form logging1
2021-03-09T22:48:42.237-05:00:::INFO :::form logging2
2021-03-09T22:48:42.237-05:00:::INFO :::form logging3
>> ./file.log.2 <<
2021-03-09T22:48:42.238-05:00:::INFO :::form logging1
2021-03-09T22:48:42.238-05:00:::INFO :::form logging2
2021-03-09T22:48:42.238-05:00:::INFO :::form logging3
2021-03-09T22:48:42.238-05:00:::INFO :::form logging1
2021-03-09T22:48:42.238-05:00:::INFO :::form logging2
2021-03-09T22:48:42.238-05:00:::INFO :::form logging3
>> ./file.log.1 <<
2021-03-09T22:48:42.239-05:00:::INFO :::form logging1
2021-03-09T22:48:42.239-05:00:::INFO :::form logging2
2021-03-09T22:48:42.239-05:00:::INFO :::form logging3
2021-03-09T22:48:42.239-05:00:::INFO :::form logging1
2021-03-09T22:48:42.239-05:00:::INFO :::form logging2
2021-03-09T22:48:42.239-05:00:::INFO :::form logging3
>> ./file.log <<
2021-03-09T22:48:42.240-05:00:::INFO :::form logging1
2021-03-09T22:48:42.240-05:00:::INFO :::form logging2
2021-03-09T22:48:42.240-05:00:::INFO :::form logging3
case2:
而在这里我在每个中定义处理程序,然后创建记录器,没有正确显示结果
import pytz
import datetime
import logging
class Formatter(logging.Formatter):
"""override logging.Formatter to use an aware datetime object"""
def converter(self,datefmt=None):
dt = self.converter(record.created)
if datefmt:
s = dt.strftime(datefmt)
else:
try:
s = dt.isoformat(timespec='milliseconds')
except TypeError:
s = dt.isoformat()
return s
import logging
from logging.handlers import RotatingFileHandler
filename1 = "./file.log"
# logger1
logger1 = logging.getLogger('name1')
logger1.setLevel(logging.INFO)
handler = RotatingFileHandler(filename1,delay=0)
handler.setLevel(logging.INFO)
handler.setFormatter(Formatter("\n%(asctime)s:::%(levelname)-8s:::%(message)s"))
logger1.addHandler(handler)
#logger2
logger2 = logging.getLogger('name2')
logger2.setLevel(logging.INFO)
handler = RotatingFileHandler(filename1,delay=0)
handler.setLevel(logging.INFO)
handler.setFormatter(Formatter("\n%(asctime)s:::%(levelname)-8s:::%(message)s"))
logger2.addHandler(handler)
#logger3
logger3 = logging.getLogger('name3')
logger3.setLevel(logging.INFO)
handler = RotatingFileHandler(filename1,delay=0)
handler.setLevel(logging.INFO)
handler.setFormatter(Formatter("\n%(asctime)s:::%(levelname)-8s:::%(message)s"))
logger3.addHandler(handler)
for i in range(0,100):
logger1.info("form logging1")
logger2.info("form logging2")
logger3.info("form logging3")
# run this command to concatenate
# python test_2.py; find ./ -name "file.*" | sort -r -V | xargs awk '(FNR==1){print ">> " FILENAME " <<"}1' > all_logs_test_2.txt
结果:(在linux下运行时)
>> ./file.log.10 <<
2021-03-09T22:42:43.864-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.865-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.865-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.865-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.866-05:00::LOGGER1:::INFO :::form logging3
>> ./file.log.9 <<
2021-03-09T22:42:43.864-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.865-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.865-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.865-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.866-05:00::LOGGER1:::INFO :::form logging1
>> ./file.log.8 <<
2021-03-09T22:42:43.866-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging2
>> ./file.log.7 <<
2021-03-09T22:42:43.867-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging3
>> ./file.log.6 <<
2021-03-09T22:42:43.867-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.868-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.869-05:00::LOGGER1:::INFO :::form logging1
>> ./file.log.5 <<
2021-03-09T22:42:43.869-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.870-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.870-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.870-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.871-05:00::LOGGER1:::INFO :::form logging2
>> ./file.log.4 <<
2021-03-09T22:42:43.869-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.870-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.870-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.871-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.871-05:00::LOGGER1:::INFO :::form logging3
>> ./file.log.3 <<
2021-03-09T22:42:43.870-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.870-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.870-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.871-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.871-05:00::LOGGER1:::INFO :::form logging1
>> ./file.log.2 <<
2021-03-09T22:42:43.871-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.872-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.873-05:00::LOGGER1:::INFO :::form logging2
2021-03-09T22:42:43.873-05:00::LOGGER1:::INFO :::form logging2
>> ./file.log.1 <<
2021-03-09T22:42:43.872-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.872-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.873-05:00::LOGGER1:::INFO :::form logging3
2021-03-09T22:42:43.873-05:00::LOGGER1:::INFO :::form logging3
>> ./file.log <<
2021-03-09T22:42:43.872-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.873-05:00::LOGGER1:::INFO :::form logging1
2021-03-09T22:42:43.873-05:00::LOGGER1:::INFO :::form logging1
此外,当我在 Windows 中尝试第二个时,它会出现以下错误。它甚至没有给出像上面那样的结果
the test2.py gives this error in windows
--- Logging error ---
Traceback (most recent call last):
File "C:\\Users\\dev\\AppData\\Local\\Programs\\Python\\Python38-32\\lib\\logging\\handlers.py",line 70,in emit
self.doRollover()
File "C:\\Users\\dev\\AppData\\Local\\Programs\\Python\\Python38-32\\lib\\logging\\handlers.py",line 171,in doRollover
self.rotate(self.baseFilename,dfn)
File "C:\\Users\\dev\\AppData\\Local\\Programs\\Python\\Python38-32\\lib\\logging\\handlers.py",line 111,in rotate
os.rename(source,dest)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'D:\\\\Dev\\\\Stock-chart\\\\backend_django\\\\stock\\\\cron_jobs\\\\testing2\\\\file.log' -> 'D:\\\\Dev\\\\Stock-chart\\\\backend_django\\\\stock\\\\cron_jobs\\\\testing2\\\\file.log.1'
Call stack:
File "testing2.py",line 65,in <module>
logger2.info("form logging2")
Message: 'form logging2'
Arguments: ()
我认为在第二种情况下也应该正确显示结果,为什么它会这样。
其中 Case1
不是单独定义三个记录器的实用方法
而 Case2
在单独的函数中定义每个记录器更实用
所以编码的观点 Case2
更实用。就像我可以有三个函数一样,传递文件名,他们将创建三个记录器
解决方法
让多个记录器无故障地记录到单个文件并使用旋转文件处理程序对我有用。
我想用于模块级别。但是我发现它不断复制日志。所以这帮助我避免了
for hdlr in logger.handlers[:]: # remove all old handlers
logger.removeHandler(hdlr)
最终工作代码
所以我有 logging_config.py
import pytz
import datetime
import logging
from logging.handlers import RotatingFileHandler
def create_handler(filename):
#filename1 = "./file.log"
handler = RotatingFileHandler(filename,mode='a',maxBytes=1000,backupCount=10,encoding='utf-8',delay=0)
#handler = logging.FileHandler(filename,mode='a')
return handler
# we have different logger to have differnt formats. here it may look all are same and of no use
# to create three. Like we can have sepearte logger for sql and requests and normal logging
def get_logger1(handler):
logger1 = logging.getLogger('name1')
logger1.setLevel(logging.INFO)
for hdlr in logger1.handlers[:]: # remove all old handlers
logger1.removeHandler(hdlr)
handler.setLevel(logging.INFO)
handler.setFormatter(logging.Formatter("\n%(asctime)s:::%(levelname)-8s:::%(message)s"))
logger1.addHandler(handler)
return logger1
def get_logger2(handler):
logger2 = logging.getLogger('name2')
logger2.setLevel(logging.INFO)
for hdlr in logger2.handlers[:]: # remove all old handlers
logger2.removeHandler(hdlr)
handler.setLevel(logging.INFO)
handler.setFormatter(logging.Formatter("\n%(asctime)s:::%(levelname)-8s:::%(message)s"))
logger2.addHandler(handler)
return logger2
def get_logger3(handler):
logger3 = logging.getLogger('name3')
logger3.setLevel(logging.INFO)
for hdlr in logger3.handlers[:]: # remove all old handlers
logger3.removeHandler(hdlr)
handler.setLevel(logging.INFO)
handler.setFormatter(logging.Formatter("\n%(asctime)s:::%(levelname)-8s:::%(message)s"))
logger3.addHandler(handler)
return logger3
test1.py
import time
from test2 import logger_test
from logging_config import get_logger1,get_logger2,get_logger3,create_handler
import logging
handler = create_handler("file.log")
logger1 = get_logger1(handler)
logger2 = get_logger2(handler)
logger3 = get_logger3(handler)
for i in range(0,10):
logger1.info("form logging1")
time.sleep(1)
logger2.info("form logging2")
time.sleep(1)
logger3.info("form logging3")
time.sleep(1)
logger_test()
test2.py
import time
from logging_config import get_logger1,create_handler
import logging
from logging.handlers import RotatingFileHandler
handler = create_handler("file.log")
logger1 = get_logger1(handler)
logger2 = get_logger2(handler)
logger3 = get_logger3(handler)
def logger_test():
logger1.info("form logging1 another file")
time.sleep(1)
logger2.info("form logging2 another file")
time.sleep(1)
logger3.info("form logging3 another file")
time.sleep(1)
并且所有内容都按顺序打印在多个文件中
>> ./file.log.3 <<
2021-03-10T02:10:56.657-05:00:::INFO :::form logging1
2021-03-10T02:10:57.659-05:00:::INFO :::form logging2
2021-03-10T02:10:58.661-05:00:::INFO :::form logging3
2021-03-10T02:10:59.663-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:00.666-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:01.667-05:00:::INFO :::form logging3 another file
2021-03-10T02:11:02.669-05:00:::INFO :::form logging1
2021-03-10T02:11:03.671-05:00:::INFO :::form logging2
2021-03-10T02:11:04.673-05:00:::INFO :::form logging3
2021-03-10T02:11:05.674-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:06.676-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:07.678-05:00:::INFO :::form logging3 another file
2021-03-10T02:11:08.680-05:00:::INFO :::form logging1
2021-03-10T02:11:09.681-05:00:::INFO :::form logging2
2021-03-10T02:11:10.683-05:00:::INFO :::form logging3
>> ./file.log.2 <<
2021-03-10T02:11:11.686-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:12.687-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:13.688-05:00:::INFO :::form logging3 another file
2021-03-10T02:11:14.690-05:00:::INFO :::form logging1
2021-03-10T02:11:15.692-05:00:::INFO :::form logging2
2021-03-10T02:11:16.695-05:00:::INFO :::form logging3
2021-03-10T02:11:17.697-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:18.699-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:19.701-05:00:::INFO :::form logging3 another file
2021-03-10T02:11:20.703-05:00:::INFO :::form logging1
2021-03-10T02:11:21.704-05:00:::INFO :::form logging2
2021-03-10T02:11:22.706-05:00:::INFO :::form logging3
2021-03-10T02:11:23.707-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:24.709-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:25.711-05:00:::INFO :::form logging3 another file
>> ./file.log.1 <<
2021-03-10T02:11:26.713-05:00:::INFO :::form logging1
2021-03-10T02:11:27.715-05:00:::INFO :::form logging2
2021-03-10T02:11:28.717-05:00:::INFO :::form logging3
2021-03-10T02:11:29.719-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:30.721-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:31.723-05:00:::INFO :::form logging3 another file
2021-03-10T02:11:32.724-05:00:::INFO :::form logging1
2021-03-10T02:11:33.726-05:00:::INFO :::form logging2
2021-03-10T02:11:34.728-05:00:::INFO :::form logging3
2021-03-10T02:11:35.729-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:36.730-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:37.732-05:00:::INFO :::form logging3 another file
2021-03-10T02:11:38.734-05:00:::INFO :::form logging1
2021-03-10T02:11:39.735-05:00:::INFO :::form logging2
2021-03-10T02:11:40.737-05:00:::INFO :::form logging3
>> ./file.log <<
2021-03-10T02:11:41.740-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:42.741-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:43.743-05:00:::INFO :::form logging3 another file
2021-03-10T02:11:44.744-05:00:::INFO :::form logging1
2021-03-10T02:11:45.746-05:00:::INFO :::form logging2
2021-03-10T02:11:46.748-05:00:::INFO :::form logging3
2021-03-10T02:11:47.749-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:48.751-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:49.752-05:00:::INFO :::form logging3 another file
2021-03-10T02:11:50.754-05:00:::INFO :::form logging1
2021-03-10T02:11:51.756-05:00:::INFO :::form logging2
2021-03-10T02:11:52.758-05:00:::INFO :::form logging3
2021-03-10T02:11:53.760-05:00:::INFO :::form logging1 another file
2021-03-10T02:11:54.761-05:00:::INFO :::form logging2 another file
2021-03-10T02:11:55.763-05:00:::INFO :::form logging3 another file
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。