Ví dụ về Log to File đơn giản cho django 1.3+


96

Các ghi chú phát hành nói:

Django 1.3 bổ sung hỗ trợ cấp khung cho mô-đun ghi nhật ký của Python.

Thật tuyệt. Tôi muốn tận dụng điều đó. Thật không may , tài liệu không giao tất cả cho tôi trên một đĩa bạc dưới dạng mã ví dụ hoạt động hoàn chỉnh chứng tỏ điều này đơn giản và có giá trị như thế nào.

Làm cách nào để thiết lập tính năng mới thú vị này để tôi có thể sử dụng mã của mình

logging.debug('really awesome stuff dude: %s' % somevar)

và xem tệp "/tmp/application.log" điền vào

18:31:59 Apr 21 2011 awesome stuff dude: foobar
18:32:00 Apr 21 2011 awesome stuff dude: foobar
18:32:01 Apr 21 2011 awesome stuff dude: foobar

Sự khác biệt giữa ghi nhật ký Python mặc định và 'hỗ trợ cấp khung' này là gì?

Câu trả lời:


183

Tôi thực sự yêu thích điều này rất nhiều đây là ví dụ làm việc của bạn! Nghiêm túc điều này là tuyệt vời!

Bắt đầu bằng cách đưa cái này vào settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'null': {
            'level':'DEBUG',
            'class':'django.utils.log.NullHandler',
        },
        'logfile': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': SITE_ROOT + "/logfile",
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console':{
            'level':'INFO',
            'class':'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers':['console'],
            'propagate': True,
            'level':'WARN',
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'MYAPP': {
            'handlers': ['console', 'logfile'],
            'level': 'DEBUG',
        },
    }
}

Bây giờ tất cả những điều này có nghĩa là gì?

  1. Các bộ định dạng Tôi muốn nó có cùng kiểu với ./manage.py runningerver
  2. Trình xử lý - tôi muốn có hai nhật ký - một tệp văn bản gỡ lỗi và một bảng điều khiển thông tin. Điều này cho phép tôi thực sự đào sâu (nếu cần) và xem một tệp văn bản để xem điều gì sẽ xảy ra.
  3. Loggers - Đây là nơi chúng tôi ghi lại những gì chúng tôi muốn ghi nhật ký. Nói chung, django nhận được CẢNH BÁO trở lên - ngoại lệ (do đó có tính phổ biến) là phần phụ trợ nơi tôi thích xem các lệnh gọi SQL vì chúng có thể trở nên điên rồ .. Cuối cùng là ứng dụng của tôi có hai trình xử lý và đẩy mọi thứ vào đó.

Bây giờ làm cách nào để kích hoạt MYAPP để sử dụng nó ...

Theo tài liệu, hãy đặt điều này ở đầu tệp của bạn (views.py) ..

import logging
log = logging.getLogger(__name__)

Sau đó, để có được một cái gì đó ra làm điều này.

log.debug("Hey there it works!!")
log.info("Hey there it works!!")
log.warn("Hey there it works!!")
log.error("Hey there it works!!")

Các cấp độ nhật ký được giải thích ở đây và cho python thuần túy ở đây .


7
tôi đã làm theo các bước trên. tệp được tạo nhưng không có gì được ghi vào nó. lời cầu xin giúp đỡ
Vivek S

12
@InternalServerError bạn cần thay MYAPP bằng tên ứng dụng của mình trong phần trình ghi nhật ký.
Rog

9
Bạn đặt cược! Thay thế 'MyApp' với ''
rh0dium

10
Để làm rõ, bất cứ điều gì bạn gọi trình đăng nhập settings.py, tức là MYAPPtrong ví dụ này, cũng có tham số trong lệnh gọi tới logging.getLogger. Do đó, nếu dự án của bạn chứa nhiều ứng dụng khép kín và bạn muốn họ sử dụng một logger chung bạn cần phải sử dụng logging.getLogger('MYAPP')thay vìlogging.getLogger(__name__)
rhunwicks

3
Điều này hoạt động tuyệt vời. Phải sử dụng 'lớp': 'logging.NullHandler' vì 'django.utils.log.NullHandler' không còn giá trị, nhưng phần còn lại làm việc cho tôi trong 1.11
JacquelineIO

4

Dựa trên một phần cấu hình ghi nhật ký do rh0dium đề xuất và một số nghiên cứu khác do chính tôi thực hiện, tôi bắt đầu lắp ráp một dự án Django mẫu với các mặc định ghi nhật ký đẹp - fail-độc đáo-django .

Đầu ra logfile mẫu:

2016-04-05 22:12:32,984 [Thread-1    ] [INFO ] [djangoproject.logger]  This is a manually logged INFO string.
2016-04-05 22:12:32,984 [Thread-1    ] [DEBUG] [djangoproject.logger]  This is a manually logged DEBUG string.
2016-04-05 22:12:32,984 [Thread-1    ] [ERROR] [django.request      ]  Internal Server Error: /
Traceback (most recent call last):
  File "/Users/kermit/.virtualenvs/fail-nicely-django/lib/python3.5/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/kermit/.virtualenvs/fail-nicely-django/lib/python3.5/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/kermit/projekti/git/fail-nicely-django/djangoproject/brokenapp/views.py", line 12, in brokenview
    raise Exception('This is an exception raised in a view.')
Exception: This is an exception raised in a view.

Cách sử dụng chi tiết được giải thích trong README , nhưng về cơ bản, bạn sao chép mô-đun ghi nhật ký vào dự án Django của bạn và thêm from .logger import LOGGINGvào cuối settings.py của bạn .

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.