Mô-đun này đã là một phần của Thư viện chuẩn của Python kể từ phiên bản 2. 3. Nó được mô tả ngắn gọn trong PEP 282. Tài liệu này nổi tiếng là khó đọc, ngoại trừ
Thay vào đó, loguru cung cấp một cách tiếp cận để ghi nhật ký, gần như đơn giản bằng cách sử dụng một câu lệnh
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s0 đơn giản
Ghi nhật ký phục vụ hai mục đích
- Nhật ký chẩn đoán ghi lại các sự kiện liên quan đến hoạt động của ứng dụng. Ví dụ: nếu người dùng gọi để báo cáo lỗi, nhật ký có thể được tìm kiếm theo ngữ cảnh
- Nhật ký kiểm tra ghi lại các sự kiện để phân tích kinh doanh. Các giao dịch của người dùng có thể được trích xuất và kết hợp với các chi tiết người dùng khác cho các báo cáo hoặc để tối ưu hóa mục tiêu kinh doanh
… hay In?
Lần duy nhất mà
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s0 là một tùy chọn tốt hơn ghi nhật ký là khi mục tiêu là hiển thị câu lệnh trợ giúp cho ứng dụng dòng lệnh. Các lý do khác khiến việc ghi nhật ký tốt hơn
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s0
- , được tạo với mọi sự kiện ghi nhật ký, chứa thông tin chẩn đoán có sẵn như tên tệp, đường dẫn đầy đủ, chức năng và số dòng của sự kiện ghi nhật ký
- Các sự kiện được đăng nhập trong các mô-đun đi kèm sẽ tự động được truy cập thông qua trình ghi nhật ký gốc tới luồng ghi nhật ký của ứng dụng của bạn, trừ khi bạn lọc chúng ra
- Việc ghi nhật ký có thể được tắt một cách có chọn lọc bằng cách sử dụng phương pháp hoặc bị vô hiệu hóa bằng cách đặt thuộc tính
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s
0 thành[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s
1
Đăng nhập vào một thư viện
Ghi chú cho là trong hướng dẫn ghi nhật ký. Bởi vì người dùng, chứ không phải thư viện, nên quyết định điều gì sẽ xảy ra khi một sự kiện ghi nhật ký xảy ra, nên một lời khuyên cần được lặp lại
Ghi chú
Bạn không nên thêm bất kỳ trình xử lý nào ngoài NullHandler vào bộ ghi nhật ký của thư viện
Cách thực hành tốt nhất khi khởi tạo trình ghi nhật ký trong thư viện là chỉ tạo chúng bằng cách sử dụng biến toàn cục
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s2. mô-đun tạo một hệ thống phân cấp các trình ghi nhật ký bằng cách sử dụng ký hiệu dấu chấm, do đó, việc sử dụng
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s2 đảm bảo không có xung đột tên
Đây là một ví dụ về cách thực hành tốt nhất từ nguồn yêu cầu – hãy đặt điều này vào
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s5 của bạn
import logging logging.getLogger[__name__].addHandler[logging.NullHandler[]]
Đăng nhập vào một ứng dụng
Ứng dụng mười hai yếu tố, một tài liệu tham khảo có thẩm quyền về thực hành tốt trong phát triển ứng dụng, có một phần về thực tiễn tốt nhất về ghi nhật ký. Nó ủng hộ mạnh mẽ việc coi các sự kiện nhật ký là một luồng sự kiện và để gửi luồng sự kiện đó tới đầu ra tiêu chuẩn để môi trường ứng dụng xử lý
Có ít nhất ba cách để định cấu hình bộ ghi
- Sử dụng tệp có định dạng INI
- chuyên nghiệp. có thể cập nhật cấu hình trong khi chạy, sử dụng chức năng lắng nghe trên ổ cắm
- Côn. kiểm soát ít hơn [e. g. bộ lọc hoặc bộ ghi nhật ký được phân lớp tùy chỉnh] hơn mức có thể khi định cấu hình bộ ghi nhật ký trong mã
- Sử dụng từ điển hoặc tệp có định dạng JSON
- chuyên nghiệp. ngoài việc cập nhật trong khi chạy, có thể tải từ tệp bằng mô-đun, trong thư viện chuẩn kể từ Python 2. 6
- Côn. kiểm soát ít hơn so với khi định cấu hình trình ghi nhật ký trong mã
- Sử dụng mã
- chuyên nghiệp. toàn quyền kiểm soát cấu hình
- Côn. sửa đổi yêu cầu thay đổi mã nguồn
Cấu hình ví dụ qua tệp INI
Hãy để chúng tôi nói rằng tệp có tên là
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s8. Thông tin chi tiết về định dạng tệp có trong phần hướng dẫn ghi nhật ký
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s
Sau đó sử dụng
[loggers] keys=root [handlers] keys=stream_handler [formatters] keys=formatter [logger_root] level=DEBUG handlers=stream_handler [handler_stream_handler] class=StreamHandler level=DEBUG formatter=formatter args=[sys.stderr,] [formatter_formatter] format=%[asctime]s %[name]-12s %[levelname]-8s %[message]s9 trong mã
import logging from logging.config import fileConfig fileConfig['logging_config.ini'] logger = logging.getLogger[] logger.debug['often makes a very good meal of %s', 'visiting tourists']
Cấu hình ví dụ qua từ điển
Kể từ Python 2. 7, bạn có thể sử dụng từ điển với các chi tiết cấu hình. PEP 391 chứa danh sách các thành phần bắt buộc và tùy chọn trong từ điển cấu hình