Ghi log là quá trình ghi lại các thông điệp trong quá trình thực thi của một chương trình để cung cấp thông tin thời gian thực có thể hữu ích cho việc giám sát, gỡ lỗi và kiểm toán.
Trong Python, việc ghi log được thực hiện thông qua mô-đun logging tích hợp sẵn, cung cấp một khung linh hoạt để tạo ra các thông điệp log.
Dưới đây là những lợi ích của việc sử dụng logging trong Python:
Debugging − Giúp xác định và chẩn đoán các vấn đề bằng cách ghi lại thông tin liên quan trong quá trình thực thi chương trình.
Monitoring − Cung cấp cái nhìn sâu sắc về hành vi và hiệu suất của ứng dụng.
Auditing − Giữ lại bản ghi các sự kiện và hành động quan trọng vì mục đích bảo mật.
Troubleshooting − Hỗ trợ theo dõi luồng chương trình và giá trị biến để hiểu hành vi không mong đợi.
Python logging bao gồm một số thành phần chính hoạt động cùng nhau để quản lý và xuất ra các thông điệp log một cách hiệu quả −
Logger − Đây là điểm vào chính mà bạn sử dụng để phát ra các thông điệp ghi log. Mỗi phiên bản logger được đặt tên và có thể được cấu hình độc lập.
Handler − Nó xác định nơi các thông điệp nhật ký được gửi đến. Các bộ xử lý gửi thông điệp nhật ký đến các điểm đến khác nhau như bảng điều khiển, tệp, ổ cắm, v.v.
Formatter − Nó xác định cách bố trí của các tin nhắn ghi log. Các định dạng xác định cấu trúc của các bản ghi log bằng cách chỉ định thông tin nào sẽ được bao gồm (ví dụ: dấu thời gian, mức độ log, tin nhắn).
Logger Level − Nó xác định mức độ nghiêm trọng của các thông điệp ghi log. Các thông điệp dưới mức này sẽ bị bỏ qua. Các mức độ phổ biến bao gồm DEBUG, INFO, WARNING, ERROR và CRITICAL.
Filter − Nó là các thành phần tùy chọn cung cấp khả năng kiểm soát tinh vi hơn về việc các bản ghi log nào được xử lý và phát ra bởi một handler.
Các mức độ ghi nhật ký trong Python xác định mức độ nghiêm trọng của các thông điệp ghi nhật ký, cho phép các nhà phát triển phân loại và lọc các thông điệp dựa trên tầm quan trọng của chúng. Mỗi mức độ ghi nhật ký có một mục đích cụ thể và giúp hiểu được tầm quan trọng của thông tin đã được ghi lại −
DEBUG − Thông tin chi tiết, thường chỉ hữu ích cho mục đích gỡ lỗi. Những thông điệp này được sử dụng để theo dõi luồng của chương trình và thường không được thấy trong các môi trường sản xuất.
INFO − Xác nhận rằng mọi thứ đang hoạt động như mong đợi. Các thông điệp này cung cấp thông tin chung về tiến trình của ứng dụng.
WARNING − Chỉ ra các vấn đề tiềm ẩn không ngăn cản chương trình chạy nhưng có thể cần được chú ý. Những thông điệp này có thể được sử dụng để cảnh báo các nhà phát triển về những tình huống không mong đợi.
ERROR − Chỉ ra một vấn đề nghiêm trọng hơn ngăn cản một chức năng hoặc hoạt động cụ thể hoàn thành thành công. Những thông điệp này nhấn mạnh các lỗi cần được chú ý ngay lập tức nhưng không nhất thiết phải kết thúc ứng dụng.
CRITICAL − Mức độ nghiêm trọng nhất, cho thấy một lỗi nghiêm trọng có thể dẫn đến việc chương trình bị kết thúc. Những thông điệp này dành riêng cho các lỗi nghiêm trọng cần can thiệp ngay lập tức.
Dưới đây là các kịch bản sử dụng cho từng mức độ ghi log trong các ứng dụng Python −
Choosing the Right Level − Việc chọn mức độ ghi log phù hợp đảm bảo rằng các thông điệp log cung cấp thông tin liên quan mà không làm rối loạn các bản ghi.
Setting Levels − Các logger, handler và thông điệp log cụ thể có thể được cấu hình với các mức độ khác nhau để kiểm soát những thông điệp nào được ghi lại và chúng sẽ được xuất ra đâu.
Hierarchy − Các mức độ ghi nhật ký có tính phân cấp, có nghĩa là việc thiết lập một mức độ trên một logger cũng ảnh hưởng đến các trình xử lý và thông điệp ghi nhật ký liên quan đến nó.
Dưới đây là một ví dụ cơ bản về ghi log trong Python để minh họa cách sử dụng và chức năng của nó −
import logging # Configure logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') # Example usage def calculate_sum(a, b): logging.debug(f"Calculating sum of {a} and {b}") result = a + b logging.info(f"Sum calculated successfully: {result}") return result # Main program if __name__ == "__main__": logging.info("Starting the program") result = calculate_sum(10, 20) logging.info("Program completed")
Dưới đây là kết quả của đoạn mã trên −
2024-06-19 09:00:06,774 - INFO - Starting the program 2024-06-19 09:00:06,774 - DEBUG - Calculating sum of 10 and 20 2024-06-19 09:00:06,774 - INFO - Sum calculated successfully: 30 2024-06-19 09:00:06,775 - INFO - Program completed
Cấu hình logging trong Python đề cập đến việc thiết lập các thành phần khác nhau như loggers, handlers và formatters để kiểm soát cách và nơi các thông điệp log được lưu trữ và hiển thị. Cấu hình này cho phép các nhà phát triển tùy chỉnh hành vi logging theo yêu cầu của ứng dụng và môi trường triển khai của họ.
Trong ví dụ dưới đây, hàm getLogger() lấy hoặc tạo một logger có tên. Các logger được tổ chức theo cấu trúc phân cấp dựa trên tên của chúng. Sau đó, các handler như "StreamHandler" (handler cho console) được tạo ra để xác định nơi mà các thông điệp log sẽ được gửi đến. Chúng có thể được cấu hình với các mức log và định dạng cụ thể.
Các định dạng viên xác định cách bố trí của các bản ghi nhật ký, quyết định cách các thông điệp nhật ký xuất hiện khi được in ra hoặc lưu trữ.
import logging # Create logger logger = logging.getLogger('my_app') logger.setLevel(logging.DEBUG) # Set global log level # Create console handler and set level to debug console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) # Create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) # Add console handler to logger logger.addHandler(console_handler) # Example usage logger.debug('This is a debug message') logger.info('This is an info message') logger.warning('This is a warning message') logger.error('This is an error message') logger.critical('This is a critical message')
Kết quả được tạo ra như sau −
2024-06-19 09:05:20,852 - my_app - DEBUG - This is a debug message 2024-06-19 09:05:20,852 - my_app - INFO - This is an info message 2024-06-19 09:05:20,852 - my_app - WARNING - This is a warning message 2024-06-19 09:05:20,852 - my_app - ERROR - This is an error message 2024-06-19 09:05:20,852 - my_app - CRITICAL - This is a critical message
Các bộ xử lý ghi nhật ký trong Python xác định nơi và cách các thông điệp ghi nhật ký được xử lý và xuất ra. Chúng đóng một vai trò quan trọng trong việc hướng các thông điệp ghi nhật ký đến các điểm đến cụ thể như bảng điều khiển, tệp, email, cơ sở dữ liệu hoặc thậm chí các máy chủ từ xa. Mỗi bộ xử lý có thể được cấu hình độc lập để kiểm soát định dạng, cấp độ ghi nhật ký và các thuộc tính khác của các thông điệp mà nó xử lý.
Dưới đây là các loại trình xử lý ghi nhật ký khác nhau trong Python −
StreamHandler − Gửi các thông điệp log đến các luồng như sys.stdout hoặc sys.stderr. Hữu ích để hiển thị các thông điệp log trên bảng điều khiển hoặc giao diện dòng lệnh.
FileHandler − Ghi lại các thông điệp vào một tệp được chỉ định trên hệ thống tệp. Hữu ích cho việc ghi log bền vững và lưu trữ dữ liệu log.
RotatingFileHandler − Tương tự như FileHandler nhưng tự động xoay vòng các tệp nhật ký dựa trên kích thước hoặc khoảng thời gian. Giúp quản lý kích thước tệp nhật ký và ngăn chúng không phát triển quá lớn.
SMTPHandler − Gửi tin nhắn nhật ký qua email đến các người nhận được chỉ định thông qua SMTP. Hữu ích để thông báo cho quản trị viên hoặc nhà phát triển về các vấn đề nghiêm trọng.
SysLogHandler − Gửi các thông điệp nhật ký đến nhật ký hệ thống trên các hệ thống giống Unix (ví dụ: syslog). Cho phép tích hợp với các tiện ích ghi nhật ký toàn hệ thống.
MemoryHandler − Lưu trữ các thông điệp log trong bộ nhớ và gửi chúng đến một trình xử lý mục tiêu sau khi đạt đến một kích thước bộ đệm nhất định hoặc sau một khoảng thời gian. Hữu ích cho việc nhóm lại và quản lý các đợt thông điệp log.
HTTPHandler − Gửi các thông điệp log đến một máy chủ web qua HTTP hoặc HTTPS. Cho phép ghi lại các thông điệp đến một máy chủ từ xa hoặc dịch vụ ghi log.