2015-12-04 4 views
1

Итак, я использую модуль регистрации исключений, который я нашел и немного изменил. Но я не могу понять, почему он не будет создавать файл и писать ему.Запись в Python не будет записываться в файл

Это мой модуль:

"""Exception logging""" 
import sys 
import traceback 
import logging 

logger = logging 
def setup_logging_to_file(): 
    logger = logging.basicConfig(filename='error_log.txt', 
           filemode='w', 
           level=logging.DEBUG, 
           format= '%(asctime)s - %(levelname)s - %(message)s', 
          ) 


def log_exception(e): 
    logger.error(
    "Function {function_name} raised {exception_class} ({exception_docstring}): {exception_message}".format(
    function_name = extract_function_name(), #this is optional 
    exception_class = e.__class__, 
    exception_docstring = e.__doc__, 
    exception_message = e.message)) 

def extract_function_name(): 
    tb = sys.exc_info()[-1] 
    stk = traceback.extract_tb(tb, 1) 
    fname = stk[0][3] 
    return fname 

Я бегу setup_logging_to_file() на старте вверх, то всякий раз, когда я ударил исключение я называю log_exception и передать это исключение, но он не будет даже создать файл error_log.txt

from app.exception_logging import log_exception, setup_logging_to_file 

def myFunc(): 
    try: 
     .... 
    except Exception as ex:   
     log_exception(ex) 
+0

Вы должны удалить лишние запятые на 'format' аргумент' logging.basicConfig'. Кроме того, когда вы вызываете 'log_exception()', 'logger' является ссылкой на' logging', а не на переменную 'logger', используемую в' setup_logging_to_file', потому что глобальные переменные являются «только для чтения». Вы должны использовать аргумент функции. С другой стороны, я не понимаю, почему вы написали 'logger = logging': просто используйте' logging' –

+0

Что означает, что вы вызываете 'setup_logging_to_file' при запуске? Откуда вы это называете? – Railslide

+0

Я хотел создать модуль для ведения журнала проекта, чтобы я мог просто вызвать функцию log_exception в любом из моих блоков try/catch. Когда я запускаю свой проект, я вызываю 'setup_logging_to_file()' для инициализации моей переменной logger, но я изменил это с того, что @ Loïc G сказал – john

ответ

0

Как указано в комментариях - вы можете получить доступ к журналу напрямую.

Рабочий пример, файл с именем logtest.py:

"""Exception logging""" 
import sys 
import traceback 
import logging 

logging.basicConfig(filename='/tmp/error_log.txt', 
          filemode='w', 
          level=logging.DEBUG, 
          format= '%(asctime)s - %(levelname)s - %(message)s', 
       ) 


def log_exception(e): 
    logging.error(
    "Function {function_name} raised {exception_class} ({exception_docstring}): {exception_message}".format(
    function_name = extract_function_name(), #this is optional 
    exception_class = e.__class__, 
    exception_docstring = e.__doc__, 
    exception_message = e.message)) 

def extract_function_name(): 
    tb = sys.exc_info()[-1] 
    stk = traceback.extract_tb(tb, 1) 
    fname = stk[0][3] 
    return fname 

назначения файла:

from logtest import log_exception 

try: 
    open("somthingnotthere",'r') 
except Exception as ex:   
    log_exception(ex) 
+0

У меня есть все мои записи в собственном файле python, так что в моем проекте я могу просто вызвать функцию в все мои блоки try/catch – john

+0

обновлены, чтобы показать пример с двумя файлами. То, что вы действительно делали неправильно, было в функции setup_logging_to_file. Если вы хотите использовать эту функцию. Вы должны передать объект журнала в качестве параметра. – joeButler

Смежные вопросы