Модуль 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 шт):
В итоге решил проблему полукостыльным способом. Завел отдельный файл .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('Записать что-то в лог')