2

I am new to python, and am trying to work out a logging issue. I am trying to stream stdoout, as well as stderr, to the log file that I also manually write entries to when using log...

Also, I am getting duplicate entries on the console, but only one entry in the actual log file, when I manually log entries.

import os 
import datetime
from subprocess import call
import sys
import logging


currDir = os.path.dirname(os.path.abspath(__file__))
today_key = datetime.datetime.now().strftime("%Y%m%d%H%M")
log_file = os.path.join(currDir, "logs", 'stream_'+today_key)+".log"
log_formatter = logging.Formatter('%(asctime)s — %(name)s — %(levelname)s — %(funcName)s:%(lineno)d — %(message)s')
pStart = datetime.datetime.now()

def get_stdout_handler():
    stdout_handler = logging.StreamHandler(sys.stdout)
    stdout_handler.setFormatter(log_formatter)
    return stdout_handler

def get_stderr_handler():
    stderr_handler = logging.StreamHandler(sys.stderr)
    stderr_handler.setFormatter(log_formatter)
    return stderr_handler

def get_file_handler():
    file_handler = logging.FileHandler(log_file, 'a')
    file_handler.setFormatter(log_formatter)
    return file_handler

def get_logger(logger_name):
    log = logging.getLogger(logger_name)
    log.setLevel(logging.DEBUG) 
    log.addHandler(get_stdout_handler())
    log.addHandler(get_stderr_handler())
    log.addHandler(get_file_handler())
    log.propagate = False
    log.hasHandlers = True

    return log

def restore_db():

    call(["ping", "google.com"])


logger = get_logger(__name__)

if __name__ =='__main__':
    logger.info('-----------------------------------')
    logger.info('process start')
    restore_db()
    logger.info('process end')
    logger.info('total processing time (%s)',(datetime.datetime.now() - pStart))
    logger.info('-----------------------------------')

The stream from the ping doesn't appear at all in the log file.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.