Làm thế nào để bạn đăng nhập lỗi máy chủ trên các trang web django


175

Vì vậy, khi chơi với sự phát triển, tôi chỉ có thể đặt settings.DEBUGthành Truevà nếu xảy ra lỗi, tôi có thể thấy nó được định dạng độc đáo, với thông tin yêu cầu và theo dõi ngăn xếp tốt.

Nhưng trên trang web sản xuất, tôi muốn sử dụng DEBUG=Falsevà hiển thị cho khách truy cập một số trang lỗi 500 tiêu chuẩn với thông tin tôi đang khắc phục lỗi này tại thời điểm này;)
Đồng thời tôi muốn có một số cách đăng nhập tất cả những thông tin đó (theo dõi ngăn xếp và yêu cầu thông tin) đến một tệp trên máy chủ của tôi - vì vậy tôi chỉ có thể xuất nó ra bàn điều khiển của mình và xem lỗi cuộn, gửi email nhật ký cho tôi mỗi giờ hoặc đại loại như thế này.

Những giải pháp đăng nhập nào bạn muốn giới thiệu cho một trang web django, sẽ đáp ứng những yêu cầu đơn giản đó? Tôi có ứng dụng đang chạy như một fcgimáy chủ và tôi đang sử dụng máy chủ web apache làm frontend (mặc dù nghĩ đến việc đi lighttpd).


một cái gì đó từ chiến trường: dlo.me/what-to-do-when-your-site-goes-virus
Cherian


Liên kết mà Cherian chia sẻ hiện đã chết. Nếu bạn thử tìm kiếm Sentry, có khả năng bạn sẽ tìm thấy tài liệu cho ví dụ chính thức, được trả tiền của họ, nhưng đây là liên kết để thiết lập một cá thể tự lưu trữ: docs.sentry.io/server Ngoài ra, đây là repo hiện đang được duy trì: github .com / gotentry / sentry
lehiester

Câu trả lời:


103

Chà, khi nào DEBUG = False, Django sẽ tự động gửi một dấu vết đầy đủ của bất kỳ lỗi nào cho mỗi người được liệt kê trong ADMINScài đặt, giúp bạn nhận được thông báo khá nhiều miễn phí. Nếu bạn muốn kiểm soát chi tiết hơn, bạn có thể viết và thêm vào cài đặt của mình một lớp phần mềm trung gian xác định một phương thức có tên process_exception(), sẽ có quyền truy cập vào ngoại lệ được nêu ra:

http://docs.djangoproject.com/en/dev/topics/http/middleware/# Process-exception

process_exception()Phương pháp của bạn sau đó có thể thực hiện bất kỳ loại ghi nhật ký nào bạn muốn: ghi vào bảng điều khiển, ghi vào tệp, v.v., v.v.

Chỉnh sửa: mặc dù nó ít hữu ích hơn một chút, bạn cũng có thể lắng nghe got_request_exceptiontín hiệu, tín hiệu này sẽ được gửi bất cứ khi nào gặp ngoại lệ trong quá trình xử lý yêu cầu:

http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception

Tuy nhiên, điều này không cung cấp cho bạn quyền truy cập vào đối tượng ngoại lệ, vì vậy phương thức phần mềm trung gian dễ làm việc hơn nhiều.


7
Lưu ý rằng việc sử dụng logging.exception('Some message')với mô-đun ghi nhật ký tiêu chuẩn của python chỉ hoạt động tốt trong trình xử lý sginal got_request_exception, nếu tất cả những gì bạn đang muốn làm là đăng xuất dấu vết ngăn xếp. Nói cách khác, truy nguyên vẫn có sẵn trong got_request_exception.
TM.

Ngoại lệ được truyền vào process_exception dường như không có dấu vết ngăn xếp, có cách nào để có được điều đó không?
Nick BL

79

Django Sentry là một cách tốt để đi, như đã đề cập, nhưng có một chút công việc liên quan đến việc thiết lập nó đúng cách (như một trang web riêng). Nếu bạn chỉ muốn đăng nhập mọi thứ vào một tệp văn bản đơn giản thì đây là cấu hình ghi nhật ký để đặt vàosettings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}

Tôi đồng ý, tôi yêu Sentry! Tôi muốn có một cổng .Net của nó (đang làm việc trên các dự án .Net gần đây).
Gromer

1
Một lỗi đánh máy nhỏ trong trường hợp bất cứ ai đang cắt và dán: "propogate" thay vì "tuyên truyền" ở cuối.
dùng1228295

3
'include_html': TrueKHÔNG chỉ đơn giản là làm cho các email "đẹp hơn"! Nó bao gồm một truy nguyên đầy đủ, bao gồm các giá trị của cài đặt và biến cục bộ. Theo các tài liệu, đây là một vấn đề bảo mật: docs.djangoproject.com/en/1.8/topics/logging/ ám
Thomas

1
Tôi tò mò nếu trình xử lý mail_admins (và trình ghi nhật ký django.request) là cần thiết vì bạn có 'vô hiệu hóa_xác_loggers': Sai và chỉ đơn giản là sao chép ghi nhật ký django mặc định với trình xử lý này (và trình ghi nhật ký). Tôi sẽ cập nhật khi tôi đã thử nghiệm.
DylanYoung

Hãy cập nhật câu trả lời này. Từ nhật ký thay đổi django1.9: Cấu hình ghi nhật ký mặc định của Django không còn định nghĩa các logger 'django.request' và 'django.security'.
narendra-choudhary


30

Rõ ràng James là chính xác, nhưng nếu bạn muốn ghi lại các ngoại lệ trong kho dữ liệu, có một vài giải pháp nguồn mở đã có sẵn:

1) CrashLog là một lựa chọn tốt: http://code.google.com.vn/p/django-crashlog/

2) Db-Log cũng là một lựa chọn tốt: http://code.google.com.vn/p/django-db-log/

Sự khác biệt giữa hai là gì? Hầu như không có gì tôi có thể nhìn thấy, vì vậy một trong hai sẽ đủ.

Tôi đã sử dụng cả hai và chúng hoạt động tốt.


15

Đã một thời gian trôi qua kể từ khi đệ trình mã hữu ích nhất của EMP. Bây giờ tôi mới triển khai nó và trong khi sử dụng một số tùy chọn Manage.txt, để cố gắng tìm ra lỗi, tôi đã nhận được cảnh báo phản đối về hiệu ứng với phiên bản Django hiện tại của tôi (1.5.?) cần thiết cho trình xử lý mail_admins.

Đây là mã sửa đổi:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
            'filters': ['require_debug_false'],
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/home/username/public_html/djangoprojectname/logfilename.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'DEBUG', # Or maybe INFO or WARNING
            'propagate': False
        },
    },
}

Tôi tò mò nếu trình xử lý mail_admins (và trình ghi nhật ký django.request) là cần thiết vì bạn có 'vô hiệu hóa_xác_loggers': Sai và chỉ đơn giản là sao chép ghi nhật ký django mặc định với trình xử lý này (và trình ghi nhật ký). Tôi sẽ cập nhật khi tôi đã thử nghiệm.
DylanYoung

1

Tôi chỉ có một vấn đề gây phiền nhiễu với fcgikịch bản của tôi . Nó xảy ra trước khi django thậm chí bắt đầu. Việc thiếu đăng nhập là rất đau đớn. Dù sao, chuyển hướng stderr đến một tập tin là điều đầu tiên đã giúp rất nhiều:

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
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.