Как получить скрипт / имя файла конкретной строки кода? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть общий файл log.py, в который я импортировал регистрацию Python и использовал все функции в нем.

Теперь мне нужно отформатировать журнал так, чтобы

(current_script_name) [levelname] message

log.py

import logging
import inspect
import sys

class log(object):
    #file_name = sys.argv[0] #this will give b.py instead of a.py
    file_name = str(inspect.getfile(inspect.currentframe())).split("/")[-1]
    logging.basicConfig(level=logging.INFO, format="("+file_name+") [%(levelname)s] %(message)s")
    def __init__(self):
        pass
    def info(msg):
        logging.info(msg)
    def error(msg):
        logging.error(msg)
    def warning(msg):
        logging.warning(msg)
    def debug(msg):
        logging.debug(msg)

Теперь у меня есть еще один файл с именем a.py, в который я импортировал указанный выше файл и использовал его как

import log
def some():
    log.info("Hello this is information")

Это даст следующий вывод при вызовеsome() in b.py

(log.py) [INFO] Hello this is information

но я ожидаю, что ниже выводится, потому что log.info() код используется в a.py

(a.py) [INFO] Hello this is information

Примечание: я не долженпередать любой аргумент для log.info(msg) строки в a.py

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

file.py

import logging,os

script_name=os.path.basename(__file__)
#log file path
log_path=""

logging.basicConfig(filename=("log_file.txt"), level=logging.DEBUG, format='[{}] %(message)s'.format(script_name) )

def log(msg):
    logging.info(msg)

log("logging")

Результат: -> file.py

[file. py] logging

этот формат поможет вам добавить имя файла.

0 голосов
/ 01 ноября 2019

Одним из решений было бы передать имя файла исполняемого скрипта в регистратор.

Внутри a.py:

log.info("Hello this is information", executing_script=__file__)

(Для получения дополнительной информации об использовании file variable: https://note.nkmk.me/en/python-script-file-path/)

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

class log(object):
  def __init__(self, executing_script):
    self.file_name = executing_script
  # ...

Таким образом, вы можете просто ссылаться на self.file_name в своих функциях регистрации, вместо того, чтобы передавать значение каждой из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...