Python tạo lớp ghi nhật ký tùy chỉnh
Bất kỳ mã nào chỉ có thể đọc được khi nó được viết với nhận xét thích hợp. Bạn có đồng ý không? Đã nói rằng nhiệm vụ của nhà phát triển không chỉ dừng lại ở việc viết mã. Yếu tố bảo trì khởi động ngay sau khi mã được đưa vào sản xuất. Mã của bạn có thể bảo trì được nếu nó trả lời các câu hỏi sau Show
Vì những lý do rõ ràng, tác giả của mã không nên trả lời những câu hỏi này. Đồng nghiệp của bạn nên trả lời chúng cho bạn. Hoặc nếu bạn không muốn trở thành người đánh giá của chính mình, cách tốt nhất là xem mã của bạn 6 tháng/1 năm trở xuống. Nếu bạn hiểu nó một cách nhanh chóng, Thì đấy. mã của bạn có thể bảo trì được Báo cáo nhật kýCá nhân tôi tin rằng các báo cáo nhật ký nâng cao khả năng đọc và gỡ lỗi nguồn hình ảnh. GoogleMột dự án có khả năng ghi nhật ký tốt sẽ giảm đáng kể thời gian gỡ lỗi và cuối cùng là thời gian quay vòng cho mọi lỗi. Do đó, mọi dự án nên có lớp trình ghi nhật ký tùy chỉnh chung có thể tái sử dụng trong toàn dự án. Bài viết này thảo luận về cách triển khai lớp trình ghi nhật ký tùy chỉnh trong các dự án python của bạn Nhà máy khai thác gỗNhư bạn đã đoán đúng từ cái tên, chúng tôi sẽ điều chỉnh một mẫu xuất xưởng để viết lớp trình ghi nhật ký tùy chỉnh của chúng tôi. Tuy nhiên, đây chỉ là bản chuyển thể của mẫu nhà máy và bạn có thể không hoàn toàn liên quan đến mẫu nhà máy thực tế. Ý tưởng là có logic tạo đối tượng trong tệp import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='/tmp/myapp.log', filemode='w') logging.debug("Debug message") logging.info("Informative message") logging.error("Error message")34 và sử dụng import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='/tmp/myapp.log', filemode='w') logging.debug("Debug message") logging.info("Informative message") logging.error("Error message")35 để lấy đối tượng logger. Không hơn không kémLogger Factory trong Python Vậy chúng ta có gì ở đây nào?
LoggerFactoryChúng tôi viết tất cả logic tạo đối tượng logger trong một phương thức riêng tư (Bất kể tên xáo trộn nó làm gì trong python) import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='/tmp/myapp.log', filemode='w') logging.debug("Debug message") logging.info("Informative message") logging.error("Error message")36 Tệp import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='/tmp/myapp.log', filemode='w') logging.debug("Debug message") logging.info("Informative message") logging.error("Error message")37 sẽ được hiển thị bên ngoài lớp để các mô-đun khác lấy đối tượng logger và chuyển tên tệp và mức nhật ký cho phương thức import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='/tmp/myapp.log', filemode='w') logging.debug("Debug message") logging.info("Informative message") logging.error("Error message")38 import logging class LoggerFactory(object): _LOG = None @staticmethod def __create_logger(log_file, log_level): """ A private method that interacts with the python logging module """ # set the logging format log_format = "%(asctime)s:%(levelname)s:%(message)s" # Initialize the class variable with logger object LoggerFactory._LOG = logging.getLogger(log_file) logging.basicConfig(level=logging.INFO, format=log_format, datefmt="%Y-%m-%d %H:%M:%S") # set the logging level based on the user selection if log_level == "INFO": LoggerFactory._LOG.setLevel(logging.INFO) elif log_level == "ERROR": LoggerFactory._LOG.setLevel(logging.ERROR) elif log_level == "DEBUG": LoggerFactory._LOG.setLevel(logging.DEBUG) return LoggerFactory._LOG @staticmethod def get_logger(log_file, log_level): """ A static method called by other modules to initialize logger in their own module """ logger = LoggerFactory.__create_logger(log_file, log_level) # return the logger object return logger Bạn có thể nhập lớp import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='/tmp/myapp.log', filemode='w') logging.debug("Debug message") logging.info("Informative message") logging.error("Error message")39 trong mô-đun của mình và khởi tạo trình ghi nhật ký để sử dụng như bên dưới from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1") Bản tóm tắtTạo các nhà máy ghi nhật ký nội bộ như thế này có thể hữu ích khi bạn có nhiều mô-đun yêu cầu ghi nhật ký Điều này tránh khởi tạo thư viện ghi nhật ký của python trong mọi mô-đun của dự án của bạn. Xin lưu ý rằng bạn cũng có thể tạo LoggerFactory theo nhiều cách. Nếu bạn thích phương pháp của riêng mình, bạn có thể tự do sử dụng phương pháp tương tự Trong thế giới máy tính rộng lớn, có nhiều ngôn ngữ lập trình khác nhau bao gồm các phương tiện để ghi nhật ký. Từ các bài đăng trước của chúng tôi, bạn có thể tìm hiểu các phương pháp hay nhất về ghi nhật ký Node, ghi nhật ký Java và ghi nhật ký Ruby. Là một phần của chuỗi ghi nhật ký đang diễn ra, bài đăng này mô tả những gì bạn cần khám phá về các phương pháp hay nhất về ghi nhật ký Python Xem xét rằng “nhật ký” có nghĩa kép của một bản ghi nhật ký (đơn) và một tệp nhật ký, bài đăng này giả định rằng “nhật ký” đề cập đến một tệp nhật ký Ưu điểm của ghi nhật ký PythonVì vậy, tại sao phải tìm hiểu về cách đăng nhập bằng Python? . Các ưu điểm khác của việc đăng nhập bằng Python là thư viện dành riêng cho mục đích này, các đầu ra khác nhau mà các bản ghi nhật ký có thể được định hướng, chẳng hạn như bảng điều khiển, tệp, tệp xoay vòng, Syslog, máy chủ từ xa, email, v.v. và số lượng lớn các tiện ích mở rộng và plugin mà nó hỗ trợ. Trong bài đăng này, bạn sẽ tìm hiểu các ví dụ về các kết quả đầu ra khác nhau Mô tả ghi nhật ký PythonThư viện chuẩn Python cung cấp mô-đun ghi nhật ký như một giải pháp để ghi lại các sự kiện từ các ứng dụng và thư viện. Khi trình ghi được định cấu hình, nó sẽ trở thành một phần của quy trình thông dịch Python đang chạy mã. Nói cách khác, nó là toàn cầu. Bạn cũng có thể định cấu hình hệ thống con ghi nhật ký Python bằng tệp cấu hình bên ngoài. Thông số kỹ thuật cho định dạng cấu hình ghi nhật ký có trong thư viện chuẩn Python Thư viện ghi nhật ký dựa trên cách tiếp cận mô-đun và bao gồm các danh mục thành phần. trình ghi nhật ký, trình xử lý, bộ lọc và trình định dạng. Về cơ bản
Nhiều đối tượng logger này được tổ chức thành một cây đại diện cho các phần khác nhau trong hệ thống của bạn và các thư viện bên thứ ba khác nhau mà bạn đã cài đặt. Khi bạn gửi một tin nhắn vào một trong các trình ghi nhật ký, thì tin nhắn sẽ được xuất ra trên tất cả các trình xử lý của trình ghi nhật ký đó, bằng cách sử dụng một trình định dạng được đính kèm với mỗi trình xử lý. Sau đó, thông báo sẽ truyền lên cây logger cho đến khi gặp bộ ghi gốc hoặc bộ ghi nhật ký trong cây được định cấu hình với propagate=False Nền tảng ghi nhật ký PythonĐây là một ví dụ về trình ghi nhật ký cơ bản trong Python import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='/tmp/myapp.log', filemode='w') logging.debug("Debug message") logging.info("Informative message") logging.error("Error message") Dòng 1. nhập mô-đun đăng nhập Dòng 2. tạo một hàm basicConf và chuyển một số đối số để tạo tệp nhật ký. Trong trường hợp này, chúng tôi cho biết mức độ nghiêm trọng, định dạng ngày tháng, tên tệp và chế độ tệp để chức năng ghi đè lên tệp nhật ký Dòng 3 đến 5. thông báo cho từng cấp độ ghi nhật ký Định dạng mặc định cho bản ghi nhật ký là SEVERITY. TIỀU PHU. THÔNG ĐIỆP. Do đó, nếu bạn chạy mã ở trên, bạn sẽ nhận được kết quả này 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message Về đầu ra, bạn có thể đặt đích của thông điệp tường trình. Bước đầu tiên, bạn có thể in thông báo ra màn hình bằng mã mẫu này import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.') Nếu mục tiêu của bạn hướng đến Đám mây, bạn có thể tận dụng bộ xử lý ghi nhật ký của Python để chuyển hướng nội dung. Hiện ở phiên bản beta, bạn có thể ghi nhật ký vào Stackdriver Logging từ các ứng dụng Python bằng cách sử dụng trình xử lý ghi nhật ký Python của Google có trong thư viện ứng dụng Stackdriver Logging hoặc bằng cách sử dụng thư viện ứng dụng để truy cập trực tiếp vào API. Khi phát triển trình ghi nhật ký của bạn, hãy lưu ý rằng trình ghi nhật ký gốc không sử dụng trình xử lý nhật ký của bạn. Vì thư viện Ghi nhật ký Stackdriver của Máy khách Python cũng ghi nhật ký, nên bạn có thể nhận được một vòng lặp đệ quy nếu trình ghi nhật ký gốc sử dụng trình xử lý nhật ký của bạn Các phương pháp hay nhất về ghi nhật ký PythonKhả năng ghi nhật ký Python là vô tận và bạn có thể tùy chỉnh chúng theo nhu cầu của mình. Sau đây là một số mẹo về các phương pháp hay nhất để bạn có thể tận dụng tối đa việc ghi nhật ký Python Đặt tên cấp độ. Điều này hỗ trợ bạn trong việc duy trì từ điển thông điệp tường trình của riêng bạn và giảm khả năng mắc lỗi đánh máy LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level) khai thác gỗ. getLevelName(logging_level) trả về biểu diễn văn bản của mức độ nghiêm trọng được gọi là logging_level. Các giá trị được xác định trước bao gồm, từ mức độ nghiêm trọng cao nhất đến thấp nhất
Đăng nhập từ nhiều mô-đun. nếu bạn có nhiều mô-đun khác nhau và bạn phải thực hiện khởi tạo trong mọi mô-đun trước khi ghi nhật ký thông báo, bạn có thể sử dụng đặt tên trình ghi theo tầng logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”) Làm san hô. khách hàng và Coralogix. con cháu cơ sở dữ liệu của logger Coralogix và truyền thông điệp của chúng tới nó, do đó nó cho phép ghi nhật ký đa mô-đun dễ dàng. Đây là một trong những tác dụng phụ tích cực của tên trong trường hợp cấu trúc thư viện của các mô-đun phản ánh kiến trúc phần mềm Đăng nhập bằng Django và uWSGI. Để triển khai các ứng dụng web, bạn có thể sử dụng StreamHandler làm trình ghi nhật ký gửi tất cả nhật ký tới Đối với Django mà bạn có 'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, }, Tiếp theo, uWSGI chuyển tiếp tất cả đầu ra của ứng dụng, bao gồm cả bản in và khả năng truy ngược lại, tới nhật ký hệ thống có đính kèm tên ứng dụng ________số 8 Đăng nhập với Nginx. Trong trường hợp bạn cần có các tính năng bổ sung không được uWSGI hỗ trợ — ví dụ: cải thiện khả năng xử lý tài nguyên tĩnh (thông qua bất kỳ tổ hợp tiêu đề Hết hạn hoặc Thẻ điện tử nào, nén gzip, gzip được nén trước, v.v. ), nhật ký truy cập và định dạng của chúng có thể được tùy chỉnh trong conf. Bạn có thể sử dụng định dạng kết hợp, chẳng hạn như ví dụ cho hệ thống Linux access_log /var/log/nginx/access.log; Dòng này tương tự như chỉ định rõ ràng định dạng kết hợp như thế này from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")0 Phân tích và lọc nhật ký. sau khi viết nhật ký thích hợp, bạn có thể muốn phân tích chúng và thu được thông tin chi tiết hữu ích. Đầu tiên, mở tệp bằng các khối, vì vậy bạn sẽ không phải lo lắng về việc đóng chúng. Hơn nữa, tránh đọc mọi thứ vào bộ nhớ cùng một lúc. Thay vào đó, hãy đọc từng dòng một và sử dụng dòng đó để cập nhật số liệu thống kê tích lũy. Việc sử dụng định dạng nhật ký kết hợp có thể hữu ích nếu bạn đang nghĩ đến việc sử dụng các công cụ phân tích nhật ký vì chúng có các bộ lọc được tạo sẵn để sử dụng các nhật ký này Nếu bạn cần phân tích đầu ra nhật ký của mình để phân tích, bạn có thể muốn sử dụng mã bên dưới from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")1 Mô-đun CSV của Python chứa mã tệp CSV đã đọc và các tệp khác có định dạng tương tự. Bằng cách này, bạn có thể kết hợp thư viện ghi nhật ký của Python để đăng ký nhật ký và thư viện CSV để phân tích chúng Và tất nhiên, cách Coralogix để ghi nhật ký python, sử dụng ứng dụng bổ sung Coralogix Python cho phép gửi trực tiếp tất cả các nhật ký Python đã viết tới Coralogix để tìm kiếm, đuôi trực tiếp, cảnh báo và tất nhiên, những hiểu biết sâu sắc về máy học như phát hiện lỗi mới và phát hiện sự bất thường của luồng Tìm hiểu sâu nhật ký PythonPhần còn lại của hướng dẫn này tập trung vào cách đăng nhập Python bằng hỗ trợ ghi nhật ký tích hợp sẵn. Nó giới thiệu các khái niệm khác nhau có liên quan đến việc hiểu ghi nhật ký Python, thảo luận về các API ghi nhật ký tương ứng trong Python và cách sử dụng chúng, đồng thời trình bày các phương pháp hay nhất và cân nhắc về hiệu suất khi sử dụng các API này Chúng tôi sẽ giới thiệu các khái niệm khác nhau có liên quan để hiểu cách ghi nhật ký trong Python, thảo luận về các API ghi nhật ký tương ứng trong Python và cách sử dụng chúng, đồng thời trình bày các phương pháp hay nhất và cân nhắc về hiệu suất khi sử dụng các API này Hướng dẫn Python này giả định rằng người đọc đã hiểu rõ về lập trình Python; . Thông tin và các ví dụ ghi nhật ký Python trong bài viết này dựa trên Python phiên bản 3. 8 Python đã cung cấp hỗ trợ tích hợp để ghi nhật ký kể từ phiên bản 2. 3. Hỗ trợ này bao gồm các API thư viện cho các khái niệm và tác vụ phổ biến dành riêng cho ghi nhật ký và ngôn ngữ bất khả tri. Bài viết này giới thiệu các khái niệm và tác vụ này như đã được hiện thực hóa và hỗ trợ trong thư viện ghi nhật ký của Python Khái niệm ghi nhật ký Python cơ bảnKhi chúng tôi sử dụng thư viện ghi nhật ký, chúng tôi thực hiện/kích hoạt các tác vụ phổ biến sau đây trong khi sử dụng các khái niệm liên quan (được tô đậm)
Không phụ thuộc vào thư viện ghi nhật ký, các tác vụ trên được thực hiện theo thứ tự tương tự như trong Hình 1 Hình 1. Luồng tác vụ khi ghi nhật ký qua thư viện ghi nhật ký Mô-đun ghi nhật ký PythonThư viện chuẩn của Python cung cấp hỗ trợ ghi nhật ký thông qua ghi nhật ký, ghi nhật ký. cấu hình và ghi nhật ký. mô-đun trình xử lý
Chúng tôi gọi chung các mô-đun này là thư viện ghi nhật ký của Python Các mô-đun này hiện thực hóa các khái niệm được giới thiệu trong phần trước dưới dạng các lớp, một tập hợp các hàm cấp mô-đun hoặc một tập hợp các hằng số. Hình 2 cho thấy các lớp này và mối liên hệ giữa chúng Hình 2. Các lớp và hằng Python đại diện cho các khái niệm ghi nhật ký khác nhau Cấp độ ghi nhật ký PythonRa khỏi hộp, thư viện ghi nhật ký Python hỗ trợ năm cấp độ ghi nhật ký. nghiêm trọng, lỗi, cảnh báo, thông tin và gỡ lỗi. Các mức này được biểu thị bằng các hằng số có cùng tên trong mô-đun ghi nhật ký, tôi. e. , LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)0, LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)1, LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)2, LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)3 và LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)4. Giá trị của các hằng số này lần lượt là 50, 40, 30, 20 và 10 Khi chạy, giá trị số của cấp độ ghi nhật ký xác định ý nghĩa của cấp độ ghi nhật ký. Do đó, khách hàng có thể giới thiệu các mức ghi nhật ký mới bằng cách sử dụng các giá trị số lớn hơn 0 và không bằng các mức ghi nhật ký được xác định trước làm mức ghi nhật ký Mức ghi nhật ký có thể có tên. Khi có tên, các cấp ghi nhật ký sẽ xuất hiện theo tên của chúng trong các mục nhập nhật ký. Mọi cấp độ ghi nhật ký được xác định trước đều có cùng tên với tên của hằng số tương ứng; . g. , cấp độ LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)2 và 30 xuất hiện dưới dạng LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)6. Ngược lại, các mức ghi nhật ký tùy chỉnh được đặt tên theo mặc định. Vì vậy, một cấp độ ghi nhật ký tùy chỉnh chưa được đặt tên với giá trị số LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)7 xuất hiện dưới dạng LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)8 trong các mục nhật ký và điều này dẫn đến các mục nhật ký không nhất quán và không thân thiện với con người. Để giải quyết vấn đề này, khách hàng có thể đặt tên cho cấp độ ghi nhật ký tùy chỉnh bằng chức năng cấp độ mô-đun LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)9. Ví dụ: bằng cách sử dụng logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)0, cấp độ logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)1 sẽ được ghi là logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)2 Thư viện ghi nhật ký Python áp dụng các quy tắc có thể áp dụng trên toàn cộng đồng cho các cấp độ ghi nhật ký, tôi. e. , khi nào nên sử dụng mức ghi nhật ký X?
Máy ghi nhật ký PythonCác đối tượng logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)8 cung cấp giao diện chính cho thư viện ghi nhật ký. Các đối tượng này cung cấp các phương thức ghi nhật ký để đưa ra các yêu cầu nhật ký cùng với các phương thức để truy vấn và sửa đổi trạng thái của chúng. Từ đây trở đi, chúng ta sẽ gọi các đối tượng Logger là logger Sự sáng tạoHàm logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)9 'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, },0 thường được sử dụng để tạo bộ ghi nhật ký. Bằng cách sử dụng hàm logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)9, khách hàng có thể dựa vào thư viện để quản lý bộ ghi và truy cập bộ ghi thông qua tên của chúng thay vì lưu trữ và chuyển tham chiếu đến bộ ghi Đối số 'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, },2 trong hàm xuất xưởng thường là tên phân cấp được phân tách bằng dấu chấm, e. g. , một. b. c. Quy ước đặt tên này cho phép thư viện duy trì hệ thống phân cấp các bộ ghi. Cụ thể, khi hàm logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)9 tạo một bộ ghi, thư viện đảm bảo một bộ ghi tồn tại cho mỗi cấp của cấu trúc phân cấp được chỉ định bởi tên và mọi bộ ghi trong cấu trúc phân cấp được liên kết với bộ ghi cha và con của nó Mức ghi ngưỡngMỗi trình ghi nhật ký có một mức ghi nhật ký ngưỡng xác định xem có nên xử lý yêu cầu nhật ký hay không. Trình ghi nhật ký xử lý yêu cầu nhật ký nếu giá trị số của cấp độ ghi nhật ký được yêu cầu lớn hơn hoặc bằng giá trị số của ngưỡng ghi nhật ký của trình ghi nhật ký. Khách hàng có thể truy xuất và thay đổi mức ghi ngưỡng của trình ghi nhật ký thông qua các phương thức 'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, },4 và 'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, },5 tương ứng Khi chức năng logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)9 được sử dụng để tạo bộ ghi nhật ký, chức năng này sẽ đặt mức ghi ngưỡng của bộ ghi thành mức ghi ngưỡng của bộ ghi chính của nó như được xác định bởi 'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, },2 của nó Phương thức ghi nhật ký PythonMọi thiết bị ghi nhật ký đều cung cấp các phương thức ghi nhật ký sau đây để đưa ra các yêu cầu ghi nhật ký Mỗi phương pháp này là một cách viết tắt để đưa ra các yêu cầu nhật ký với các mức ghi nhật ký được xác định trước tương ứng như mức ghi nhật ký được yêu cầu Ngoài các phương pháp trên, logger còn cung cấp hai phương pháp sau
Các đối số $ uwsgi --log-syslog=yourapp …1 và $ uwsgi --log-syslog=yourapp …2 trong các phương pháp trên được kết hợp để tạo thông báo nhật ký được ghi lại bởi các mục nhập nhật ký. Tất cả các phương pháp trên đều hỗ trợ đối số từ khóa $ uwsgi --log-syslog=yourapp …3 để thêm thông tin ngoại lệ vào các mục nhật ký và $ uwsgi --log-syslog=yourapp …4 và $ uwsgi --log-syslog=yourapp …5 để thêm thông tin ngăn xếp lệnh gọi vào các mục nhật ký. Ngoài ra, chúng hỗ trợ đối số từ khóa $ uwsgi --log-syslog=yourapp …6, là một từ điển, để chuyển các giá trị liên quan đến bộ lọc, trình xử lý và trình định dạng Khi được thực thi, các phương thức trên sẽ thực hiện/kích hoạt tất cả các tác vụ được hiển thị trong Hình 1 và hai tác vụ sau
Ngoài các cấp ghi nhật ký, bộ lọc cung cấp một phương tiện tốt hơn để lọc các yêu cầu nhật ký dựa trên thông tin trong bản ghi nhật ký, chẳng hạn như. g. , bỏ qua các yêu cầu nhật ký được đưa ra trong một lớp cụ thể. Khách hàng có thể thêm và xóa bộ lọc vào/khỏi trình ghi nhật ký bằng cách sử dụng phương pháp access_log /var/log/nginx/access.log;3 và access_log /var/log/nginx/access.log;4 tương ứng Bộ lọc nhật ký PythonBất kỳ hàm hoặc khả năng gọi nào chấp nhận đối số bản ghi nhật ký và trả về 0 để từ chối bản ghi và giá trị khác 0 để thừa nhận bản ghi có thể đóng vai trò là access_log /var/log/nginx/access.log;5. Bất kỳ đối tượng nào cung cấp phương thức có chữ ký access_log /var/log/nginx/access.log;6 int cũng có thể dùng làm bộ lọc Một lớp con của access_log /var/log/nginx/access.log;7 tùy chọn ghi đè phương thức access_log /var/log/nginx/access.log;8 cũng có thể dùng làm bộ lọc. Nếu không ghi đè phương thức bộ lọc, bộ lọc như vậy sẽ chấp nhận các bản ghi do bộ ghi nhật ký phát ra có cùng tên với bộ lọc và là phần tử con của bộ lọc (dựa trên tên của bộ ghi nhật ký và bộ lọc). Nếu tên của bộ lọc trống, thì bộ lọc thừa nhận tất cả các bản ghi. Nếu phương thức bị ghi đè, thì nó sẽ trả về giá trị 0 để từ chối bản ghi và giá trị khác 0 để thừa nhận bản ghi Trình xử lý ghi nhật ký PythonCác đối tượng access_log /var/log/nginx/access.log;9 thực hiện xử lý cuối cùng các bản ghi nhật ký, tôi. e. , ghi nhật ký yêu cầu. Quá trình xử lý cuối cùng này thường chuyển thành lưu trữ bản ghi nhật ký, e. g. , ghi nó vào nhật ký hoặc tệp hệ thống. Nó cũng có thể dịch nó để truyền dữ liệu bản ghi nhật ký cho các thực thể cụ thể (e. g. , gửi email) hoặc chuyển bản ghi nhật ký cho các thực thể khác để xử lý thêm (e. g. , cung cấp bản ghi nhật ký cho quy trình thu thập nhật ký hoặc dịch vụ thu thập nhật ký) Giống như trình ghi nhật ký, trình xử lý có ngưỡng ghi nhật ký, có thể được đặt thông qua phương thức from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")00. Họ cũng hỗ trợ các bộ lọc thông qua các phương thức from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")01 và from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")02 Trình xử lý sử dụng mức ghi nhật ký ngưỡng và bộ lọc của họ để lọc các bản ghi nhật ký để xử lý. Bộ lọc bổ sung này cho phép kiểm soát theo ngữ cảnh cụ thể đối với việc ghi nhật ký, e. g. , trình xử lý thông báo chỉ nên xử lý các yêu cầu nhật ký quan trọng hoặc từ một mô-đun dễ hỏng Trong khi xử lý các bản ghi nhật ký, trình xử lý định dạng các bản ghi nhật ký thành các mục nhật ký bằng cách sử dụng trình định dạng của chúng. Khách hàng có thể đặt trình định dạng cho trình xử lý thông qua Trình xử lý. phương thức setFormatter(formatter). Nếu trình xử lý không có bộ định dạng thì nó sẽ sử dụng bộ định dạng mặc định do thư viện cung cấp việc ghi nhật ký. mô-đun trình xử lý cung cấp một bộ sưu tập phong phú gồm 15 trình xử lý hữu ích bao gồm nhiều trường hợp sử dụng phổ biến (bao gồm cả những trường hợp được đề cập ở trên). Vì vậy, việc khởi tạo và định cấu hình các trình xử lý này là đủ trong nhiều tình huống Trong các tình huống đảm bảo trình xử lý tùy chỉnh, nhà phát triển có thể mở rộng lớp from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")03 hoặc một trong các lớp Trình xử lý được xác định trước bằng cách triển khai phương thức from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")04 để ghi lại bản ghi nhật ký được cung cấp Trình định dạng nhật ký PythonTrình xử lý sử dụng đối tượng from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")05 để định dạng bản ghi nhật ký thành mục nhập nhật ký dựa trên chuỗi Ghi chú. Trình định dạng không kiểm soát việc tạo thông điệp tường trình Trình định dạng hoạt động bằng cách kết hợp các trường/dữ liệu trong bản ghi nhật ký với chuỗi định dạng do người dùng chỉ định Không giống như các trình xử lý, thư viện ghi nhật ký chỉ cung cấp một trình định dạng cơ bản ghi lại cấp độ ghi nhật ký được yêu cầu, tên của trình ghi nhật ký và thông báo nhật ký. Vì vậy, ngoài các trường hợp sử dụng đơn giản, khách hàng cần tạo các trình định dạng mới bằng cách tạo các đối tượng from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")06 với các chuỗi định dạng cần thiết Trình định dạng hỗ trợ ba kiểu chuỗi định dạng from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")07, e. g. , '%(tên cấp độ)s. %(name)s. %(tin nhắn)s’ from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")08, e. g. , '{tên cấp độ}. {Tên}. {thông điệp}' from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")09, e. g. , ‘$levelname. tên $. $tin nhắn' Chuỗi định dạng của trình định dạng có thể tham chiếu đến bất kỳ trường nào của đối tượng $ uwsgi --log-syslog=yourapp …8, bao gồm các trường dựa trên các khóa của đối số $ uwsgi --log-syslog=yourapp …6 của phương thức from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")12 Trước khi định dạng một bản ghi nhật ký, trình định dạng sử dụng phương pháp from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")13 để xây dựng thông điệp tường trình bằng cách kết hợp các đối số $ uwsgi --log-syslog=yourapp …1 và $ uwsgi --log-syslog=yourapp …2 của phương pháp ghi nhật ký (được lưu trữ trong bản ghi nhật ký) bằng cách sử dụng from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")16. Sau đó, trình định dạng kết hợp thông báo nhật ký kết quả với dữ liệu trong bản ghi nhật ký bằng cách sử dụng chuỗi định dạng đã chỉ định để tạo mục nhập nhật ký Mô-đun ghi nhật ký PythonĐể duy trì hệ thống phân cấp trình ghi nhật ký, khi khách hàng sử dụng thư viện ghi nhật ký, thư viện sẽ tạo một trình ghi nhật ký gốc đóng vai trò là gốc của hệ thống phân cấp trình ghi nhật ký. Mức ghi ngưỡng mặc định của bộ ghi gốc là LogWithLevelName = logging.getLogger('myLoggerSample') level = logging.getLevelName('INFO') LogWithLevelName.setLevel(level)2 Mô-đun này cung cấp tất cả các phương thức ghi nhật ký do lớp from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")18 cung cấp dưới dạng các hàm from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")19 có tên và chữ ký giống hệt nhau, e. g. , 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message00. Máy khách có thể sử dụng các chức năng này để đưa ra các yêu cầu nhật ký mà không cần tạo trình ghi nhật ký và trình ghi nhật ký gốc sẽ phục vụ các yêu cầu này. Nếu bộ ghi nhật ký gốc không có trình xử lý khi cung cấp các yêu cầu nhật ký được đưa ra thông qua các phương pháp này, thì thư viện ghi nhật ký sẽ thêm một phiên bản 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message01 dựa trên luồng 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message02 làm trình xử lý cho bộ ghi gốc Khi trình ghi nhật ký không có trình xử lý nhận được yêu cầu nhật ký, thư viện nhật ký sẽ hướng các yêu cầu nhật ký đó đến trình xử lý cuối cùng, đó là một phiên bản 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message01 dựa trên 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message04. Có thể truy cập trình xử lý này thông qua thuộc tính _______305 Ví dụ về nhật ký PythonDưới đây là một số đoạn mã minh họa cách sử dụng thư viện ghi nhật ký Python Đoạn 1. Tạo trình ghi nhật ký với trình xử lý và trình định dạng2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message0 Đoạn mã này thực hiện như sau
Bằng cách thay đổi trình xử lý được tạo ở bước 3, chúng tôi có thể chuyển hướng các mục nhật ký đến các vị trí hoặc bộ xử lý khác nhau Đoạn 2. Phát hành yêu cầu nhật ký2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message1 Đoạn mã này ghi lại các thông báo thông tin cho biết ứng dụng đã bắt đầu Khi khởi động ứng dụng trong thư mục /home/kali với trình ghi nhật ký được tạo bằng đoạn mã 1, đoạn mã này sẽ tạo mục nhập nhật ký 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message06 trong luồng lỗi tiêu chuẩn Đoạn 3. Phát hành yêu cầu nhật ký2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message2 Đoạn mã này ghi lại thông báo thông tin mỗi khi dữ liệu được ghi thành công qua 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message07. Nếu ghi không thành công, thì đoạn mã sẽ ghi lại thông báo lỗi bao gồm dấu vết ngăn xếp trong đó ngoại lệ xảy ra Với trình ghi nhật ký được tạo bằng đoạn mã 1, nếu việc thực thi 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message08 thành công thì đoạn mã này sẽ tạo một mục nhập nhật ký tương tự như 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message09. Nếu việc thực thi 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message08 không thành công thì đoạn mã này sẽ tạo mục nhập nhật ký sau 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message3 Thay vì sử dụng các đối số vị trí trong chuỗi định dạng trong phương thức ghi nhật ký, chúng ta có thể đạt được kết quả tương tự bằng cách sử dụng các đối số thông qua tên của chúng như sau 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message4 Đoạn 4. Lọc yêu cầu nhật ký2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message5 Đoạn mã này sửa đổi Đoạn mã 1 như sau
Lớp 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message13 cung cấp cơ chế đưa thông tin theo ngữ cảnh vào bản ghi nhật ký. Chúng tôi thảo luận về các cơ chế khác để đưa thông tin theo ngữ cảnh vào phần Thực tiễn tốt và Gotchas 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message6 Đoạn mã này sửa đổi Đoạn mã 3 bằng cách bọc trình ghi nhật ký trong đối tượng 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message14 để thêm thông tin phiên bản Tất cả những thay đổi trên ảnh hưởng đến hành vi ghi nhật ký của ứng dụng được mô tả trong Đoạn 2 và Đoạn 3 như sau
Bạn cho rằng điều gì sẽ xảy ra nếu bộ lọc được thêm vào bộ ghi thay vì bộ xử lý? Cấu hình ghi nhật ký PythonCác lớp ghi nhật ký được giới thiệu trong phần trước cung cấp các phương thức để định cấu hình các phiên bản của chúng và do đó, tùy chỉnh việc sử dụng thư viện ghi nhật ký. Đoạn 1 trình bày cách sử dụng các phương thức cấu hình. Các phương pháp này được sử dụng tốt nhất trong các chương trình tệp đơn giản Khi tham gia các chương trình (e. g. , ứng dụng, thư viện) sử dụng thư viện ghi nhật ký, tùy chọn tốt hơn là đưa cấu hình của thư viện ghi nhật ký ra bên ngoài. Việc mở rộng như vậy cho phép người dùng tùy chỉnh các khía cạnh nhất định của việc đăng nhập vào một chương trình (e. g. , chỉ định vị trí của tệp nhật ký, sử dụng trình ghi nhật ký/trình xử lý/bộ định dạng/bộ lọc tùy chỉnh) và do đó, dễ dàng triển khai và sử dụng chương trình. Chúng tôi đề cập đến cách tiếp cận cấu hình này là cách tiếp cận dựa trên dữ liệu Cấu hình thư việnKhách hàng có thể định cấu hình thư viện ghi nhật ký bằng cách gọi hàm 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message15. Đối số 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message16 là một từ điển và có thể sử dụng các khóa tùy chọn sau để chỉ định cấu hình lọc ánh xạ phím tới từ điển gồm các chuỗi và từ điển. Các chuỗi đóng vai trò là id bộ lọc được dùng để chỉ các bộ lọc trong cấu hình (e. g. , thêm bộ lọc vào bộ ghi) trong khi các từ điển được ánh xạ đóng vai trò cấu hình bộ lọc. Giá trị chuỗi của khóa tên trong cấu hình bộ lọc được sử dụng để xây dựng 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message17 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message7 Đoạn cấu hình này dẫn đến việc tạo bộ lọc thừa nhận tất cả các bản ghi được tạo bởi trình ghi nhật ký có tên 'ứng dụng. io' hoặc hậu duệ của nó trình định dạng ánh xạ chính tới từ điển gồm các chuỗi và từ điển. Các chuỗi đóng vai trò là id trình định dạng được dùng để chỉ các trình định dạng trong cấu hình (e. g. , thêm bộ định dạng vào trình xử lý) trong khi các từ điển được ánh xạ đóng vai trò là cấu hình bộ định dạng. Các giá trị chuỗi của khóa datefmt và khóa định dạng trong cấu hình trình định dạng được sử dụng tương ứng làm chuỗi định dạng mục nhập nhật ký và ngày tháng để xây dựng các phiên bản from loggerfactory import LoggerFactory # initialize the logger object logger = LoggerFactory.get_logger("mymodule.py", log_level="INFO") logger.info(" Inside module 1")06. Giá trị boolean của khóa xác thực (tùy chọn) kiểm soát việc xác thực các chuỗi định dạng trong quá trình xây dựng trình định dạng 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message8 Đoạn cấu hình này dẫn đến việc tạo hai trình định dạng. Trình định dạng đơn giản với chuỗi định dạng ngày và mục nhập nhật ký được chỉ định và trình định dạng chi tiết với chuỗi định dạng mục nhập nhật ký được chỉ định và chuỗi định dạng ngày mặc định trình xử lý ánh xạ chính tới một từ điển gồm các chuỗi và từ điển. Các chuỗi đóng vai trò là id trình xử lý được dùng để chỉ các trình xử lý trong cấu hình (e. g. , thêm trình xử lý vào trình ghi nhật ký) trong khi các từ điển được ánh xạ đóng vai trò là cấu hình trình xử lý. Giá trị chuỗi của khóa lớp trong cấu hình trình xử lý đặt tên cho lớp cần khởi tạo để tạo trình xử lý. Giá trị chuỗi của khóa cấp độ (tùy chọn) chỉ định cấp độ ghi nhật ký của trình xử lý đã khởi tạo. Giá trị chuỗi của khóa trình định dạng (tùy chọn) chỉ định id của trình định dạng của trình xử lý. Tương tự như vậy, danh sách các giá trị của khóa bộ lọc (tùy chọn) chỉ định id của các bộ lọc của trình xử lý. Các khóa còn lại được chuyển dưới dạng đối số từ khóa cho hàm tạo của trình xử lý 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message9 Đoạn cấu hình này dẫn đến việc tạo hai trình xử lý
logger ánh xạ tới một từ điển gồm các chuỗi đóng vai trò là tên của logger và từ điển đóng vai trò là cấu hình logger. Giá trị chuỗi của khóa 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message31 (tùy chọn) chỉ định cấp độ ghi nhật ký của trình ghi nhật ký. Giá trị boolean của khóa 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message32 (tùy chọn) chỉ định cài đặt lan truyền của bộ ghi. Danh sách các giá trị của khóa 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message33 (tùy chọn) chỉ định id của các bộ lọc của trình ghi nhật ký. Tương tự như vậy, danh sách các giá trị của khóa 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message34 (tùy chọn) chỉ định id của trình xử lý của trình ghi nhật ký import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')0 Đoạn cấu hình này dẫn đến việc tạo hai bộ ghi. Trình ghi nhật ký đầu tiên có tên là ứng dụng, ngưỡng ghi nhật ký của nó được đặt thành CẢNH BÁO và được định cấu hình để chuyển tiếp yêu cầu nhật ký tới trình xử lý 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message35 và 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message36 . Trình ghi nhật ký thứ hai được đặt tên là ứng dụng. io và ngưỡng ghi nhật ký của nó được đặt thành INFO. Do yêu cầu nhật ký được truyền tới trình xử lý được liên kết với mọi trình ghi nhật ký tăng dần, nên mọi yêu cầu nhật ký có INFO hoặc cấp độ ghi nhật ký cao hơn được thực hiện thông qua ứng dụng. io logger sẽ được chuyển đến và xử lý bởi cả trình xử lý 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message35 và 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message36 khóa gốc ánh xạ tới từ điển cấu hình cho trình ghi gốc. Định dạng của từ điển được ánh xạ giống như từ điển được ánh xạ cho bộ ghi ánh xạ khóa tăng dần thành Đúng hoặc Sai (mặc định). Nếu Đúng, thì chỉ các mức ghi nhật ký và tùy chọn truyền của trình ghi nhật ký, trình xử lý và trình ghi nhật ký gốc được xử lý và tất cả các bit khác của cấu hình sẽ bị bỏ qua. Khóa này rất hữu ích để thay đổi cấu hình ghi nhật ký hiện có. Tham khảo Cấu hình gia tăng để biết thêm chi tiết khóa disable_current_loggers ánh xạ tới access_log /var/log/nginx/access.log;2 (mặc định) hoặc 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message40. Nếu 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message40, thì tất cả các bộ ghi không phải root hiện có sẽ bị vô hiệu hóa do xử lý cấu hình này Ngoài ra, đối số 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message16 phải ánh xạ khóa 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message43 thành 1 Đây là cấu hình hoàn chỉnh bao gồm các đoạn trên import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')1 Tùy chỉnh thông qua Chức năng của Nhà máyLược đồ cấu hình cho các bộ lọc hỗ trợ một mẫu để chỉ định hàm logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)9 để tạo bộ lọc. Trong mẫu này, cấu hình bộ lọc ánh xạ khóa () với tên đủ điều kiện của bộ lọc tạo chức năng xuất xưởng cùng với một bộ khóa và giá trị được chuyển dưới dạng đối số từ khóa cho chức năng xuất xưởng. Ngoài ra, các thuộc tính và giá trị có thể được thêm vào bộ lọc tùy chỉnh bằng cách ánh xạ khóa 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message45 vào từ điển tên và giá trị thuộc tính Ví dụ: cấu hình bên dưới sẽ khiến lệnh gọi 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message46 tạo bộ lọc tùy chỉnh và thêm thuộc tính cục bộ có giá trị access_log /var/log/nginx/access.log;2 vào bộ lọc này import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')2 Lược đồ cấu hình cho trình định dạng, trình xử lý và trình ghi nhật ký cũng hỗ trợ mẫu trên. Trong trường hợp trình xử lý/trình ghi nhật ký, nếu mẫu này và khóa 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message48 xuất hiện trong từ điển cấu hình, thì mẫu này được sử dụng để tạo trình xử lý/trình ghi nhật ký. Tham khảo Đối tượng do người dùng xác định để biết thêm chi tiết Cấu hình bằng Configparse-Format FilesThư viện ghi nhật ký cũng hỗ trợ tải cấu hình từ tệp có định dạng 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message49 thông qua hàm < 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message50. Vì đây là một API cũ hơn không cung cấp tất cả các chức năng mà lược đồ cấu hình dựa trên từ điển cung cấp, nên bạn nên sử dụng hàm 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message51; Định cấu hình qua dâyMặc dù các API trên có thể được sử dụng để cập nhật cấu hình ghi nhật ký khi ứng dụng khách đang chạy (e. g. , dịch vụ web), lập trình các cơ chế cập nhật như vậy từ đầu có thể cồng kềnh. Hàm 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message54 giúp giải quyết vấn đề này. Chức năng này khởi động máy chủ ổ cắm chấp nhận cấu hình mới qua dây và tải chúng thông qua chức năng 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message51 hoặc 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message52. Tham khảo 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message57 để biết thêm chi tiết Đang tải và lưu trữ cấu hìnhVì cấu hình được cung cấp cho 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message51 chỉ là một tập hợp các từ điển lồng nhau nên cấu hình ghi nhật ký có thể dễ dàng được trình bày ở định dạng JSON và YAML. Do đó, các chương trình có thể sử dụng mô-đun 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message59 trong thư viện chuẩn của Python hoặc thư viện xử lý YAML bên ngoài để đọc và ghi cấu hình ghi nhật ký từ tệp Ví dụ: đoạn mã sau đủ để tải cấu hình ghi nhật ký được lưu trữ ở định dạng JSON import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')3 Hạn chếTrong sơ đồ cấu hình được hỗ trợ, chúng tôi không thể định cấu hình bộ lọc để lọc ngoài tính năng lọc dựa trên tên đơn giản. Ví dụ: chúng tôi không thể tạo bộ lọc chỉ chấp nhận các yêu cầu nhật ký được tạo từ 6 giờ chiều đến 6 giờ sáng. Chúng tôi cần lập trình các bộ lọc như vậy bằng Python và thêm chúng vào trình ghi nhật ký và trình xử lý thông qua các hàm xuất xưởng hoặc phương thức 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message60 Ghi nhật ký Python Thực hành tốt và GotchasTrong phần này, chúng tôi sẽ liệt kê một vài thực tiễn tốt và các vấn đề liên quan đến thư viện ghi nhật ký. Danh sách này bắt nguồn từ kinh nghiệm của chúng tôi và chúng tôi dự định danh sách này sẽ bổ sung cho thông tin mở rộng có sẵn trong phần Ghi nhật ký HOWTO và Ghi nhật ký sách dạy nấu ăn trong tài liệu của Python Vì không có viên đạn bạc nào nên tất cả các phương pháp hay và vấn đề đều có ngoại lệ hầu như luôn phù hợp với ngữ cảnh. Vì vậy, trước khi sử dụng các phương pháp hay và vấn đề cần lưu ý sau đây, hãy xem xét khả năng áp dụng của chúng trong ngữ cảnh ứng dụng của bạn và xác định xem chúng có phù hợp trong ngữ cảnh ứng dụng của bạn không Tạo logger bằng chức năng getloggerHàm nhà máy 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message61 giúp thư viện quản lý ánh xạ từ tên trình ghi nhật ký sang phiên bản trình ghi nhật ký và duy trì hệ thống phân cấp trình ghi nhật ký. Đổi lại, ánh xạ và hệ thống phân cấp này mang lại những lợi ích sau
Sử dụng chức năng cấp độ ghi nhật kýSử dụng hàm _______364 hoặc các phương thức _______365 để ghi nhật ký ở các mức ghi nhật ký được xác định trước Bên cạnh việc làm cho mã ngắn hơn một chút, việc sử dụng các hàm/phương thức này giúp phân chia các câu lệnh ghi nhật ký trong một chương trình thành hai bộ
Sử dụng các mức ghi nhật ký được xác định trướcNhư được mô tả trong phần Cấp độ ghi nhật ký trong chương Khái niệm và API, các cấp độ ghi nhật ký được xác định trước do thư viện cung cấp nắm bắt hầu hết tất cả các tình huống ghi nhật ký xảy ra trong các chương trình. Hơn nữa, vì hầu hết các nhà phát triển đều quen thuộc với các mức ghi nhật ký được xác định trước (vì hầu hết các thư viện ghi nhật ký trên các ngôn ngữ lập trình khác nhau đều cung cấp các mức rất giống nhau), việc sử dụng các mức được xác định trước có thể giúp giảm gánh nặng triển khai, cấu hình và bảo trì. Vì vậy, trừ khi được yêu cầu, hãy sử dụng các mức ghi nhật ký được xác định trước Tạo trình ghi nhật ký cấp mô-đunTrong khi tạo logger, chúng ta có thể tạo logger cho từng lớp hoặc tạo logger cho từng mô-đun. Mặc dù tùy chọn đầu tiên cho phép cấu hình chi tiết, nhưng nó dẫn đến nhiều bộ ghi nhật ký hơn trong một chương trình, tôi. e. , mỗi lớp một. Ngược lại, tùy chọn thứ hai có thể giúp giảm số lượng bộ ghi trong một chương trình. Vì vậy, trừ khi cấu hình chi tiết như vậy là cần thiết, hãy tạo bộ ghi nhật ký cấp mô-đun Đặt tên cho bộ ghi cấp mô-đun với tên của các mô-đun tương ứngVì tên logger là các giá trị chuỗi không thuộc vùng tên của chương trình Python nên chúng sẽ không xung đột với tên mô-đun. Do đó, hãy sử dụng tên của một mô-đun làm tên của bộ ghi cấp độ mô-đun tương ứng. Với cách đặt tên này, việc đặt tên bộ ghi nhật ký cõng trên cách đặt tên mô-đun dựa trên ký hiệu dấu chấm và do đó, đơn giản hóa việc tham khảo bộ ghi nhật ký sử dụng ghi nhật ký. LoggerAdatper để thêm thông tin theo ngữ cảnh cục bộNhư đã minh họa trong Đoạn 4, chúng ta có thể sử dụng 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message12 để đưa thông tin theo ngữ cảnh vào bản ghi nhật ký. 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message14 cũng có thể được sử dụng để sửa đổi thông điệp tường trình và dữ liệu nhật ký được cung cấp như một phần của yêu cầu nhật ký Vì thư viện ghi nhật ký không quản lý các bộ điều hợp này nên không thể truy cập chúng thông qua tên chung. Vì lý do này, hãy sử dụng chúng để đưa thông tin theo ngữ cảnh cục bộ vào một mô-đun hoặc một lớp Sử dụng bộ lọc hoặc 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message68 để thêm thông tin theo ngữ cảnh toàn cầuCó hai tùy chọn để đưa liền mạch thông tin theo ngữ cảnh toàn cầu (phổ biến trên một ứng dụng) vào các bản ghi nhật ký Tùy chọn đầu tiên là sử dụng hỗ trợ bộ lọc để sửa đổi các đối số bản ghi nhật ký được cung cấp cho các bộ lọc. Ví dụ: bộ lọc sau đưa thông tin phiên bản vào các bản ghi nhật ký đến import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')4 Có hai nhược điểm đối với tùy chọn này. Đầu tiên, nếu các bộ lọc phụ thuộc vào dữ liệu trong bản ghi nhật ký, thì các bộ lọc đưa dữ liệu vào bản ghi nhật ký sẽ được thực thi trước các bộ lọc sử dụng dữ liệu được đưa vào. Do đó, thứ tự các bộ lọc được thêm vào bộ ghi và trình xử lý trở nên quan trọng. Thứ hai, tùy chọn “lạm dụng” hỗ trợ lọc bản ghi nhật ký để mở rộng bản ghi nhật ký Tùy chọn thứ hai là khởi tạo thư viện ghi nhật ký với chức năng tạo bản ghi nhật ký thông qua 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message69. Vì thông tin theo ngữ cảnh được đưa vào là toàn cầu nên nó có thể được đưa vào các bản ghi nhật ký khi chúng được tạo trong hàm logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)9 và đảm bảo dữ liệu sẽ có sẵn cho mọi bộ lọc, trình định dạng, trình ghi nhật ký và trình xử lý trong chương trình Nhược điểm của tùy chọn này là chúng ta phải đảm bảo các hàm logging.getLogger(“coralogix”) logging.getLogger(“coralogix.database”) logging.getLogger(“coralogix.client”)9 được đóng góp bởi các thành phần khác nhau trong một chương trình hoạt động tốt với nhau. Mặc dù các chức năng của nhà máy ghi nhật ký có thể được xâu chuỗi, nhưng việc xâu chuỗi như vậy làm tăng độ phức tạp của chương trình Sử dụng phương pháp dựa trên dữ liệu để định cấu hình thư viện ghi nhật kýNếu chương trình của bạn liên quan đến nhiều mô-đun và có thể là các thành phần của bên thứ ba, thì hãy sử dụng phương pháp dựa trên dữ liệu được mô tả trong chương Cấu hình để định cấu hình thư viện ghi nhật ký Đính kèm các trình xử lý chung vào bộ ghi nhật ký ở cấp cao hơn trong hệ thống phân cấp bộ ghiNếu một trình xử lý là chung cho hai trình ghi nhật ký, trong đó một trình ghi nhật ký là con cháu của trình ghi nhật ký kia, thì hãy đính kèm trình xử lý đó với trình ghi nhật ký tăng dần và dựa vào thư viện ghi nhật ký để truyền các yêu cầu nhật ký từ trình ghi nhật ký kế thừa sang trình xử lý của trình ghi nhật ký tăng dần. Nếu thuộc tính 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message72 của trình ghi nhật ký chưa được sửa đổi, mẫu này sẽ giúp tránh các thông báo trùng lặp Sử dụng hàm 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message73 để chặn quá trình xử lý các yêu cầu nhật ký dưới một mức ghi nhật ký nhất định trên tất cả các trình ghi nhật kýTrình ghi nhật ký xử lý yêu cầu nhật ký nếu mức ghi nhật ký của yêu cầu nhật ký ít nhất cao bằng mức ghi nhật ký hiệu quả của trình ghi nhật ký. Cấp độ ghi nhật ký hiệu quả của người ghi nhật ký là cấp độ cao hơn trong hai cấp độ ghi nhật ký. mức ghi ngưỡng của trình ghi và mức ghi toàn bộ thư viện. Chúng tôi có thể đặt mức ghi nhật ký trên toàn thư viện thông qua hàm 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message74. Theo mặc định, mức ghi toàn bộ thư viện là 0, i. e. , các yêu cầu nhật ký của mọi cấp độ ghi sẽ được xử lý Khi sử dụng chức năng này, chúng tôi có thể điều chỉnh đầu ra ghi nhật ký của một ứng dụng bằng cách tăng cấp độ ghi nhật ký trên toàn bộ ứng dụng Điều gì về bộ nhớ đệm tham chiếu đến logger?Trước khi chuyển sang vấn đề cần giải quyết, chúng ta hãy xem xét lợi ích của phương pháp phổ biến trong việc lưu vào bộ nhớ đệm các tham chiếu tới trình ghi nhật ký và truy cập trình ghi nhật ký thông qua các tham chiếu được lưu trong bộ nhớ cache, ví dụ:. g. , đây là cách thuộc tính _______375 được sử dụng trong các đoạn mã trước Mẫu mã hóa này tránh các lệnh gọi lặp lại của hàm 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message61 để truy xuất cùng một bộ ghi cấp mô-đun; . Tuy nhiên, việc loại bỏ như vậy có thể dẫn đến yêu cầu nhật ký bị mất nếu việc truy xuất không dư thừa. Ví dụ: giả sử cấu hình thư viện ghi nhật ký trong một dịch vụ web hoạt động lâu dài được cập nhật với tùy chọn 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message77 này. Vì một bản cập nhật như vậy sẽ vô hiệu hóa bộ ghi nhật ký được lưu trong bộ nhớ cache, nên không có câu lệnh ghi nhật ký nào sử dụng bộ ghi nhật ký được lưu trong bộ nhớ cache sẽ ghi lại bất kỳ yêu cầu nào. Mặc dù chúng ta có thể khắc phục tình trạng này bằng cách cập nhật các tham chiếu đã lưu vào bộ nhớ cache cho trình ghi nhật ký, nhưng một giải pháp đơn giản hơn sẽ là sử dụng hàm 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message61 thay vì lưu các tham chiếu vào bộ nhớ đệm Nói tóm lại, việc lưu trữ các tham chiếu vào bộ ghi nhật ký không phải lúc nào cũng là một cách thực hành tốt. Vì vậy, hãy xem xét bối cảnh của chương trình trong khi quyết định lưu trữ các tham chiếu vào bộ ghi nhật ký Xử lý sự cốBộ lọc thất bạiKhi thư viện ghi nhật ký gọi các bộ lọc được liên kết với trình xử lý và trình ghi nhật ký, thư viện giả định rằng các bộ lọc sẽ luôn thực thi cho đến khi hoàn thành, tôi. e. , không thất bại về lỗi. Vì vậy, không có logic xử lý lỗi nào trong thư viện để xử lý các bộ lọc bị lỗi. Do đó, khi bộ lọc không thành công (thực thi đến khi hoàn thành), yêu cầu nhật ký tương ứng sẽ không được ghi lại Đảm bảo các bộ lọc sẽ thực thi đến khi hoàn thành. Hơn nữa, khi sử dụng các bộ lọc tùy chỉnh và sử dụng dữ liệu bổ sung trong quá trình lọc Trình định dạng không thành côngThư viện ghi nhật ký đưa ra một giả định tương tự về các trình định dạng, tôi. e. , trình định dạng sẽ luôn thực thi cho đến khi hoàn thành. Do đó, khi một trình định dạng không thể thực thi đến khi hoàn thành, yêu cầu nhật ký tương ứng sẽ không được ghi lại Đảm bảo các trình định dạng sẽ thực thi đến khi hoàn thành Các khóa bắt buộc bị thiếu là đối số $ uwsgi --log-syslog=yourapp …6Nếu bộ lọc/bộ định dạng tham chiếu đến các khóa của đối số $ uwsgi --log-syslog=yourapp …6 được cung cấp như một phần của phương pháp ghi nhật ký, thì bộ lọc/bộ định dạng có thể bị lỗi khi đối số $ uwsgi --log-syslog=yourapp …6 không cung cấp khóa 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message82 Đảm bảo mọi khóa của đối số $ uwsgi --log-syslog=yourapp …6 được sử dụng trong bộ lọc hoặc bộ định dạng đều có sẵn trong mọi câu lệnh ghi nhật ký kích hoạt Các khóa trong đối số $ uwsgi --log-syslog=yourapp …6 xung đột với các thuộc tính bắt buộcThư viện ghi nhật ký thêm các khóa của đối số $ uwsgi --log-syslog=yourapp …6 (vào các phương thức ghi nhật ký khác nhau) làm thuộc tính cho các bản ghi nhật ký. Tuy nhiên, nếu 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message86 và 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message87 là các khóa trong đối số $ uwsgi --log-syslog=yourapp …6, thì việc tạo bản ghi nhật ký sẽ không thành công và yêu cầu nhật ký tương ứng sẽ không được ghi lại Lỗi tương tự xảy ra nếu $ uwsgi --log-syslog=yourapp …2, $ uwsgi --log-syslog=yourapp …3, 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message91, $ uwsgi --log-syslog=yourapp …1, 'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, },2 hoặc 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message94 xảy ra dưới dạng các khóa trong đối số $ uwsgi --log-syslog=yourapp …6; Đảm bảo 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message86, 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message87 và một số thuộc tính nhất định của $ uwsgi --log-syslog=yourapp …8 không xuất hiện dưới dạng khóa trong đối số $ uwsgi --log-syslog=yourapp …6 của phương pháp ghi nhật ký Các thư viện sử dụng mức ghi nhật ký tùy chỉnh được kết hợpKhi một chương trình và các thư viện phụ thuộc của nó sử dụng thư viện ghi nhật ký, các yêu cầu ghi nhật ký của chúng được kết hợp bởi thư viện ghi nhật ký cơ sở phục vụ các yêu cầu này. Trong trường hợp này, nếu các thành phần của chương trình sử dụng các mức ghi nhật ký tùy chỉnh không nhất quán lẫn nhau, thì kết quả ghi nhật ký có thể không dự đoán được Không sử dụng các mức ghi nhật ký tùy chỉnh, cụ thể là trong thư viện Bộ lọc của logger tổ tiên không kích hoạtTheo mặc định, các yêu cầu nhật ký được truyền lên hệ thống phân cấp trình ghi nhật ký để được xử lý bởi trình xử lý của trình ghi nhật ký tổ tiên. Trong khi các bộ lọc của trình xử lý xử lý các yêu cầu nhật ký đó, thì các bộ lọc của các trình ghi nhật ký tương ứng không xử lý các yêu cầu nhật ký đó Để áp dụng bộ lọc cho tất cả các yêu cầu nhật ký được gửi tới bộ ghi, hãy thêm bộ lọc vào bộ ghi Id của trình xử lý/bộ lọc/bộ định dạng xung độtNếu nhiều trình xử lý chia sẻ cùng một id trình xử lý trong một cấu hình, thì id trình xử lý đó đề cập đến trình xử lý được tạo cuối cùng khi cấu hình được xử lý. Điều tương tự cũng xảy ra giữa các bộ lọc và trình định dạng chia sẻ id Khi máy khách kết thúc, thư viện ghi nhật ký sẽ thực thi logic dọn dẹp của trình xử lý được liên kết với từng id trình xử lý. Vì vậy, nếu nhiều trình xử lý có cùng id trong một cấu hình, thì logic dọn dẹp của tất cả trừ trình xử lý được tạo cuối cùng sẽ không được thực thi và do đó, dẫn đến rò rỉ tài nguyên Sử dụng id duy nhất cho các đối tượng thuộc loại trong cấu hình Hiệu suất ghi nhật ký PythonMặc dù các câu lệnh ghi nhật ký giúp nắm bắt thông tin tại các vị trí trong chương trình, nhưng chúng góp phần vào chi phí của chương trình về thời gian thực hiện (e. g. , ghi nhật ký trong các vòng lặp) và lưu trữ (e. g. , ghi nhiều dữ liệu). Mặc dù việc ghi nhật ký miễn phí nhưng hữu ích là không thể, nhưng chúng ta có thể giảm chi phí ghi nhật ký bằng cách đưa ra các lựa chọn dựa trên các cân nhắc về hiệu suất Cân nhắc dựa trên cấu hìnhSau khi thêm các câu lệnh ghi nhật ký vào chương trình, chúng ta có thể sử dụng hỗ trợ để định cấu hình ghi nhật ký (được mô tả trước đó) để kiểm soát việc thực thi các câu lệnh ghi nhật ký và thời gian thực hiện liên quan. Cụ thể, hãy xem xét các khả năng cấu hình sau khi đưa ra quyết định về hiệu suất liên quan đến ghi nhật ký
Ở trên thay đổi phạm vi từ các khía cạnh thô hơn sang tốt hơn của hỗ trợ ghi nhật ký trong Python Cân nhắc dựa trên mãMặc dù hỗ trợ cấu hình ghi nhật ký rất mạnh, nhưng nó không thể giúp kiểm soát tác động hiệu suất của các lựa chọn triển khai được đưa vào mã nguồn. Dưới đây là một số lựa chọn triển khai liên quan đến ghi nhật ký như vậy và lý do tại sao bạn nên xem xét chúng khi đưa ra quyết định về hiệu suất liên quan đến ghi nhật ký Không thực hiện báo cáo ghi nhật ký không hoạt độngKhi thêm mô-đun ghi nhật ký vào thư viện chuẩn của Python, đã có những lo ngại về chi phí thực thi liên quan đến các câu lệnh ghi nhật ký không hoạt động — các câu lệnh ghi nhật ký đưa ra các yêu cầu ghi nhật ký với mức ghi nhật ký thấp hơn ngưỡng ghi nhật ký của trình ghi mục tiêu. Ví dụ: một câu lệnh ghi nhật ký gọi import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')01 sẽ thêm bao nhiêu thời gian vào thời gian thực thi của chương trình khi mức ghi nhật ký ngưỡng của trình ghi nhật ký là import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')02? import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')5 Ngày nay, mối lo ngại này không còn hợp lệ vì các phương thức ghi nhật ký trong lớp import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')03 thực hiện các kiểm tra tương tự và chỉ xử lý yêu cầu nhật ký nếu kiểm tra vượt qua. Ví dụ: như được hiển thị bên dưới, việc kiểm tra trên được thực hiện theo phương pháp import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')04 import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')6 Do đó, các câu lệnh ghi nhật ký không hoạt động sẽ biến thành các câu lệnh không hoạt động một cách hiệu quả và không đóng góp vào chi phí thực thi chương trình Mặc dù vậy, người ta nên xem xét hai khía cạnh sau khi thêm báo cáo ghi nhật ký
Đừng háo hức xây dựng thông báo tường trìnhKhách hàng có thể xây dựng thông điệp tường trình theo hai cách. háo hức và lười biếng
Mặc dù cả hai cách tiếp cận đều dẫn đến cùng một kết quả, nhưng chúng thể hiện các đặc điểm hiệu suất khác nhau do sự háo hức và lười biếng của việc xây dựng thông điệp Ví dụ: trên máy tính xách tay thông thường, một triệu lệnh gọi không hoạt động của import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')16 mất 2197 mili giây trong khi một triệu lệnh gọi không hoạt động của import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')17 mất 1111 mili giây khi import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')18 là danh sách bốn số nguyên. Trong trường hợp có một triệu yêu cầu đang hoạt động, cách tiếp cận đầu tiên mất 11061 mili giây và cách tiếp cận thứ hai mất 10149 mili giây. Tiết kiệm 9–50% thời gian ghi nhật ký Vì vậy, cách tiếp cận thứ hai (lười biếng) hiệu quả hơn cách tiếp cận thứ nhất (háo hức) trong trường hợp cả báo cáo ghi nhật ký không hoạt động và hoạt động. Hơn nữa, lợi ích sẽ lớn hơn khi việc xây dựng thông báo không tầm thường, e. g. , sử dụng nhiều đối số, chuyển đổi các đối số phức tạp thành chuỗi Không thu thập thông tin ngầm không cần thiếtTheo mặc định, khi bản ghi nhật ký được tạo, dữ liệu sau sẽ được ghi lại trong bản ghi nhật ký
Trừ khi các bit dữ liệu này được ghi lại, việc thu thập chúng sẽ làm tăng chi phí thực thi một cách không cần thiết. Vì vậy, nếu các bit dữ liệu này sẽ không được ghi lại, thì hãy định cấu hình khung ghi nhật ký để không thu thập chúng bằng cách đặt các cờ sau
Không chặn luồng thực thi chínhCó những tình huống mà chúng tôi có thể muốn ghi dữ liệu trong luồng thực thi chính mà không mất hầu hết thời gian để ghi dữ liệu. Những tình huống như vậy là phổ biến trong các dịch vụ web, e. g. , một luồng xử lý yêu cầu cần ghi nhật ký các yêu cầu web đến mà không làm tăng đáng kể thời gian phản hồi của nó. Chúng ta có thể giải quyết những tình huống này bằng cách tách mối quan tâm giữa các chủ đề. một máy khách/luồng chính tạo một bản ghi nhật ký trong khi một luồng ghi nhật ký ghi lại bản ghi. Vì tác vụ ghi nhật ký thường chậm hơn vì nó liên quan đến các tài nguyên chậm hơn (e. g. , lưu trữ thứ cấp) hoặc các dịch vụ khác (e. g. , logging services such as Coralogix, pub-sub systems such as Kafka), this separation of concerns helps minimize the effort of logging on the execution time of the main/client thread Thư viện ghi nhật ký Python giúp xử lý các tình huống như vậy thông qua các lớp import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')23 và import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')24 như sau
Ghi chú. Mặc dù import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')26 đi kèm với một chiến lược phân luồng mặc định, nhưng các nhà phát triển không bắt buộc phải sử dụng chiến lược này để sử dụng import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('This is a log message.')25. Thay vào đó, các nhà phát triển có thể sử dụng các chiến lược phân luồng thay thế đáp ứng nhu cầu của họ Đó là kết thúc nó cho hướng dẫn ghi nhật ký Python này. Nếu bạn đang tìm kiếm một giải pháp quản lý nhật ký để tập trung nhật ký Python của mình, hãy xem tích hợp Python dễ cấu hình của chúng tôi |