Python / Django : runserver에서 콘솔에 로그, Apache에서 파일에 로그


114

에서 printDjango 앱을 실행할 때 추적 메시지 (예 :)를 콘솔에 보내려면 어떻게 manage.py runserver해야하지만 Apache에서 앱을 실행할 때 해당 메시지를 로그 파일로 보내야합니까?

Django 로깅을 검토 한 결과 고급 사용을위한 유연성과 구성 가능성에 감명을 받았지만 여전히 간단한 사용 사례를 처리하는 방법에 어려움을 겪고 있습니다.


1
가장 간단한 해결책은 메인 서버와 개발 환경에 대해 다른 settings.py 파일을 갖는 것입니다. deploydjango.com/django_project_structure
Alex

답변:


84

stderr에 인쇄 된 텍스트는 mod_wsgi에서 실행할 때 httpd의 오류 로그에 표시됩니다. print직접 사용하거나 logging대신 사용할 수 있습니다 .

print >>sys.stderr, 'Goodbye, cruel world!'

2
그러나 기술적으로 유효한 WSGI는 아니며 더 엄격한 환경에서 오류가 발생합니다.
Paul McMillan 2011 년

13
WSGI가 진행되는 한 'sys.stderr'과 함께 'print'를 사용하는 데 아무런 문제가 없으며 오류를 트리거하지 않아야합니다.
Graham Dumpleton 2012

나는 sys를 가져 왔지만 이것은 나를 위해 작동하지 않는 것 같습니다.
Hack-R

17
이것은 파이썬 3에서 작동하지 않습니다 . 여기를보세요 . 당신은 필요합니다print("Goodbye cruel world!", file=sys.stderr)
cardamom

103

다음은 Django 로깅 기반 솔루션입니다. 실제로 개발 서버를 실행 중인지 여부를 확인하는 대신 DEBUG 설정을 사용하지만 확인하는 더 좋은 방법을 찾으면 쉽게 적용 할 수 있습니다.

LOGGING = {
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/your/file.log',
            'formatter': 'simple'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

if DEBUG:
    # make all loggers use the console.
    for logger in LOGGING['loggers']:
        LOGGING['loggers'][logger]['handlers'] = ['console']

자세한 내용은 https://docs.djangoproject.com/en/dev/topics/logging/ 을 참조하십시오.


8
또한 시도LOGGING['loggers'][logger]['handlers'] += ['console']
Nir 씨 레비

@ m01 : settings.py에 구성한 후 인쇄 용도로 사용하는 방법은 무엇입니까? 감사합니다
하기 Niks 자이나교

내 대답의 코드를 settings.py아래쪽으로 넣고 설정합니다 DEBUG = True(같은 파일의 위쪽에서 해당 설정을 찾으십시오). 그런 다음 python manage.py runserver터미널에서 실행 하면 (자세한 내용은 django 문서 참조) 로그 메시지가 터미널 창에 나타납니다. 프로덕션에서는 다른 settings.py를 사용합니다. 여기서 DEBUG = False로그 메시지는 /path/to/your/file.log.
M01

당신의 들여 쓰기는 나에게 두통을 주었다. 정보 주셔서 감사합니다. 작동합니다!
ioan

감사! 들여 쓰기를 약간 변경했습니다. 이제 더 나아 졌으면합니다
m01

27

settings.py파일 에서 로깅을 구성 할 수 있습니다 .

한 가지 예 :

if DEBUG:
    # will output to your console
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(message)s',
    )
else:
    # will output to logging file
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(message)s',
        filename = '/my_log_file.log',
        filemode = 'a'
    )

그러나 이는 DEBUG 설정에 따라 다르며 설정 방법에 대해 걱정할 필요가 없을 수도 있습니다. Django 애플리케이션이 개발 서버에서 실행 중인지 여부어떻게 알 수 있습니까?에 대한이 답변을 참조하십시오 . 조건문을 작성하는 더 나은 방법입니다. 편집 : 위의 예제는 Django 1.1 프로젝트에서 가져온 것입니다. Django의 로깅 구성은 해당 버전 이후 약간 변경되었습니다.


DEBUG에 의존하고 싶지 않습니다. 차라리 다른 게시물에 링크 된 dev-server 감지 메커니즘에 의존하고 싶습니다. 그러나 다른 게시물의 감지 메커니즘은 요청 인스턴스에 대한 액세스 권한에 의존합니다. settings.py에서 요청 인스턴스를 얻으려면 어떻게해야합니까?
Justin Grant

4

나는 이것을 사용한다 :

logging.conf :

[loggers]
keys=root,applog
[handlers]
keys=rotateFileHandler,rotateConsoleHandler

[formatters]
keys=applog_format,console_format

[formatter_applog_format]
format=%(asctime)s-[%(levelname)-8s]:%(message)s

[formatter_console_format]
format=%(asctime)s-%(filename)s%(lineno)d[%(levelname)s]:%(message)s

[logger_root]
level=DEBUG
handlers=rotateFileHandler,rotateConsoleHandler

[logger_applog]
level=DEBUG
handlers=rotateFileHandler
qualname=simple_example

[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=applog_format
args=('applog.log', 'a', 10000, 9)

[handler_rotateConsoleHandler]
class=StreamHandler
level=DEBUG
formatter=console_format
args=(sys.stdout,)

testapp.py :

import logging
import logging.config

def main():
    logging.config.fileConfig('logging.conf')
    logger = logging.getLogger('applog')

    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    #logging.shutdown()

if __name__ == '__main__':
    main()

0

tagalog(https://github.com/dorkitude/tagalog)로 꽤 쉽게 할 수 있습니다.

예를 들어 표준 Python 모듈이 추가 모드로 열린 파일 객체에 쓰는 동안 App Engine 모듈 (https://github.com/dorkitude/tagalog/blob/master/tagalog_appengine.py)은이 동작을 재정의하고 대신 logging.INFO.

App Engine 프로젝트에서이 동작을 얻으려면 다음을 수행하면됩니다.

import tagalog.tagalog_appengine as tagalog
tagalog.log('whatever message', ['whatever','tags'])

모듈을 직접 확장하고 큰 어려움없이 로그 함수를 덮어 쓸 수 있습니다.


0

이것은 내 local.py에서 아주 잘 작동하여 일반 로깅을 엉망으로 만듭니다.

from .settings import *

LOGGING['handlers']['console'] = {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    'formatter': 'verbose'
}
LOGGING['loggers']['foo.bar'] = {
    'handlers': ['console'],
    'propagate': False,
    'level': 'DEBUG',
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.