/usr/lib/python2.7/dist-packages/ginga/misc/log.py is in python-ginga 2.6.1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | #
# log.py -- logging routines for Ginga
#
# This is open-source software licensed under a BSD license.
# Please see the file LICENSE.txt for details.
#
import os
import logging
import logging.handlers
LOG_FORMAT = '%(asctime)s | %(levelname)1.1s | %(filename)s:%(lineno)d (%(funcName)s) | %(message)s'
# max size of log file before rotating
log_maxsize = 20 * 1024*1024
log_backups = 4
class NullLogger(object):
"""
The NullLogger can be used in the place of a "real" logging module logger
if the code just uses the standard levels/methods for logging.
It is useful when you need to suppress logging or bypass the overhead of
the logging module logger.
"""
def __init__(self, f_out=None):
self.f_out = f_out
self.handlers = []
def debug(self, msg):
if self.f_out:
self.f_out.write("%s\n" % msg)
self.f_out.flush()
def info(self, msg):
if self.f_out:
self.f_out.write("%s\n" % msg)
self.f_out.flush()
def warning(self, msg):
if self.f_out:
self.f_out.write("%s\n" % msg)
self.f_out.flush()
def warn(self, msg):
return self.warning(msg)
def error(self, msg):
if self.f_out:
self.f_out.write("%s\n" % msg)
self.f_out.flush()
def addHandler(self, hndlr):
pass
def get_logger(name='ginga', level=None, null=False,
options=None, log_file=None, log_stderr=False):
if null or ((options is not None) and hasattr(options, 'nulllogger') and
options.nulllogger):
# User wants a Null Logger
return NullLogger()
# Create a logger
logger = logging.Logger('ginga')
if level is None:
if (options is not None) and (options.loglevel is not None):
level = options.loglevel
else:
level = logging.WARN
fmt = logging.Formatter(LOG_FORMAT)
if (not log_file) and (options is not None) and (options.logfile is not None):
log_file = options.logfile
if log_file is not None:
if ((options is not None) and (getattr(options, 'rmlog', False)) and
os.path.exists(log_file)):
os.remove(log_file)
# TODO: get maxsize and backup from options, if present
fileHdlr = logging.handlers.RotatingFileHandler(log_file,
maxBytes=log_maxsize,
backupCount=log_backups)
fileHdlr.setLevel(level)
fileHdlr.setFormatter(fmt)
logger.addHandler(fileHdlr)
if (not log_stderr) and (options is not None) and (options.logstderr):
log_stderr = options.logstderr
if log_stderr:
stderrHdlr = logging.StreamHandler()
stderrHdlr.setLevel(level)
stderrHdlr.setFormatter(fmt)
logger.addHandler(stderrHdlr)
return logger
def addlogopts(parser):
if hasattr(parser, 'add_option'):
# older OptParse
add_argument = parser.add_option
else:
# newer ArgParse
add_argument = parser.add_argument
add_argument("--log", dest="logfile", metavar="FILE",
help="Write logging output to FILE")
add_argument("--loglevel", dest="loglevel", metavar="LEVEL",
default=20, type=int,
help="Set logging level to LEVEL")
add_argument("--lognull", dest="nulllogger", default=False,
action="store_true",
help="Use a null logger")
add_argument("--logsize", dest="logsize", metavar="NUMBYTES",
type=int, default=log_maxsize,
help="Set maximum logging level to NUMBYTES")
add_argument("--logbackups", dest="logbackups", metavar="NUM",
type=int, default=log_backups,
help="Set maximum number of backups to NUM")
add_argument("--rmlog", dest="rmlog", default=False,
action="store_true",
help="Remove log if present (don't append)")
add_argument("--stderr", dest="logstderr", default=False,
action="store_true",
help="Copy logging also to stderr")
#END
|