88# Python Imports
99# Datetime
1010from datetime import date
11+ from datetime import datetime
1112# Logging
1213from logging import CRITICAL
1314from logging import DEBUG
1415from logging import ERROR
1516from logging import INFO
1617from logging import WARNING
17- from logging import FileHandler
1818from logging import Formatter
1919from logging import addLevelName
2020from logging import getLogger
21+ from logging .handlers import TimedRotatingFileHandler
22+
23+ # Site-Packages Imports
24+ # Path
25+ from path import Path
2126
2227# Source.Python Imports
2328# Core
@@ -258,6 +263,12 @@ def _log(self, level, msg, *args, **kwargs):
258263 # Print to the main SP log file?
259264 if SP_LOG & areas :
260265
266+ # Get the given extra dictionary
267+ extra = kwargs .setdefault ('extra' , dict ())
268+
269+ # Set the logger name
270+ extra .setdefault ('logger_name' , self .logger .name )
271+
261272 # Print to the SP log file
262273 _sp_logger .logger .log (level , msg , * args , ** kwargs )
263274
@@ -374,7 +385,8 @@ def __init__(
374385 log_path .parent .makedirs ()
375386
376387 # Create the handler an add it to the logger
377- self ._handler = FileHandler (log_path , encoding = encoding )
388+ self ._handler = DailyRotatingFileHandler (log_path , when = 'D' ,
389+ backupCount = 30 , encoding = encoding )
378390 self ._handler .setFormatter (self .formatter )
379391 self .logger .addHandler (self ._handler )
380392
@@ -404,6 +416,30 @@ def _unload_instance(self):
404416 handler .close ()
405417
406418
419+ class DailyRotatingFileHandler (TimedRotatingFileHandler ):
420+ """Source.Python's logging file handler."""
421+
422+ file_name_format = 'source-python.%Y-%m-%d.log'
423+
424+ def rotation_filename (self , default_name ):
425+ """Returns the name of today's log file."""
426+ return date .today ().strftime (self .file_name_format )
427+
428+ def getFilesToDelete (self ):
429+ """Returns the files to delete."""
430+ files = list ()
431+ for f in Path (self .baseFilename ).parent .files ():
432+ try :
433+ delta = date .today () - datetime .strptime (
434+ f .name , self .file_name_format ).date ()
435+ if delta .days < self .backupCount :
436+ continue
437+ files .append (f )
438+ except ValueError :
439+ continue
440+ return files
441+
442+
407443# Set the core ConVars
408444_level = ConVar (
409445 'sp_logging_level' , '0' , 'The Source.Python base logging level' )
@@ -414,7 +450,7 @@ def _unload_instance(self):
414450_sp_logger = LogManager (
415451 'sp' , _level , _areas ,
416452 'source-python.{0}' .format (date .today ().strftime ('%Y-%m-%d' )),
417- '%(asctime)s - %(name )s\t -\t %(levelname)s\t %(message)s' ,
453+ '%(asctime)s - %(logger_name )s\t -\t %(levelname)s\t %(message)s' ,
418454 '%Y-%m-%d %H:%M:%S' )
419455
420456# Set the parent logger level to allow all message types
0 commit comments