Have log_file file handles refresh after a certain number of accesses. Possibly related to #1305
This commit is contained in:
parent
4b5ae26125
commit
05b0869a5c
1 changed files with 24 additions and 11 deletions
|
|
@ -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,16 +260,22 @@ 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:
|
||||||
else:
|
# close/refresh handle
|
||||||
try:
|
_LOG_FILE_HANDLES[filename].close()
|
||||||
filehandle = EvenniaLogFile.fromFullPath(filename, rotateLength=_LOG_ROTATE_SIZE)
|
del _LOG_FILE_HANDLES[filename]
|
||||||
# filehandle = open(filename, "a+") # append mode + reading
|
else:
|
||||||
_LOG_FILE_HANDLES[filename] = filehandle
|
# return cached handle
|
||||||
return filehandle
|
return _LOG_FILE_HANDLES[filename]
|
||||||
except IOError:
|
try:
|
||||||
log_trace()
|
filehandle = EvenniaLogFile.fromFullPath(filename, rotateLength=_LOG_ROTATE_SIZE)
|
||||||
|
# filehandle = open(filename, "a+") # append mode + reading
|
||||||
|
_LOG_FILE_HANDLES[filename] = filehandle
|
||||||
|
_LOG_FILE_HANDLE_COUNTS[filename] = 0
|
||||||
|
return filehandle
|
||||||
|
except IOError:
|
||||||
|
log_trace()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue