2015-06-19 21 views
7

Tôi đang làm việc với ứng dụng Python/Flask và cố gắng để các bản ghi được định dạng (theo dòng) trong json.Định dạng nhật ký ứng dụng Flask trong json

Sử dụng gói python-json-logger, tôi đã sửa đổi các định dạng cho app.logger như sau:

from pythonjsonlogger import jsonlogger 
formatter = jsonlogger.JsonFormatter(
    '%(asctime) %(levelname) %(module) %(funcName) %(lineno) %(message)') 
app.logger.handlers[0].setFormatter(formatter) 

này hoạt động như mong đợi. Bất kỳ thư nào được chuyển đến app.logger đều được định dạng chính xác trong json.

Tuy nhiên, ứng dụng cũng tự động ghi lại tất cả yêu cầu. Thông tin này hiển thị ở chế độ stdout như sau:

127.0.0.1 - - [19/Jun/2015 12:22:03] "GET /portal/ HTTP/1.1" 200 - 

Tôi cũng muốn thông tin này được định dạng trong json. Tôi đã tìm kiếm logger/code có trách nhiệm tạo ra đầu ra này mà không thành công.

Sản lượng này được tạo ở đâu? Các cơ chế có thay đổi định dạng của thông tin đã đăng nhập này không?

+0

Những bản ghi bạn nhìn thấy có lẽ đến từ các máy chủ web mà bạn đang sử dụng và không từ 'wsgi' của bạn ứng dụng. Bạn đang sử dụng máy chủ nào? – sirfz

+0

@MartijnPieters bạn có thể đúng nhưng nó sẽ không có ý nghĩa cho 'Flask' ​​để đăng nhập yêu cầu truy cập vì nó không phải là công việc của mình – sirfz

+0

@sirfz: ngoại trừ, nó không. Bạn đang ở trong thực tế chính xác. –

Trả lời

3

Khi bạn sử dụng thuộc tính app.logger cho lần đầu tiên, Flask thiết lập một số bộ xử lý đăng nhập:

  • một logger debug được thiết lập để đăng nhập mức DEBUG và lọc trên app.debug là sự thật.
  • trình ghi nhật ký sản xuất được đặt thành ERROR.

Bạn có thể loại bỏ những xử lý một lần nữa cho mình, bằng cách chạy:

app.logger.handlers[:] = [] 

Tuy nhiên, dòng nhật ký mà bạn nhìn thấy nó không bị log Flask, nhưng bởi máy chủ WSGI. Cả hai máy chủ Werkzeug tích hợp (được sử dụng khi bạn sử dụng app.run()) và nhiều máy chủ WSGI khác thực hiện việc này. Ví dụ Gunicorn sử dụng trình ghi nhật ký Python mặc định để ghi lại quyền truy cập.

Máy chủ WSGI tích hợp sẽ không bao giờ được sử dụng trong sản xuất (nó sẽ không mở rộng tốt, và không phải là chiến đấu cứng rắn chống lại kẻ tấn công nguy hiểm).

Đối Gunicorn, bạn có thể vô hiệu hóa log tuyên truyền để giữ riêng biệt đăng nhập:

logging.getLogger('gunicorn').propagate = False 
Các vấn đề liên quan