def setup(logdir='log'):
    """ Set up dual logging to console and to logfile.

    When this function is called, it first creates the given directory. It then 
    creates a logfile and passes all log messages to come to it. The logfile
    name encodes the date and time when it was created, for example 
    "20181115-153559.txt". All messages with a log level of at least "WARNING" 
    are also forwarded to the console.

    Args:
        logdir: path of the directory where to store the log files. Both a
            relative or an absolute path may be specified. If a relative path is
            specified, it is interpreted relative to the working directory.
            If no directory is given, the logs are written to a folder called 
            "log" in the working directory. 
    """

    # Create the root logger.
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

    # Validate the given directory.
    logdir = os.path.normpath(logdir)

    # Create a folder for the logfiles.
    if not os.path.exists(logdir):
        os.makedirs(logdir)

    # Construct the logfile name.
    t = datetime.datetime.now()
    logfile = '{year:04d}{mon:02d}{day:02d}-' \
        '{hour:02d}{min:02d}{sec:02d}.log'.format(
            year=t.year, mon=t.month, day=t.day, 
            hour=t.hour, min=t.minute, sec=t.second)
    logfile = os.path.join(logdir, logfile)

    # Set up logging to the logfile.
    filehandler = logging.handlers.RotatingFileHandler(
        filename=logfile,
        maxBytes=10*1024*1024,
        backupCount=100)
    filehandler.setLevel(logging.DEBUG)
    fileformatter = logging.Formatter(
        '%(asctime)s %(levelname)-8s: %(message)s')
    filehandler.setFormatter(fileformatter)
    logger.addHandler(filehandler)
    
    # Set up logging to the console.
    streamhandler = logging.StreamHandler()
    streamhandler.setLevel(logging.WARNING)
    streamformatter = logging.Formatter('%(levelname)s: %(message)s')
    streamhandler.setFormatter(streamformatter)
    logger.addHandler(streamhandler)
def setup ( logdir = 'log' ) : logger = logging . getLogger ( ) logger . setLevel ( logging . DEBUG ) logdir = os . path . normpath ( logdir ) if not os . path . exists ( logdir ) : os . makedirs ( logdir ) t = datetime . datetime . now ( ) logfile = '{year:04d}{mon:02d}{day:02d}-' '{hour:02d}{min:02d}{sec:02d}.log' . format ( year = t . year , mon = t . month , day = t . day , hour = t . hour , min = t . minute , sec = t . second ) logfile = os . path . join ( logdir , logfile ) filehandler = logging . handlers . RotatingFileHandler ( filename = logfile , maxBytes = 10 * 1024 * 1024 , backupCount = 100 ) filehandler . setLevel ( logging . DEBUG ) fileformatter = logging . Formatter ( '%(asctime)s %(levelname)-8s: %(message)s' ) filehandler . setFormatter ( fileformatter ) logger . addHandler ( filehandler ) streamhandler = logging . StreamHandler ( ) streamhandler . setLevel ( logging . WARNING ) streamformatter = logging . Formatter ( '%(levelname)s: %(message)s' ) streamhandler . setFormatter ( streamformatter ) logger . addHandler ( streamhandler )
Set up dual logging to console and to logfile.

    When this function is called, it first creates the given directory. It then 
    creates a logfile and passes all log messages to come to it. The logfile
    name encodes the date and time when it was created, for example 
    "20181115-153559.txt". All messages with a log level of at least "WARNING" 
    are also forwarded to the console.

    Args:
        logdir: path of the directory where to store the log files. Both a
            relative or an absolute path may be specified. If a relative path is
            specified, it is interpreted relative to the working directory.
            If no directory is given, the logs are written to a folder called 
            "log" in the working directory.