diff --git a/evennia/settings_default.py b/evennia/settings_default.py index c5844205c7..c472268a7d 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -125,6 +125,10 @@ LOCKWARNING_LOG_FILE = os.path.join(LOG_DIR, 'lockwarnings.log') # file sizes down. Turn off to get ever growing log files and never # loose log info. CYCLE_LOGFILES = True +# Number of lines to append to rotating channel logs when they rotate +NUM_LOG_TAIL_LINES = 20 +# Max size of channel log files before they rotate +LOG_ROTATE_SIZE = 1000000 # Local time zone for this installation. All choices can be found here: # http://www.postgresql.org/docs/8.0/interactive/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE TIME_ZONE = 'UTC' diff --git a/evennia/utils/logger.py b/evennia/utils/logger.py index a46c549dec..a22e313bca 100644 --- a/evennia/utils/logger.py +++ b/evennia/utils/logger.py @@ -19,8 +19,9 @@ import os import time from datetime import datetime from traceback import format_exc -from twisted.python import log +from twisted.python import log, logfile from twisted.internet.threads import deferToThread +from django.conf import settings _LOGDIR = None @@ -153,6 +154,27 @@ log_depmsg = log_dep # Arbitrary file logger +class EvenniaLogFile(logfile.LogFile): + num_lines_to_append = settings.NUM_LOG_TAIL_LINES + + def rotate(self): + append_tail = self.num_lines_to_append > 0 + print "append_tail is %s" % append_tail + if not append_tail: + logfile.LogFile.rotate(self) + return + lines = tail_log_file(self.path, 0, self.num_lines_to_append) + print "lines is %s" % lines + logfile.LogFile.rotate(self) + for line in lines: + self.write(line) + + def seek(self, *args, **kwargs): + return self._file.seek(*args, **kwargs) + + def readlines(self, *args, **kwargs): + return self._file.readlines(*args, **kwargs) + _LOG_FILE_HANDLES = {} # holds open log handles @@ -164,7 +186,6 @@ def _open_log_file(filename): """ global _LOG_FILE_HANDLES, _LOGDIR if not _LOGDIR: - from django.conf import settings _LOGDIR = settings.LOG_DIR filename = os.path.join(_LOGDIR, filename) @@ -173,7 +194,8 @@ def _open_log_file(filename): return _LOG_FILE_HANDLES[filename] else: try: - filehandle = open(filename, "a+") # append mode + reading + filehandle = EvenniaLogFile.fromFullPath(filename, rotateLength=settings.LOG_ROTATE_SIZE) + # filehandle = open(filename, "a+") # append mode + reading _LOG_FILE_HANDLES[filename] = filehandle return filehandle except IOError: