0

When I run a program someprogram.py, I would prefer a log filename like:

someprogram.py_2021_11_10_20_25_00.log

So that the name of the logfile tells me from which program it is generated and what time that program started.

This is not difficult to implement.

But since we're using a logging module, I would expect this to be built-in in logging.basicConfig, so something like: logging.basicConfig(filename=module_%(asctime)s,

martineau
  • 119,623
  • 25
  • 170
  • 301
evert823
  • 111
  • 1
  • 2
  • asking for coding on command is not permitted at SO. Show more effort on what you've tried. End of Review. – ZF007 Nov 11 '21 at 19:05

1 Answers1

0

You can just add a name as a keyword like in the example here in Logging Cookbook

Here your Module / file The 'filename' 'spam_application.auxiliary'

import logging
import sys
# create logger
MODULE_NAME = 'spam_application.auxiliary' # Keyword of the file / Module
module_logger = logging.getLogger(MODULE_NAME)

class Auxiliary:
    class_name = 'spam_application.auxiliary.Auxiliary' # Class name
    def __init__(self):
        module_logger.info('creating an instance of Auxiliary')
        self.logger = self.set_up_config()
        self.logger.info('instance of Auxiliary initialized!')
    def do_something(self):
        self.logger.info('doing something')
        a = 1 + 1
        self.logger.info('done doing something')

    def set_up_config(self):
        logger = logging.getLogger(self.class_name)
        format = '%(asctime)s %(levelname)s %(name)s: %(message)s ' # Set up the asctime
        FORMATTER = logging.Formatter(format)
        stream_handler = logging.StreamHandler(sys.stdout)  # Using sys.stdout
        stream_handler.terminator = '\n=====================================================\n'
        stream_handler.setLevel(logging.INFO)
        stream_handler.setFormatter(FORMATTER)
        logger.addHandler(stream_handler)
        return logger

def some_function():
    module_logger.info('received a call to "some_function"')

Parent module / Child as per documentation

import logging
import auxiliary_module

# create logger with 'spam_application'
logger = logging.getLogger('spam_application')
logger.setLevel(logging.INFO)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.INFO)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)

logger.info('creating an instance of auxiliary_module.Auxiliary')
a = auxiliary_module.Auxiliary()
logger.info('created an instance of auxiliary_module.Auxiliary')
logger.info('calling auxiliary_module.Auxiliary.do_something')
a.do_something()
logger.info('finished auxiliary_module.Auxiliary.do_something')
logger.info('calling auxiliary_module.some_function()')
auxiliary_module.some_function()
logger.info('done with auxiliary_module.some_function()')

## Calling the logger from another module ##

import logging
import auxiliary_module

a = auxiliary_module.Auxiliary()
aux_module = logging.getLogger('spam_application.auxiliary.Auxiliary')
aux_module.setLevel(logging.INFO)
aux_module.info("Hey")

# 2021-11-10 21:18:04,376 INFO spam_application.auxiliary.Auxiliary: Hey 
# =====================================================

Most simple way to config logger

import logging

format = '%(asctime)s %(levelname)s %(name)s: %(message)s '
logging.basicConfig(
     level=logging.INFO,
     format= format,
     datefmt='%H:%M:%S'
 )
_logger = logging.getLogger('MY_MODULE_NAME')
_logger.info("Here a log")

Output

>>> 20:55:12 INFO __main__: Hello WOrld 

Using StreamerHandler

Needed to register a different logger

import logging
import sys

_logger = logging.getLogger('MY_MODULE_NAME')
_logger.setLevel(logging.DEBUG)
# Streamer Registartion
format = '%(asctime)s %(levelname)s %(name)s: %(message)s '
FORMATTER = logging.Formatter(format)
stream_handler = logging.StreamHandler(sys.stdout) # Using sys.stdout
stream_handler.terminator = '\n====================================================='
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(FORMATTER)
_logger.addHandler(stream_handler)

_logger.info("Here a log")

Same but with a separate streamar

Useful to retrieve some other logs later on. same method can be used to write to a log file

import logging
import sys
import io

_logger = logging.getLogger('MY_MODULE_NAME')
_logger.setLevel(logging.DEBUG)
# Streamer Registartion
format = '%(asctime)s %(levelname)s %(name)s: %(message)s '
FORMATTER = logging.Formatter(format)
stream_handler = logging.StreamHandler(sys.stdout) # Using sys.stdout
stream_handler.terminator = '\n====================================================='
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(FORMATTER)
_logger.addHandler(stream_handler)


# Add to a streamer
streamer = io.StringIO()
format = '%(asctime)s %(levelname)s %(name)s: %(message)s '
FORMATTER = logging.Formatter(format)
stream_handler = logging.StreamHandler(stream=streamer) # We use stringio
stream_handler.terminator = '\n*******************************************************'
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(FORMATTER)
_logger.addHandler(stream_handler)

_logger.info("Here a log")

# Get All logged valued from streamer

steramed_values = streamer.getvalue()
print(f'steramed_values --> \n{steramed_values}')


# 2021-11-10 21:02:15,492 INFO __main__: Here a log 
# =====================================================steramed_values --> 
# 2021-11-10 21:02:15,492 INFO __main__: Here a log 
# *******************************************************

Related Topic / Documentation

Federico Baù
  • 6,013
  • 5
  • 30
  • 38