Подтвердить что ты не робот

Избегайте `logger = logging.getLogger(__ name __)`

Мы настраиваем регистрацию, как сообщили django docs:

https://docs.djangoproject.com/en/1.9/topics/logging/#using-logging

# import the logging library
import logging

# Get an instance of a logger
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # Log an error message
        logger.error('Something went wrong!')

Я хочу избежать этой строки в каждом файле Python, который хочет зарегистрировать:

logger = logging.getLogger(__name__)

Я хочу, чтобы это было просто:

logging.error('Something went wrong!')

Но мы хотим сохранить одну функцию: мы хотим увидеть имя файла Python в выводе журнала.

До сих пор мы используем этот формат:

'%(asctime)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s'

Пример вывода:

2016-01-11 12:12:31 myapp.foo +68: ERROR Something went wrong

Как избежать logger = logging.getLogger(__name__)?

4b9b3361

Ответ 1

Вы можете использовать logging.basicConfig для определения интерфейса по умолчанию, доступного через logging, следующим образом:

import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s',
                    )

Это определение теперь будет использоваться всякий раз, когда вы выполняете следующее в своем приложении:

import logging
logging.error(...)

Пока __name__ недоступен, эквивалентные (и другие параметры) доступны с помощью атрибутов LogRecord, которые можно использовать для форматирования строки ошибок - включая module, filename и pathname. Ниже приведена двух- script демонстрация этого в действии:

scripta.py

import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(module)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s',
                    )

from scriptb import my_view

my_view()

scriptb.py

import logging

def my_view():
    # Log an error message
    logging.error('Something went wrong!')

Определение регистрации определено в scripta.py с добавленным параметром module. В scriptb.py нам просто нужно импортировать logging, чтобы получить доступ к указанному по умолчанию. При запуске scripta.py создается следующий вывод:

2016-01-14 13:22:24,640 scriptb root.my_view +9: ERROR    [14144] Something went wrong!

Что показывает модуль (scriptb), где регистрируется ошибка.

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

# settings.py - django config
LOGGING_CONFIG = None # disables Django handling of logging
LOGGING = {...}  # your standard Django logging configuration

import logging.config
logging.config.dictConfig(LOGGING)

Ответ 2

как насчет пути? от https://docs.python.org/2/library/logging.html#formatter-objects

/Users/jluc/kds2/wk/explore/test_so_41.py

import logging

#another module, just to have another file...
import test_so_41b

#not so much to use basicConfig as a quick usage of %(pathname)s
logging.basicConfig(level=logging.DEBUG,
                    format='%(pathname)s %(asctime)s %(levelname)s %(message)s',
                    # filename='/tmp/myapp.log',
                    # filemode='w',
                    )

logging.debug('A debug message')
logging.info('Some information')
logging.warning('A shot across the bows')

test_so_41b.dosomething("hey there")

/Users/jluc/kds2/wk/explore/test_so_41b.py

import logging

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

audrey: исследовать jluc $python test_so_41.py

выход:

test_so_41.py 2016-01-16 14:46:57,997 DEBUG A debug message
test_so_41.py 2016-01-16 14:46:57,997 INFO Some information
test_so_41.py 2016-01-16 14:46:57,997 WARNING A shot across the bows
/Users/jluc/kds2/wk/explore/test_so_41b.py 2016-01-16 14:46:57,997 INFO hey there