source

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

bestscript 2023. 8. 8. 23:26

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

추적 메시지를 콘솔로 보내는 방법(예:print) 아래에서 장고 앱을 실행할 때manage.py runserverApache에서 앱을 실행할 때 로그 파일로 메시지가 전송됩니까?

저는 장고 로깅을 검토했고 고급 사용을 위한 유연성과 구성 가능성에 깊은 인상을 받았지만, 여전히 간단한 사용 사례를 처리하는 방법에 대해 고민하고 있습니다.

여기 장고 로깅 기반 솔루션이 있습니다.실제로 개발 서버를 실행하고 있는지 여부를 확인하는 대신 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/ 를 참조하십시오.

mod_wsgi에서 실행하면 stderr로 출력된 텍스트가 httpd의 오류 로그에 표시됩니다.다음 중 하나를 사용할 수 있습니다.print직접 또는 사용logging대신.

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

에서 로깅을 구성할 수 있습니다.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 응용 프로그램이 실행 중인지 여부를 확인하려면 어떻게 해야 합니까?에서 이 답변을 참조하십시오.조건부로 쓰는 더 나은 방법을 위해.편집: 위의 예는 장고 1.1 프로젝트에서 나온 것으로, 장고의 로깅 구성은 해당 버전 이후 다소 변경되었습니다.

사용자:

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,)

테스트 앱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 모듈이 추가 모드에서 열린 파일 개체에 쓰는 동안 AppEngine 모듈(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'])

당신이 직접 모듈을 확장하고 로그 기능을 덮어쓸 수 있습니다.

이것은 제 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',
}

언급URL : https://stackoverflow.com/questions/4558879/python-django-log-to-console-under-runserver-log-to-file-under-apache