Как войти в систему для каждого скрипта, используя логирование (python) - PullRequest
0 голосов
/ 23 марта 2020

У меня возникла проблема, когда в настоящее время я использую два входа, где каждый сценарий имеет свое собственное ведение журнала. Я даже использовал filename="Test1/Logs/hello.txt и Test2 для второго сценария, поэтому имя файла отделено. Моя проблема в том, что всякий раз, когда я запускаю скрипт, он сохраняется только в одну папку, и в моем случае это Test1. Он никогда не входит в папку Test2, даже если я запускаю скрипт test2.py, который должен сохранить в журналах папки Test2.

Я сделал следующее:


# -------------------------------------------------------------------------
# CLASS A
# -------------------------------------------------------------------------
logging.basicConfig(
    filename='{}{}.txt'.format(/Test1/Logs, datetime.now().strftime("%a %d %B %Y %H_%M_%S")),
    filemode='a',
    level=logging.INFO,
    format='[%(asctime)s]:%(levelname)s:%(funcName)s - %(message)s',
    datefmt=datetime.now().strftime("%H:%M:%S.%f")[:-3]
)

loggingError = logging.getLogger()
logging.warning("Starting: {}".format(datetime.now().strftime("%a %d-%B-%Y %H:%M:%S")))


class A:

    def __init__(self):
        self.logging = loggingError


    def aW1wb3J0RmlsZXM(self):
        self.logging.error(sys.exc_info(), exc_info=True)

# -------------------------------------------------------------------------
# CLASS B
# -------------------------------------------------------------------------
logging.basicConfig(
    filename='{}{}.txt'.format(/Test2/Logs, datetime.now().strftime("%a %d %B %Y %H_%M_%S")),
    filemode='a',
    level=logging.INFO,
    format='[%(asctime)s]:%(levelname)s:%(funcName)s - %(message)s',
    datefmt=datetime.now().strftime("%H:%M:%S.%f")[:-3]
)

loggingError = logging.getLogger()
logging.warning("Starting: {}".format(datetime.now().strftime("%a %d-%B-%Y %H:%M:%S")))


class B:

    def __init__(self):
        self.logging = loggingError


    def aW1wb3J0RmlsZXM(self):
        self.logging.error(sys.exc_info(), exc_info=True)
import A
import B

def main():

        if True:
            B.main()
            break

        if False:
            A.main()
            break


if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print(e)

Как вы можете видеть, единственная разница между регистрациями - это имя папки имя файла , и все же, даже если я запускаю класс B, он все равно сохраняется в папке класса A. В чем причина?

ОБНОВЛЕНО В КАЖДОМ СЦЕНАРЕ:

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('{}{}.txt'.format(logsPath, datetime.now().strftime("%a %d %B %Y %H_%M_%S")))
formatter = logging.Formatter('[%(asctime)s]:%(levelname)s:%(funcName)s - %(message)s', "%d-%m-%Y %H:%M:%S")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.warning("Starting: {}".format(datetime.now().strftime("%a %d-%B-%Y %H:%M:%S")))

1 Ответ

1 голос
/ 23 марта 2020

Это происходит потому, что когда вы import A запускаете весь код внутри файла. Конкретно звонок на basicConfig. Эта функция работает так, что она действует только в том случае, если ведение журнала еще не настроено, в противном случае она ничего не делает. Поэтому, когда вы настроили первую import A запись в журнал, и второй вызов basicConfig в B. не имеет никакого эффекта.

Это хорошо задокументировано в официальных python документах здесь .

Редактировать: регистрация файлов на модуль проще, если сделать что-то похожее в каждом из файлов:

import logging
local_logger = logging.getLogger(__name__)
local_logger.addHandler(logging.FileHandler('filename.log', 'a'))
local_logger.setLevel(logging.INFO)
...