2016-03-31 16:03:38 +08:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
import logging
|
|
|
|
import logging.handlers
|
|
|
|
import argparse
|
|
|
|
import sys
|
|
|
|
import time # this is only being used as part of the example
|
|
|
|
import os
|
|
|
|
|
|
|
|
import os, sys, inspect
|
|
|
|
this_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile(inspect.currentframe()))[0]))
|
|
|
|
src_folder = os.path.realpath(os.path.abspath(os.path.join(this_folder,"../..", "src")))
|
|
|
|
if src_folder not in sys.path:
|
|
|
|
sys.path.insert(0, src_folder)
|
|
|
|
import env
|
|
|
|
|
|
|
|
# logger should only be imported after initlogging has been called
|
|
|
|
logger = None
|
|
|
|
|
|
|
|
def initlogging(name='docklet'):
|
|
|
|
# Deafults
|
|
|
|
global logger
|
|
|
|
|
|
|
|
homepath = env.getenv('FS_PREFIX')
|
|
|
|
LOG_FILENAME = homepath + '/local/log/' + name + '.log'
|
|
|
|
|
|
|
|
LOG_LEVEL = env.getenv('WEB_LOG_LEVEL')
|
|
|
|
if LOG_LEVEL == "DEBUG":
|
|
|
|
LOG_LEVEL = logging.DEBUG
|
|
|
|
elif LOG_LEVEL == "INFO":
|
|
|
|
LOG_LEVEL = logging.INFO
|
|
|
|
elif LOG_LEVEL == "WARNING":
|
|
|
|
LOG_LEVEL = logging.WARNING
|
|
|
|
elif LOG_LEVEL == "ERROR":
|
|
|
|
LOG_LEVEL = logging.ERROR
|
|
|
|
elif LOG_LEVEL == "CRITICAL":
|
|
|
|
LOG_LEVEL = logging.CRITIAL
|
|
|
|
else:
|
|
|
|
LOG_LEVEL = logging.DEBUG
|
|
|
|
|
|
|
|
logger = logging.getLogger(name)
|
|
|
|
# Configure logging to log to a file, making a new file at midnight and keeping the last 3 day's data
|
|
|
|
# Give the logger a unique name (good practice)
|
|
|
|
# Set the log level to LOG_LEVEL
|
|
|
|
logger.setLevel(LOG_LEVEL)
|
|
|
|
# Make a handler that writes to a file, making a new file at midnight and keeping 3 backups
|
|
|
|
handler = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME,
|
2016-06-21 17:56:27 +08:00
|
|
|
when="midnight", backupCount=0)
|
2016-03-31 16:03:38 +08:00
|
|
|
# Format each log message like this
|
|
|
|
formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(module)s[%(lineno)d] %(message)s')
|
|
|
|
# Attach the formatter to the handler
|
|
|
|
handler.setFormatter(formatter)
|
|
|
|
# Attach the handler to the logger
|
|
|
|
logger.addHandler(handler)
|
|
|
|
|
|
|
|
# Replace stdout with logging to file at INFO level
|
|
|
|
sys.stdout = RedirectLogger(logger, logging.INFO)
|
|
|
|
# Replace stderr with logging to file at ERROR level
|
|
|
|
sys.stderr = RedirectLogger(logger, logging.ERROR)
|
|
|
|
|
|
|
|
# Make a class we can use to capture stdout and sterr in the log
|
|
|
|
class RedirectLogger(object):
|
|
|
|
def __init__(self, logger, level):
|
|
|
|
"""Needs a logger and a logger level."""
|
|
|
|
self.logger = logger
|
|
|
|
self.level = level
|
|
|
|
|
|
|
|
def write(self, message):
|
|
|
|
# Only log if there is a message (not just a new line)
|
|
|
|
if message.rstrip() != "":
|
|
|
|
self.logger.log(self.level, message.rstrip())
|
|
|
|
|
|
|
|
def flush(self):
|
|
|
|
for handler in self.logger.handlers:
|
|
|
|
handler.flush()
|