Модуль Python генерирует логи, если запускается напрямую, а не при запуске `pytest` - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в ведении журнала Python и хотел бы создать надежную настройку ведения журнала для проекта, использующего watchdog для ведения журнала создания файлов DICOM в заданном каталоге.Моя структура проекта:

planqa\
    src\
        watcher.py
        qa_logger.py
        logs\
            qa_watch.log
    tests\
        test_watchdog.py


Пока у меня есть LOGGING_DICT в qa_logger.py.LOGGING_DICT импортируется в watcher.py (и, возможно, в другие модули), а затем в верхнюю часть watcher.py, я поставил следующие строки:

logging.config.dictConfig(LOGGING_DICT)
logger = logging.getLogger()

Когда я запускаю python watcher.py,все журналы генерируются красиво.Журналы одновременно выводятся на консоль и записываются в файл src\logs\qa_watch.log.

Проблема возникает, когда я запускаю pytest.Логи не создаются вообще.Тем не менее, как ни странно, файл файл src\logs\qa_watch.log создается , если его не существует, но он просто никогда не записывается (в отличие от того, когда я запускаю python watcher.py)!

I 'Я хотел бы использовать pytest, чтобы убедиться, что журнал был создан в src\logs\qa_watch.log при создании действительного файла DICOM в просматриваемой папке.

Буду признателен за любую помощь, включая любые комментарии о том, как улучшитьструктурировать вещи!Я все еще (и всегда буду) учусь!

РЕДАКТИРОВАТЬ : Уровень журнала не проблема.У меня та же проблема, если я использую logger.warning() вместо logger.info() для журналов в watcher.py.

Файлы:

# qa_logger.py

import logging
from logging.config import dictConfig
import os
from os.path import dirname, join as pjoin
import sys

LOG_DIR = pjoin(dirname(dirname(__file__)), "logs")

LOGGING_DICT = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'f': {
        'format': '%(asctime)s %(name)-12s %(levelname)-8s: %(message)s'
        }
    },
'handlers': {
    'console': {
        'class': 'logging.StreamHandler',
        'formatter': 'f',
        'level': logging.DEBUG
        },
    'file': {
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'level': logging.DEBUG,
        'formatter': 'f',
        'filename': pjoin(LOG_DIR, "qa_watch.log"),
        'when': 'midnight',
        'interval': 1,
        'backupCount': 30
        }
    },
'root': {
    'handlers': ['console', 'file'],
    'level': logging.DEBUG,
    },
}


# watcher.py

import logging
from time import sleep
from os.path import abspath, dirname, join as pjoin
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
from src.qa_logger import LOGGING_DICT

logging.config.dictConfig(LOGGING_DICT)
logger = logging.getLogger()

class NewFileHandler(PatternMatchingEventHandler):
    patterns = ['*.dcm']
    ignore_patterns = None
    case_sensitive = False
    ignore_directories = True 

    def on_created(self, event):
        msg = "Caught creation of {}".format(event.src_path)
        logger.info(msg)


def watch_for_dicoms_created_in_folder(folder=None):

    if folder is None:
        folder = abspath(pjoin(dirname(dirname(__file__)), "tests", "data"))

    dcm_handler = NewFileHandler()

    observer = Observer()
    observer.schedule(dcm_handler, folder, recursive=True)
    observer.start()
    logger.info("----- Started watcher -----")
    try:
        while True:
            sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

if __name__ == "__main__":
    watch_for_dicoms_created_in_folder()


# test_watchdog.py

import logging
import os
from os.path import dirname, join as pjoin, isfile
from multiprocessing import Process
from time import sleep
from src.watcher import watch_for_dicoms_created_in_folder
from src.qa_logger import LOG_DIR

DATA_DIR = pjoin(dirname(__file__), "data")
LOG_PATH = pjoin(LOG_DIR, "qa_watch.log")

def test_watching_for_file_creation():

    dcm_test_filepath = pjoin(DATA_DIR, "a_dcm_to_catch.dcm")
    nondcm_test_filepath = pjoin(DATA_DIR, "not_a_dcm_to_catch.txt")

    # Watcher is run in a separate process or subsequent code will not execute
    watch1 = Process(name='watch1', target=watch_for_dicoms_created_in_folder)

    watch1.start()

    dcm_test_file = open(dcm_test_filepath, 'w')
    nondcm_test_file = open(nondcm_test_filepath, 'w')
    dcm_test_file.close()
    nondcm_test_file.close()

    sleep(0.2) # Give watcher time to see files and create logfile
    watch1.terminate()

    assert isfile(LOG_PATH)

    with open(LOG_PATH) as logfile:
        assert dcm_test_filepath in logfile
        assert not nondcm_test_filepath in logfile

    # Cleanup
    try:
        os.remove(dcm_test_filepath)
        os.remove(nondcm_test_filepath)
    except OSError:
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...