コード例 #1
0
ファイル: log.py プロジェクト: tokejepsen/pype-setup
    def _get_file_handler(self, host):
        logger_file_path = PypeLogger.get_file_path(host)

        formatter = PypeFormatter(self.FORMAT_FILE)

        file_handler = TimedRotatingFileHandler(logger_file_path,
                                                when='midnight')
        file_handler.set_name("PypeFileHandler")
        file_handler.setFormatter(formatter)
        return file_handler
コード例 #2
0
 def add_rotating_file_handler(self):
     interval_type = config['Logging.get'].get('rotation_interval_type',
                                               'h')
     interval_magnitude = config['Logging'].get(
         'rotation_interval_magnitude', 1)
     backup_count = config['Logging'].get('backup_count', 0)
     handler = TimedRotatingFileHandler(filename=self.logfile,
                                        when=interval_type,
                                        interval=interval_magnitude,
                                        backupCount=backup_count)
     handler.set_name(name="rotating_file_handler")
     self._add_handler(handler)
コード例 #3
0
ファイル: __init__.py プロジェクト: dougthor42/OWT_WM_View
def _setup_logging():
    """
    Set up logging for the entire package.

    Log strings are sent to both the console and a log file.

    The file is a TimedRotatingFileHandler set up to create a new log file
    every Sunday at midnight. This should keep the log files small-ish
    while also keeping the number of log files down. All log files are
    kept (none are automatically deleted by backupCount parameter).

    Log lines look like so::

        2015-06-23 17:04:10.409 [DEBUG   ] [gui     ] [_color_dolla]  msg...
        |--------| |----------| |--------| |--------| |------------|  |----)
             ^          ^            ^          ^            ^          ^
             |          |            |          |            |          |
        Date +          |            |          |            |          |
        Time -----------+            |          |            |          |
        Level Name (8 char) ---------+          |            |          |
        Module Name (8 char) -------------------+            |          |
        Function Name (12 char) -----------------------------+          |
        Message --------------------------------------------------------+

    All dates and times are ISO 8601 format, local time.


    Parameters:
    -----------
    None

    Returns:
    --------
    None

    Notes:
    ------

    1. Since I cannot get ms in the date format, I use the logger `msecs`
       attribute in the log format string.
    2. cx_freeze puts .py files in library.zip, so this means that I have
       to go up one additional level in the directory tree to find the
       `log` folder.

    References:
    -----------
    Logging different levels to different places:
        https://aykutakin.wordpress.com/2013/08/06/
            logging-to-console-and-file-in-python/

    Adding milliseconds to log string:
        http://stackoverflow.com/a/7517430/1354930

    TimedRotatingFileHandler:
        https://docs.python.org/3.4/library/
            logging.handlers.html#logging.handlers.TimedRotatingFileHandler

    TimedRotatingFileHandler:
        http://www.blog.pythonlibrary.org/2014/02/11/
            python-how-to-create-rotating-logs/

    """
    logfmt = ("%(asctime)s.%(msecs)03d"
              " [%(levelname)-8.8s]"
              " [%(module)-8.8s]"       # Note implicit string concatenation.
              " [%(funcName)-12.12s]"
              "  %(message)s"
              )
    datefmt = "%Y-%m-%d %H:%M:%S"

    # Create the logger
    logger = logging.getLogger()
    logger.setLevel(LOG_LEVEL_CONSOLE)

    ### Console Handler #####################################################
    handler = logging.StreamHandler()
    handler.setLevel(LOG_LEVEL_CONSOLE)
    formatter = logging.Formatter(logfmt, datefmt)
    handler.setFormatter(formatter)
    handler.set_name("Console Handler")
    logger.addHandler(handler)

    logging.info("Console logging initialized")


    ### File Handler ########################################################
    # Build the logfile path.
    dirname = os.path.dirname(os.path.abspath(__file__))
    rootpath = os.path.split(dirname)[0]
    logpath = os.path.join(rootpath, "log")
    logfile = os.path.join(logpath, "owt_wm_view.log")

    # see Note #2
    if not os.path.isdir(logpath):
        rootpath = os.path.split(rootpath)[0]       # up one level
        logpath = os.path.join(rootpath, "log")

    logfile = os.path.join(logpath, "owt_wm_view.log")

    # create log directory if it doesn't exist.
    try:
        os.makedirs(logpath)
    except OSError:
        if not os.path.isdir(logpath):
            raise

    # create the log file if it doesn't exist.
    if not os.path.isfile(logfile):
        open(logfile, 'a').close()

    rollover_time = datetime.time.min       # midnight
    handler = TRFHandler(logfile,
                         when="W6",         # Sunday
                         #interval=7,       # when=Sunday -> not needed
                         #backupCount=5,
                         atTime=rollover_time,
                         #delay=True,
                         )
    handler.setLevel(LOG_LEVEL_FILE)
    formatter = logging.Formatter(logfmt, datefmt)
    handler.setFormatter(formatter)
    handler.set_name("File Handler")
    logger.addHandler(handler)

    logging.info("File logging initialized")
コード例 #4
0
def configure(use_file_handler=False, log_filename=None, file_level='INFO',
              console_level='INFO', filter_inotify=True, command_name=None, log_rotate_keep=3,
              log_rotate_max_bytes=None, log_rotate_when=None, force_configure=False):

    global is_logging_configured
    global FILE_HANDLER

    if not is_logging_configured or force_configure:
        is_logging_configured = True

        _logging_context['command'] = command_name

        if file_level is None:
            file_level = 'INFO'
        # convert string levels
        if hasattr(file_level, 'upper'):
            file_level = getattr(logging, file_level.upper())
        if hasattr(console_level, 'upper'):
            console_level = getattr(logging, console_level.upper())

        # find the minimum level to avoid filtering by the root logger itself:
        root_logger = logging.getLogger()
        min_level = min(file_level, console_level)
        root_logger.setLevel(min_level)

        # define the formatter
        formatter = logging.Formatter(
            "%(asctime)s %(process)d %(thread)d %(levelname)-8s %(name)-18s"
            " %(message)s"
        )

        # define a Handler which writes INFO messages or higher to the
        # sys.stderr
        console_handler_name = 'console'
        console_handler = get_handler(root_logger, console_handler_name)
        if console_handler is None:
            console_handler = logging.StreamHandler()
            console_handler.set_name(console_handler_name)
            # tell the console handler to use this format
            console_handler.setFormatter(formatter)
        console_handler.setLevel(console_level)

        # add the console handler to the root logger and all descendants
        root_logger.addHandler(console_handler)

        # define a Handler for file based log with rotation if needed
        if use_file_handler and log_filename is not None:
            log_filename = os.path.expanduser(log_filename)
            log_folder = os.path.dirname(log_filename)
            if not os.path.exists(log_folder):
                os.makedirs(log_folder)
            if log_rotate_when is None and log_rotate_max_bytes is None:
                log_rotate_when = 'midnight'
            if log_rotate_when is not None:
                file_handler = TimedRotatingFileHandler(log_filename,
                                    when=log_rotate_when, backupCount=log_rotate_keep)
            elif log_rotate_max_bytes is not None:
                file_handler = RotatingFileHandler(
                                    log_filename, mode='a', maxBytes=log_rotate_max_bytes,
                                    backupCount=log_rotate_keep)
            file_handler.set_name('file')
            file_handler.setLevel(file_level)
            file_handler.setFormatter(formatter)
            FILE_HANDLER = file_handler
            root_logger.addHandler(file_handler)

        # Add memory logger to allow instant report
        memory_handler = CustomMemoryHandler()
        # Put in TRACE
        memory_handler.setLevel(5)
        memory_handler.set_name("memory")
        memory_handler.setFormatter(formatter)
        root_logger.addHandler(memory_handler)
        if filter_inotify:
            root_logger.addFilter(logging.Filter('watchdog.observers.inotify_buffer'))
コード例 #5
0
def configure(use_file_handler=False,
              log_filename=None,
              file_level='INFO',
              console_level='INFO',
              filter_inotify=True,
              command_name=None,
              log_rotate_keep=30,
              log_rotate_max_bytes=None,
              log_rotate_when=None,
              force_configure=False):

    global is_logging_configured
    global FILE_HANDLER

    if not is_logging_configured or force_configure:
        is_logging_configured = True

        _logging_context['command'] = command_name

        if file_level is None:
            file_level = 'INFO'
        # convert string levels
        if hasattr(file_level, 'upper'):
            file_level = getattr(logging, file_level.upper())
        if hasattr(console_level, 'upper'):
            console_level = getattr(logging, console_level.upper())

        # find the minimum level to avoid filtering by the root logger itself:
        root_logger = logging.getLogger()
        min_level = min(file_level, console_level)
        root_logger.setLevel(min_level)

        # define the formatter
        formatter = logging.Formatter(
            "%(asctime)s %(process)d %(thread)d %(levelname)-8s %(name)-18s"
            " %(message)s")

        # define a Handler which writes INFO messages or higher to the
        # sys.stderr
        console_handler_name = 'console'
        console_handler = get_handler(root_logger, console_handler_name)
        if console_handler is None:
            console_handler = logging.StreamHandler()
            console_handler.set_name(console_handler_name)
            # tell the console handler to use this format
            console_handler.setFormatter(formatter)
        console_handler.setLevel(console_level)

        # add the console handler to the root logger and all descendants
        root_logger.addHandler(console_handler)

        # define a Handler for file based log with rotation if needed
        if use_file_handler and log_filename is not None:
            log_filename = os.path.expanduser(log_filename)
            log_folder = os.path.dirname(log_filename)
            if not os.path.exists(log_folder):
                os.makedirs(log_folder)
            if log_rotate_when is None and log_rotate_max_bytes is None:
                log_rotate_when = 'midnight'
            if log_rotate_when is not None:
                file_handler = TimedRotatingFileHandler(
                    log_filename,
                    when=log_rotate_when,
                    backupCount=log_rotate_keep)
            elif log_rotate_max_bytes is not None:
                file_handler = RotatingFileHandler(
                    log_filename,
                    mode='a',
                    maxBytes=log_rotate_max_bytes,
                    backupCount=log_rotate_keep)
            file_handler.set_name('file')
            file_handler.setLevel(file_level)
            file_handler.setFormatter(formatter)
            FILE_HANDLER = file_handler
            root_logger.addHandler(file_handler)

        # Add memory logger to allow instant report
        memory_handler = CustomMemoryHandler()
        # Put in TRACE
        memory_handler.setLevel(5)
        memory_handler.set_name("memory")
        memory_handler.setFormatter(formatter)
        root_logger.addHandler(memory_handler)
        if filter_inotify:
            root_logger.addFilter(
                logging.Filter('watchdog.observers.inotify_buffer'))