에서 print
Django 앱을 실행할 때 추적 메시지 (예 :)를 콘솔에 보내려면 어떻게 manage.py runserver
해야하지만 Apache에서 앱을 실행할 때 해당 메시지를 로그 파일로 보내야합니까?
Django 로깅을 검토 한 결과 고급 사용을위한 유연성과 구성 가능성에 감명을 받았지만 여전히 간단한 사용 사례를 처리하는 방법에 어려움을 겪고 있습니다.
에서 print
Django 앱을 실행할 때 추적 메시지 (예 :)를 콘솔에 보내려면 어떻게 manage.py runserver
해야하지만 Apache에서 앱을 실행할 때 해당 메시지를 로그 파일로 보내야합니까?
Django 로깅을 검토 한 결과 고급 사용을위한 유연성과 구성 가능성에 감명을 받았지만 여전히 간단한 사용 사례를 처리하는 방법에 어려움을 겪고 있습니다.
답변:
stderr에 인쇄 된 텍스트는 mod_wsgi에서 실행할 때 httpd의 오류 로그에 표시됩니다. print
직접 사용하거나 logging
대신 사용할 수 있습니다 .
print >>sys.stderr, 'Goodbye, cruel world!'
다음은 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/ 을 참조하십시오.
LOGGING['loggers'][logger]['handlers'] += ['console']
settings.py
아래쪽으로 넣고 설정합니다 DEBUG = True
(같은 파일의 위쪽에서 해당 설정을 찾으십시오). 그런 다음 python manage.py runserver
터미널에서 실행 하면 (자세한 내용은 django 문서 참조) 로그 메시지가 터미널 창에 나타납니다. 프로덕션에서는 다른 settings.py를 사용합니다. 여기서 DEBUG = False
로그 메시지는 /path/to/your/file.log
.
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의 로깅 구성은 해당 버전 이후 약간 변경되었습니다.
나는 이것을 사용한다 :
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()
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'])
모듈을 직접 확장하고 큰 어려움없이 로그 함수를 덮어 쓸 수 있습니다.