Модуль logging пишет не в тот файл

Нужна небольшая помощь с логированием.
Скелет программы примерно такой:

import threading
import time
import schedule
import json
import logging
import log
import datetime

def func1():
   #do something
   logging.info('Write some loge')
def func2():
   #do something
   logging.info('Write some loge')
def func3():
   #do something
   logging.info('Write some loge')

def run_schedule():
    schedule.every(30).seconds.do(run_threaded, func1)
    schedule.every(30).seconds.do(run_threaded, func2)
    schedule.every(60).seconds.do(run_threaded, func3)
    schedule.every().day.at("00:00").do(log.create_log_file)

    while 1:
        schedule.run_pending()
        time.sleep(1)

if __name__ == '__main__':
    log.create_directories()
    log.create_log_file()
    logging.basicConfig(filename=str(str(json.loads(get_json())['directories']['logs']) + '/' + str(datetime.date.today()) + '.log'), 
                        level=logging.INFO,
                        format="%(asctime)s %(levelname)s %(message)s",
                        encoding="utf-8")
    run_schedule()

То есть, при запуске программа делает следующее:

  • Запускает функцию создания нужной директории для логирования (папку logs)
  • Запускает функцию создания файла для записи логов
  • Ну и прописываю basicConfig. в filename должно получаться 'logs/2024-07-07.log' (ну, по задумке вместо 2024-07-07 каждый раз должна вставать текущая дата).

То есть, в плане ежедневно в 00:00 должен создаваться файл с расширением .log и текущей датой в имени (создается, тут все ок). И после создания в логи должны начать писаться в этот файл. Но я столкнулся с проблемой, что логи после 00:00 пишутся в файл за предыдущий день.

Выглядит вот так:

  • 07.07.2024 при запуске в 23:50 программа создала директорию, создала файл с именем "2024-07-07.log"
  • Начала писать туда логи
  • В 00:00 создала файл с именем "2024-07-08.log"
  • В 00:01 и далее продолжает писать логи в файл "2024-07-07.log" до тех пор, пока не перезапустишь программу. Хотя, по задумке, должна была начать писать в "2024-07-08.log"

Подскажите, пожалуйста, что я мог упустить или сделать неправильно?


Ответы (1 шт):

Автор решения: cold_reader

В итоге решил проблему полукостыльным способом. Завел отдельный файл .py, в нем сделал себе функцию для логирования:

def setup_logger(name):
    log_dir = 'logs/'
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

    filename = f"{datetime.datetime.now().strftime('%Y-%m-%d')}.log"
    log_file = os.path.join(log_dir, filename)
    handler = logging.FileHandler(log_file, encoding='utf-8')
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    handler.setFormatter(formatter)

    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)

    # Удаляем все предыдущие обработчики, чтобы запись происходила только в актуальный файл
    for h in logger.handlers[:]:
        logger.removeHandler(h)

    logger.addHandler(handler)

    return logger

Далее этот модуль можно импортировать в любой другой, в нужной функции определить логгер в нужную переменную, и писать в файл то, что нужно.

Например:

import custom_log

def main():
    logger = custom_log.setup_logger('main')
    # do something
    logger.info('Записать что-то в лог')
→ Ссылка