Python / Django: đăng nhập vào bảng điều khiển dưới trình chạy, đăng nhập vào tệp trong Apache


114

Làm cách nào để gửi các thông báo theo dõi tới bảng điều khiển (như print) khi tôi đang chạy ứng dụng Django của mình manage.py runserver, nhưng các thông báo đó có được gửi tới tệp nhật ký khi tôi đang chạy ứng dụng trong Apache?

Tôi đã xem xét ghi nhật ký Django và mặc dù tôi rất ấn tượng với tính linh hoạt và khả năng cấu hình của nó cho các mục đích sử dụng nâng cao, tôi vẫn lúng túng với cách xử lý trường hợp sử dụng đơn giản của mình.


1
Giải pháp đơn giản nhất là phải có file settings.py khác nhau cho máy chủ chính và môi trường phát triển, xem deploydjango.com/django_project_structure
Alex

Câu trả lời:


84

Văn bản được in sang stderr sẽ hiển thị trong nhật ký lỗi của httpd khi chạy dưới mod_wsgi. Bạn có thể sử dụng printtrực tiếp hoặc sử dụng loggingthay thế.

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

2
Về mặt kỹ thuật, nó không phải là WSGI hợp lệ và sẽ gây ra lỗi trong các môi trường nghiêm ngặt hơn.
Paul McMillan

13
Không có gì sai khi sử dụng 'print' với 'sys.stderr' theo như WSGI đi và nó sẽ không gây ra lỗi.
Graham Dumpleton

Tôi đã nhập hệ thống nhưng điều này dường như không hiệu quả với tôi.
Hack-R

17
Điều này không hoạt động trong Python 3, hãy xem ở đây . Bạn cầnprint("Goodbye cruel world!", file=sys.stderr)
thảo quả

103

Đây là một giải pháp dựa trên ghi nhật ký Django. Nó sử dụng cài đặt DEBUG thay vì thực sự kiểm tra xem bạn có đang chạy máy chủ phát triển hay không, nhưng nếu bạn tìm thấy cách tốt hơn để kiểm tra thì nó sẽ dễ dàng thích ứng.

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']

xem https://docs.djangoproject.com/en/dev/topics/logging/ để biết chi tiết.


8
cũng cố gắngLOGGING['loggers'][logger]['handlers'] += ['console']
Nir Levy

@ m01: Sau khi định cấu hình cái này thành settings.py, làm cách nào để sử dụng cái này cho mục đích in? Cảm ơn
Niks Jain

Tôi đặt mã từ câu trả lời của mình settings.pyvào phần cuối của tôi và đặt DEBUG = True(tìm cài đặt đó ở gần đầu trong cùng một tệp). Sau đó, tôi chạy python manage.py runservertừ một thiết bị đầu cuối (xem tài liệu django để biết chi tiết) và thông báo nhật ký sẽ xuất hiện trong cửa sổ đầu cuối. Trong quá trình sản xuất, tôi sẽ sử dụng một settings.py khác, nơi DEBUG = False- các thông báo nhật ký được chuyển đến /path/to/your/file.log.
m01,

Sự thụt lề của bạn làm tôi đau đầu. Cảm ơn vì thông tin, nó hoạt động!
ioan

Cảm ơn! Tôi đã thực hiện một số thay đổi đối với thụt đầu dòng, tôi hy vọng nó tốt hơn bây giờ
M01

27

Bạn có thể cấu hình đăng nhập vào settings.pytệp của mình .

Một ví dụ:

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

Tuy nhiên, điều đó phụ thuộc vào việc thiết lập GỠ LỖI và có thể bạn không muốn phải lo lắng về cách thiết lập nó. Xem câu trả lời này trên Làm cách nào để biết ứng dụng Django của tôi có đang chạy trên máy chủ phát triển hay không? để có cách viết điều kiện tốt hơn. Chỉnh sửa: ví dụ trên là từ một dự án Django 1.1, cấu hình ghi nhật ký trong Django đã thay đổi phần nào kể từ phiên bản đó.


Tôi không muốn dựa vào NỢ; Tôi muốn phụ thuộc vào cơ chế phát hiện máy chủ nhà phát triển được liên kết trong bài đăng khác đó. Nhưng cơ chế phát hiện của bài đăng khác dựa vào việc có quyền truy cập vào một trường hợp yêu cầu. Làm cách nào để tôi có được một phiên bản yêu cầu trong settings.py?
Justin Grant

4

Tôi sử dụng cái này:

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

Bạn có thể thực hiện việc này khá dễ dàng với tagalog(https://github.com/dorkitude/tagalog)

Ví dụ: trong khi mô-đun python tiêu chuẩn ghi vào một đối tượng tệp được mở ở chế độ nối thêm, thì mô-đun App Engine (https://github.com/dorkitude/tagalog/blob/master/tagalog_appengine.py) sẽ ghi đè hành vi này và thay vào đó sẽ sử dụng logging.INFO.

Để có được hành vi này trong một dự án App Engine, bạn chỉ cần thực hiện:

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

Bạn có thể tự mở rộng mô-đun và ghi đè chức năng nhật ký mà không gặp nhiều khó khăn.


0

Điều này hoạt động khá tốt trong local.py của tôi, giúp tôi không làm rối việc ghi nhật ký thông thường:

from .settings import *

LOGGING['handlers']['console'] = {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    'formatter': 'verbose'
}
LOGGING['loggers']['foo.bar'] = {
    'handlers': ['console'],
    'propagate': False,
    'level': 'DEBUG',
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.