2013-04-20 4 views
1

Я пытаюсь создать пользовательский Лог инфокодов так:Python, ведение журнала: неправильный путь к файлу при расширении Logger

Файл: logger.py

import logging 

class Logger(logging.getLoggerClass()): 
    def warning(self, msg, *args, **kwargs): 
     super(Logger, self).warning(msg, *args, **kwargs) 

logging.setLoggerClass(Logger) 
log = logging.getLogger('test') 
handler = logging.StreamHandler() 
formatter = logging.Formatter('%(pathname)s') 
handler.setFormatter(formatter) 
log.addHandler(handler) 

Файл: test.py

from logger import log 

log.warning('') 

Выход:

$ python test.py 
/home/dario/Desktop/logging_test/logger.py 

Ожидаемый результат будет:

/home/dario/Desktop/logging_test/test.py 

Что еще страннее, если я закомментировать setLoggerClass линию я получаю test.py, но без полного пути.

Что я делаю неправильно? Спасибо!

Протестировано с помощью Python 2.7.4 и 3.3.1 на Arch Linux x86_64.

+0

Есть ли какая-либо конкретная причина вы должны создать подкласс класса лесоруба? – Aya

+0

Моя цель - форматировать сообщения журнала различными способами в зависимости от их уровня; все работает отлично, за исключением этой вещи, но я все еще проверяю это, потому что я уверен, что в какой-то момент разработки я действительно получал правильный путь. – kynikos

+0

Вероятно, проще использовать [Handlers] (http: // docs. python.org/2/howto/logging.html#handlers). – Aya

ответ

0

От Python Documentation - Logging - LogRecord attributes:

% (путь к файлу) s - Полный путь к исходному файлу, где был выдан вызов регистрации (если таковая имеется).

I.e. где объект logging (или любой подкласс, например Logger) был инициализирован.
В этом случае logging и ваш экземпляр его, log, оба определены и инициализированы в том же файле test.py.

Может быть, это немного яснее, если я разделить файлы:

logger.py: (класс)

import logging           

# This is the path `logging` gets       
class Logger(logging.getLoggerClass()):     
    def warning(self, msg, *args, **kwargs):    
     super(Logger, self).warning(msg, *args, **kwargs) 

log.py:log модуль, который имеет log объект типа Logger)

import logging 
from logger import Logger 

logging.setLoggerClass(Logger) 
log = logging.getLogger('test') 
handler = logging.StreamHandler() 

# Not this file's path, but where class Logger 
# creates a logging object with super() 
formatter = logging.Formatter('%(pathname)s') 
handler.setFormatter(formatter) 
log.addHandler(handler) 

test.py: (основные)

from log import log 

log.warning('')  
+0

Вернее, это то, откуда был вызван метод класса базового регистратора, а не там, где он был определен, хотя в этом примере они являются одним и тем же файлом , – Aya

+0

Тогда почему, если я не продлеваю Logger, имя пути не возвращает '/ usr/lib /.../ logging/__ init __. Py' (где определен исходный класс' Logger'), но 'test.py'? – kynikos

+0

@kynikos Опять же, откуда вызывается метод 'warning()', а не там, где он был определен. – Aya

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