Have log_file file handles refresh after a certain number of accesses. Possibly related to #1305

This commit is contained in:
Griatch 2018-01-27 14:19:06 +01:00
parent 4b5ae26125
commit 05b0869a5c

View file

@ -235,6 +235,8 @@ class EvenniaLogFile(logfile.LogFile):
_LOG_FILE_HANDLES = {} # holds open log handles _LOG_FILE_HANDLES = {} # holds open log handles
_LOG_FILE_HANDLE_COUNTS = {}
_LOG_FILE_HANDLE_RESET = 500
def _open_log_file(filename): def _open_log_file(filename):
@ -242,10 +244,15 @@ def _open_log_file(filename):
Helper to open the log file (always in the log dir) and cache its Helper to open the log file (always in the log dir) and cache its
handle. Will create a new file in the log dir if one didn't handle. Will create a new file in the log dir if one didn't
exist. exist.
To avoid keeping the filehandle open indefinitely we reset it every
_LOG_FILE_HANDLE_RESET accesses. This may help resolve issues for very
long uptimes and heavy log use.
""" """
# we delay import of settings to keep logger module as free # we delay import of settings to keep logger module as free
# from django as possible. # from django as possible.
global _LOG_FILE_HANDLES, _LOGDIR, _LOG_ROTATE_SIZE global _LOG_FILE_HANDLES, _LOG_FILE_HANDLE_COUNTS, _LOGDIR, _LOG_ROTATE_SIZE
if not _LOGDIR: if not _LOGDIR:
from django.conf import settings from django.conf import settings
_LOGDIR = settings.LOG_DIR _LOGDIR = settings.LOG_DIR
@ -253,13 +260,19 @@ def _open_log_file(filename):
filename = os.path.join(_LOGDIR, filename) filename = os.path.join(_LOGDIR, filename)
if filename in _LOG_FILE_HANDLES: if filename in _LOG_FILE_HANDLES:
# cache the handle _LOG_FILE_HANDLE_COUNTS[filename] += 1
return _LOG_FILE_HANDLES[filename] if _LOG_FILE_HANDLE_COUNTS[filename] > _LOG_FILE_HANDLE_RESET:
# close/refresh handle
_LOG_FILE_HANDLES[filename].close()
del _LOG_FILE_HANDLES[filename]
else: else:
# return cached handle
return _LOG_FILE_HANDLES[filename]
try: try:
filehandle = EvenniaLogFile.fromFullPath(filename, rotateLength=_LOG_ROTATE_SIZE) filehandle = EvenniaLogFile.fromFullPath(filename, rotateLength=_LOG_ROTATE_SIZE)
# filehandle = open(filename, "a+") # append mode + reading # filehandle = open(filename, "a+") # append mode + reading
_LOG_FILE_HANDLES[filename] = filehandle _LOG_FILE_HANDLES[filename] = filehandle
_LOG_FILE_HANDLE_COUNTS[filename] = 0
return filehandle return filehandle
except IOError: except IOError:
log_trace() log_trace()