Logging and exporting conf to other modules

32 views Asked by At

Trying to level up my devOps skill I put log where I want/need to my code. Catching an env variable I can setup if I want DEBUG/INFO log (dev) on the standard output or WARNING and above (prod) on a file.

But in python I didn't find how to set a logger conf once (in the main file ?) and use it to the whole project without having to re-write everything or transfer the logging object everywhere. I'm pretty sure I'm missing something.

EDIT : I made a log.py file that looks like this

import os
import logging
from dotenv import load_dotenv
from utils import get_timestamp


def get_logger():
    load_dotenv(".env")
    env_dev = os.getenv('ENV_DEV', "development")

    logger = logging.getLogger(__name__)
    log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    if env_dev == "prod":
        handler = logging.FileHandler(f'log/{get_timestamp("%Y%m%d")}_app.log')
        handler.setLevel(logging.WARNING)
        handler.setFormatter(log_format)
        logger.addHandler(handler)
    else:  # DEV
        handler = logging.StreamHandler()
        handler.setLevel(logging.DEBUG)
        handler.setFormatter(log_format)
        logger.addHandler(handler)

    return logger

And I use it like :

from log.logging import get_logger
# On Dev env
logger = get_logger()
logger.info("Do stuff")
...

But I have no error nor log on my term.

1

There are 1 answers

5
blues On

You don't need to transfer the logging object. When you configure or name a logger once it is globally available. So in your main file you would set up the logger and in all other places just use it.

main file
import logging
logger = logging.getLogger('mylog')
if debug:
    mylog.setLevel(logging.DEBUG)
mylog.addHandler(...)
# do all your setup

logger.log("log that") # use logger
other file
import logging
logger = logging.getLogger('mylog')

logger.log("log this") # use logger, it is already configured