Beispiel #1
0
def configure_logging(app):
    if app.debug or app.testing:
        logging.basicConfig(level=logging.DEBUG)
        return

    # use log filter that adds environ, user to log record
    flask_context_filter = FlaskLogContext()

    # formatter for error/debug
    formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s '
                                  '[in %(pathname)s:%(lineno)d]')

    # log errors via mail, use custom formatter
    mail_handler = \
        SMTPHandler(
            app.config['MAIL_SERVER'], app.config['MAIL_LOG_SENDER'],
            app.config['ADMINS'], app.config['MAIL_LOG_SUBJECT'],
            (app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD'],)
        )

    mail_handler.setLevel(logging.ERROR)
    mail_handler.setFormatter(
        logging.Formatter('''
Message type:       %(levelname)s
Location:           %(pathname)s:%(lineno)d
Module:             %(module)s
Function:           %(funcName)s
Time:               %(asctime)s
Environ:
%(environ)s

Message:
%(message)s
'''))
    mail_handler.addFilter(flask_context_filter)

    if app.config['ENABLE_ERROR_MAILS']:
        app.logger.addHandler(mail_handler)

    # log errors
    main_log = os.path.join(app.root_path, app.config['LOG_DIR'],
                            app.config['MAIN_LOG'])
    main_log_handler = logging.FileHandler(main_log)
    main_log_handler.setLevel(logging.DEBUG)
    main_log_handler.setFormatter(formatter)
    main_log_handler.addFilter(flask_context_filter)

    for logger in [app.logger, logging.getLogger('osm_observer')]:
        logger.addHandler(main_log_handler)
        logger.setLevel(logging.DEBUG)
Beispiel #2
0
    def add_smtp_handler(self,
                         from_addr,
                         to_addrs,
                         subject,
                         mail_host=None,
                         username=None,
                         password=None,
                         level=None,
                         formatter=None,
                         filters=None):
        handler = SMTPHandler(mailhost=mail_host or DEFAULT_MAIL_HOST,
                              fromaddr=from_addr,
                              toaddrs=to_addrs,
                              subject=subject,
                              credentials=(username, password))
        handler.setLevel(level or self.level)
        handler.setFormatter(formatter or self.formatter)

        if filters is None:
            filters = []
        for f in filters:
            handler.addFilter(f)
        self.addHandler(handler)
        return self
def init_logging(
        log_name='logger',
        log_directory='logs',
        log_mode='a',
        max_bytes=100 * 1024 * 1024,
        rotate_when='d',
        rotate_interval=1,
        backup_count=20,
        encoding=None,
        delay=0,
        log_level='INFO',
        console_log=True,
        rotation_criteria='size',
        log_format='[%(asctime)s] -- %(levelname)s - %(filename)s -- %(funcName)s - Line no - %(lineno)d '
    '-- %(message)s\n',
        enable_mailing=False,
        mail_host=None,
        mailfrom_addr=None,
        mailto_addr=None,
        mail_subject='Exception Report',
        mail_credentials=None,
        verify_credentials=False,
        mail_secure=None,
        mail_timeout=2.0):
    """

    Function to initialize logging library with log rotation feature enabled.

    Please note, arguments related to log rotation depends on the chosen rotation criteria.

    For rotation criteria == 'size', 'log_mode' & 'max_bytes' are required.
    For rotation criteria == 'time', 'rotate_when' & 'rotate_interval' are required

    :param log_name: Name of log
    :type log_name: str
    :param log_directory: Directory for saving log files
    :type log_directory: str
    :param log_mode: Mode of logging. Options: Append('a') | Write ('w')
    :type log_mode: str
    :param max_bytes: Max file size
    :type max_bytes: int
    :param rotate_when: When to rotate. Options: day('d') | hour('h') | minute('m') | seconds('s')
    :type rotate_when: str
    :param rotate_interval: Interval for rotation
    :type rotate_interval: int
    :param backup_count: Number of backup files to keep on rotation
    :type backup_count: int
    :param encoding: Encoding scheme for logging
    :type encoding: str
    :param delay: Delay flag for logging.
    :type delay: int
    :param log_level: Log level. (DEBUG|INFO|WARNING|ERROR|CRITICAL)
    :type log_level: str
    :param console_log: Flag for turning console logging on or off.
    :type console_log: Boolean
    :param rotation_criteria: Type of rotation. Options: 'size' | 'time'
    :type rotation_criteria: str
    :param log_format: Log formatter for setting log pattern
    :type log_format: str
    :param enable_mailing: Flag to enable mailing in case of critical errors
    :type enable_mailing: Boolean
    :param mail_host: Host name of the email server
    :type mail_host: str
    :param mailfrom_addr: From email id for sending email
    :type mailfrom_addr: str
    :param mailto_addr: To email id for sending email
    :type mailto_addr: str
    :param mail_subject: Subject of email
    :type mail_subject: str
    :param mail_credentials: login credentials for sending email (username, password)
    :type mail_credentials: tuple
    :param mail_secure: Tuple having keyfile and certificate file for encrypting email. If None, no TLS encryption.
    :type mail_secure: tuple or None
    :param mail_timeout: Max wait time to connect to smtp server.
    :type mail_timeout: float
    :return: Logger object
    :rtype: Logger

    """

    try:
        # Checking arguments
        check_params(**locals())

        logs_path = prepare_log_directory(log_name=log_name,
                                          log_directory=log_directory)

        log = logging.getLogger(log_name)
        log_formatter = logging.Formatter(log_format)

        # Adding log handler for logging on console
        stream_handler = logging.StreamHandler()
        stream_handler.setFormatter(log_formatter)

        # Variables for log paths for DEBUG, INFO, WARN, ERROR
        debug_log_file_name = os.path.join(os.path.join(logs_path, 'Debug'),
                                           (log_name + '.debug'))
        info_log_file_name = os.path.join(os.path.join(logs_path, 'Info'),
                                          (log_name + '.info'))
        warning_log_file_name = os.path.join(
            os.path.join(logs_path, 'Warning'), (log_name + '.warn'))
        error_log_file_name = os.path.join(os.path.join(logs_path, 'Error'),
                                           (log_name + '.error'))

        if rotation_criteria.lower() in ('timeandsize', 'sizeandtime'):
            warnings.warn(
                'Using both time and size based rotation is in '
                'experimental mode. \nPlease do not use in PROD environment',
                category=ExperimentalFeatureWarning)
            debug_file_handler = SizedTimedRotatingFileHandler(
                debug_log_file_name,
                when=rotate_when,
                interval=rotate_interval,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay,
                maxBytes=max_bytes)
            info_file_handler = SizedTimedRotatingFileHandler(
                info_log_file_name,
                when=rotate_when,
                interval=rotate_interval,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay,
                maxBytes=max_bytes)
            warning_file_handler = SizedTimedRotatingFileHandler(
                warning_log_file_name,
                when=rotate_when,
                interval=rotate_interval,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay,
                maxBytes=max_bytes)
            error_file_handler = SizedTimedRotatingFileHandler(
                error_log_file_name,
                when=rotate_when,
                interval=rotate_interval,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay,
                maxBytes=max_bytes)
        elif rotation_criteria.lower() == 'time':
            # Log handlers for time based file rotation
            debug_file_handler = TimedRotatingFileHandler(
                debug_log_file_name,
                when=rotate_when,
                interval=rotate_interval,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay)
            info_file_handler = TimedRotatingFileHandler(
                info_log_file_name,
                when=rotate_when,
                interval=rotate_interval,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay)
            warning_file_handler = TimedRotatingFileHandler(
                warning_log_file_name,
                when=rotate_when,
                interval=rotate_interval,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay)
            error_file_handler = TimedRotatingFileHandler(
                error_log_file_name,
                when=rotate_when,
                interval=rotate_interval,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay)
        else:
            # Log handlers for size based file rotation
            debug_file_handler = RotatingFileHandler(debug_log_file_name,
                                                     mode=log_mode,
                                                     maxBytes=max_bytes,
                                                     backupCount=backup_count,
                                                     encoding=encoding,
                                                     delay=delay)
            info_file_handler = RotatingFileHandler(info_log_file_name,
                                                    mode=log_mode,
                                                    maxBytes=max_bytes,
                                                    backupCount=backup_count,
                                                    encoding=encoding,
                                                    delay=delay)
            warning_file_handler = RotatingFileHandler(
                warning_log_file_name,
                mode=log_mode,
                maxBytes=max_bytes,
                backupCount=backup_count,
                encoding=encoding,
                delay=delay)
            error_file_handler = RotatingFileHandler(error_log_file_name,
                                                     mode=log_mode,
                                                     maxBytes=max_bytes,
                                                     backupCount=backup_count,
                                                     encoding=encoding,
                                                     delay=delay)

        # Log handler for sending smtp mail
        smtp_handler = SMTPHandler(mailhost=mail_host,
                                   fromaddr=mailfrom_addr,
                                   toaddrs=mailto_addr,
                                   subject=mail_subject,
                                   credentials=mail_credentials,
                                   secure=mail_secure,
                                   timeout=mail_timeout)
        # Setting smtp log handler properties
        smtp_handler.setFormatter(log_formatter)
        smtp_handler.setLevel(logging.CRITICAL)
        smtp_handler.addFilter(MyFilter(logging.CRITICAL))

        # Setting log handler properties
        debug_file_handler.setFormatter(log_formatter)
        debug_file_handler.setLevel(logging.DEBUG)
        debug_file_handler.addFilter(MyFilter(logging.DEBUG))

        info_file_handler.setFormatter(log_formatter)
        info_file_handler.setLevel(logging.INFO)
        info_file_handler.addFilter(MyFilter(logging.INFO))

        warning_file_handler.setFormatter(log_formatter)
        warning_file_handler.setLevel(logging.WARNING)
        warning_file_handler.addFilter(MyFilter(logging.WARNING))

        error_file_handler.setFormatter(log_formatter)
        error_file_handler.setLevel(logging.ERROR)
        error_file_handler.addFilter(MyFilter(logging.ERROR))

        # Adding log handlers to the log object if not already added
        # Checking is performed to prevent any duplicate addition of handlers
        if not len(log.handlers):

            if console_log:
                log.addHandler(stream_handler)

            if enable_mailing:
                log.addHandler(smtp_handler)

            log.addHandler(debug_file_handler)
            log.addHandler(info_file_handler)
            log.addHandler(warning_file_handler)
            log.addHandler(error_file_handler)

        # Checking if log level in 'str' format or 'int' format
        if isinstance(log_level, int):
            log.setLevel(log_level)
        else:
            log.setLevel(getattr(logging, log_level.upper()))

        return log

    except Exception:
        exception_message = traceback.format_exc()
        raise Exception('Error occurred in setting up logging. Details: %s' %
                        str(exception_message))
Beispiel #4
0
        credentials = (app.config['MAIL_USERNAME'],
                       app.config['MAIL_PASSWORD'])

    mail_handler = SMTPHandler(
        (app.config['MAIL_SERVER'],
         app.config['MAIL_PORT']),
        app.config['MAIL_FROM'],
        app.config['ADMINS'],
        'webfaf exception', credentials)

    mail_handler.setLevel(logging.ERROR)
    rate_limiter = RateLimitingFilter(app.config['THROTTLING_RATE'],
                                      app.config['THROTTLING_TIMEFRAME'],
                                      app.config['THROTTLING_BURST'])

    mail_handler.addFilter(rate_limiter)
    app.logger.addHandler(mail_handler) # pylint: disable=no-member


@app.errorhandler(403)
def forbidden(_) -> Tuple[str, int]:
    return flask.render_template("403.html"), 403


@app.errorhandler(404)
def not_found(_) -> Tuple[str, int]:
    return flask.render_template("404.html"), 404


@app.errorhandler(413)
def request_entity_too_large(_) -> Tuple[str, int]:
Beispiel #5
0
        file_handler = RotatingFileHandler(logFile,
                                           mode='a',
                                           maxBytes=LOG_FILE_MAX_SIZE_MB *
                                           1024 * 1024,
                                           backupCount=LOG_FILE_BACKUP_COUNT,
                                           encoding=None,
                                           delay=0)
        file_handler.setFormatter(log_formatter)
        file_handler.setLevel(logging.INFO)

        # Send email on critical errors.
        smtp_handler = SMTPHandler(
            mailhost=(EMAIL_HOST, EMAIL_PORT),
            fromaddr=EMAIL_FROM,
            toaddrs=EMAIL_TO,
            credentials=(EMAIL_USER, EMAIL_PASSWORD),
            subject=u"Anemio station: a critical error has occured.")
        smtp_handler.setLevel(logging.CRITICAL)
        ratelimit = RateLimitingFilter(rate=EMAIL_RATE,
                                       per=EMAIL_RATE_SECONDS,
                                       burst=EMAIL_RATE_BURST)
        smtp_handler.addFilter(ratelimit)

        logger = logging.getLogger('anemio')
        logger.setLevel(logging.INFO)
        logger.addHandler(file_handler)
        logger.addHandler(smtp_handler)

    radio_daemon = RadioDaemon(logger=logger)
    radio_daemon.run()
Beispiel #6
0
        credentials = (app.config['MAIL_USERNAME'],
                       app.config['MAIL_PASSWORD'])

    mail_handler = SMTPHandler(
        (app.config['MAIL_SERVER'],
         app.config['MAIL_PORT']),
        app.config['MAIL_FROM'],
        app.config['ADMINS'],
        'webfaf exception', credentials)

    mail_handler.setLevel(logging.ERROR)
    rate_limiter = RateLimitingFilter(app.config['THROTTLING_RATE'],
                                      app.config['THROTTLING_TIMEFRAME'],
                                      app.config['THROTTLING_BURST'])

    mail_handler.addFilter(rate_limiter)
    app.logger.addHandler(mail_handler) # pylint: disable=no-member


@app.errorhandler(403)
def forbidden(error):
    return flask.render_template("403.html"), 403


@app.errorhandler(404)
def not_found(error):
    return flask.render_template("404.html"), 404


@app.errorhandler(413)
def request_entity_too_large(error):