Search code examples
pythonloggingglobal-variables

Why global variable is empty in AppFilter (logging.basicConfig)?


I use Python and Logging facility for Python.

I have config.py:

MY_VARIABLE = ''

I have main.py:

from log import *
from config import MY_VARIABLE

for i in range(3):
    global MY_VARIABLE
    print(f"main.py Old: '{MY_VARIABLE}'")
    MY_VARIABLE = i
    print(f"main.py New: '{MY_VARIABLE}'")
    
    logging.info("The process is running...")

I have log.py:

import logging
from config import MY_VARIABLE


class AppFilter(logging.Filter):
    def filter(self, record):
        global MY_VARIABLE
        print(f"log.py MY_VARIABLE:{MY_VARIABLE}")
        record.my_variable = MY_VARIABLE
        return True

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s %(levelname)s (%(my_variable)s) > %(message)s',
    datefmt='%H:%M:%S'
)
logging.getLogger('').addFilter(AppFilter())

I get:

main.py Old: ''
main.py New: '0'
log.py MY_VARIABLE:''
main.py Old: '0'
main.py New: '1'
log.py MY_VARIABLE:''
main.py Old: '1'
main.py New: '2'
log.py MY_VARIABLE:''
14:23:28 INFO file №  > The process is running...
14:23:28 INFO file №  > The process is running...
14:23:28 INFO file №  > The process is running...

Why variable MY_VARIABLE is empty in log.py? How to fix it?


Solution

  • When main.py executes the line of code MY_VARIABLE = i, this rebinds that variable name to a brand new object. The connection to the original import is lost.

    Do it this way instead:

    import config
    config.MY_VARIABLE = <something>