我正在使用Python记录器机制来记录我的日志。我有两种类型的日志, 一个是旋转日志(log1,log2,log3 ...)和一个名为json.log的非旋转日志(顾名思义,其中包含json日志)。 日志文件在服务器启动时创建,在应用程序关闭时关闭。
我一般要做的是:当我按下我页面上的导入按钮时,将所有json日志保存在sqlite db上。
我面临的问题是: 当我尝试重命名json.log文件时:
source_file = "./logs/json.log"
snapshot_file = "./logs/json.snapshot.log"
try:
os.rename(source_file, snapshot_file)
我得到了windowsError: [Error 32] The process cannot access the file because it is being used by another process
这是因为记录器正在连续使用该文件。因此,我需要"关闭"该文件不知怎的,所以我可以成功地进行I / O操作。 问题是这是不可取的,因为在文件关闭之前日志可能会丢失,然后重命名然后重新创建"。
我想知道是否有人再次遇到这种情况,并且找到了任何实际解决方案。
我尝试了一些有效但不方便的东西,不确定它是否安全,以免丢失任何日志。
我的代码是:
source_file = "./logs/json.log"
snapshot_file = "./logs/json.snapshot.log"
try:
logger = get_logger()
# some hackish way to remove the handler for json.log
if len(logger.handlers) > 2:
logger.removeHandler(logger.handlers[2])
if not os.path.exists(snapshot_file):
os.rename(source_file, snapshot_file)
try:
if type(logger.handlers[2]) == RequestLoggerHandler:
del logger.handlers[2]
except IndexError:
pass
# re-adding the logs file handler so it continues writing the logs
json_file_name = configuration["brew.log_file_dir"] + os.sep + "json.log"
json_log_level = logging.DEBUG
json_file_handler = logging.FileHandler(json_file_name)
json_file_handler.setLevel(json_log_level)
json_file_handler.addFilter(JSONLoggerFiltering())
json_file_handler.setFormatter(JSONFormatter())
logger.addHandler(json_file_handler)
... code continues to write the logs to the db and then delete the json.snapshot.file
until the next time the import button is pressed; then the snapshot is created again
only for writing the logs to the db.
另外,作为参考,我的日志文件具有以下格式:
{'status': 200, 'actual_user': 1, 'resource_name': '/core/logs/process', 'log_level': 'INFO', 'request_body': None, ... }
提前致谢:)