83 lines
2.4 KiB
Python
83 lines
2.4 KiB
Python
#=============================================================================
|
|
#
|
|
# Logging utilities
|
|
#
|
|
#=============================================================================
|
|
import logging
|
|
import logging.handlers
|
|
import platform
|
|
import sys
|
|
import types
|
|
from .Error import Error
|
|
from . import path
|
|
|
|
#=============================================================================
|
|
_logs = {}
|
|
|
|
#=============================================================================
|
|
def get( name, level=None, output=None ):
|
|
""" TODO: doc
|
|
"""
|
|
log = _logs.get( name, None )
|
|
if not log:
|
|
log = create( name )
|
|
|
|
if level is not None:
|
|
log.setLevel( level )
|
|
|
|
if output is not None:
|
|
writeTo( log, output )
|
|
|
|
return log
|
|
|
|
#=============================================================================
|
|
def create( name, level=logging.ERROR ):
|
|
""" Create a logging object for the package name.
|
|
|
|
The full logging name will be 'tHome.NAME'.
|
|
"""
|
|
log = logging.getLogger( 'tHome.%s' % name )
|
|
log.setLevel( level )
|
|
|
|
handler = logging.NullHandler()
|
|
handler.setFormatter( _formatter() )
|
|
log.addHandler( handler )
|
|
|
|
# Monkey patch a method onto the log class.
|
|
log.writeTo = types.MethodType( writeTo, log )
|
|
|
|
# Save a handle to the log.
|
|
_logs[name] = log
|
|
return log
|
|
|
|
#=============================================================================
|
|
def writeTo( log, fileName ):
|
|
""" TODO: doc
|
|
"""
|
|
if fileName == "stdout":
|
|
handler = logging.StreamHandler( sys.stdout )
|
|
else:
|
|
try:
|
|
path.makeDirs( fileName )
|
|
|
|
# Use the watcher on linux so that logrotate will work
|
|
# properly. It will close and reopen the log file if the OS
|
|
# moves it. Not supported on windows.
|
|
if platform.system() == "Windows":
|
|
handler = logging.FileHandler( fileName )
|
|
else:
|
|
handler = logging.handlers.WatchedFileHandler( fileName )
|
|
|
|
except ( Error, IOError ) as e:
|
|
msg = "Error trying to open the log file '%s' for writing." % fileName
|
|
Error.raiseException( e, msg )
|
|
|
|
handler.setFormatter( _formatter() )
|
|
log.addHandler( handler )
|
|
|
|
#=============================================================================
|
|
def _formatter():
|
|
return logging.Formatter( '%(asctime)s : %(levelname)s: %(message)s' )
|
|
|
|
#=============================================================================
|