Пример #1
0
def set_log(verbose,
            debug,
            log_dir,
            name='train',
            job_number=0,
            tmp_dir='/tmp'):

    log = logging.getLogger('')
    log.setLevel(0)
    if (log.hasHandlers()):
        log.handlers.clear()

    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

    if not os.path.isdir(log_dir):
        log_dir = '/tmp'

    h_formatter = logging.Formatter(
        '%(asctime)s [%(levelname).1s] %(message)s')
    formatter = logging.Formatter('[%(levelname).1s] %(message)s')
    stream_handler = logging.StreamHandler()

    if job_number:
        fn = os.path.join(log_dir, f'{name}.log.{job_number}')
        file_handler = FileHandler(fn)

    else:
        fn = os.path.join(log_dir, f'{name}.log')
        file_handler = RotatingFileHandler(fn,
                                           maxBytes=5000000,
                                           backupCount=10)
        file_handler.doRollover()

    fn = os.path.join(log_dir, 'dump.log')
    dump_file_handler = RotatingFileHandler(fn, maxBytes=1, backupCount=20)
    log_level = logging.ERROR
    if verbose == 1:
        log_level = logging.WARNING
    if verbose > 1:
        log_level = logging.INFO
    if debug:
        log_level = logging.DEBUG

    stream_handler.setFormatter(formatter)
    stream_handler.setLevel(log_level)
    log.addHandler(stream_handler)

    file_handler.setFormatter(h_formatter)
    file_handler.setLevel(logging.DEBUG)
    log.addHandler(file_handler)

    dump_file_handler.setFormatter(h_formatter)
    dump_file_handler.setLevel(logging.DEBUG)
    log.addHandler(dump_file_handler)

    if log_dir == tmp_dir:
        logging.warning('will log in %s', tmp_dir)

    def dump_filter(record):
        r = record.getMessage().startswith('DUMPED')
        # print('dump filter', r)
        # if r:
        #    logging.error('An error has been dumped somewhere')
        return r

    def no_dump_filter(record):
        r = record.getMessage().startswith('DUMPED')
        # print('no dump filter', not r)
        return not r

    for h in (stream_handler, file_handler):
        h.addFilter(no_dump_filter)
        pass  #

    dump_file_handler.addFilter(dump_filter)

    # log.error('not an error, just showing what logs look like')
    # log.info('Verbose is on')
    # log.debug(f'Debug is on')

    return log