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ý Python
Vì 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ý Python
Thư 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
- Trình ghi nhật ký hiển thị giao diện mà mã ứng dụng trực tiếp sử dụng
- Trình xử lý gửi bản ghi nhật ký [được tạo bởi trình ghi nhật ký] đến đích thích hợp
- Bộ lọc cung cấp cơ sở chi tiết hơn để xác định bản ghi nhật ký nào sẽ xuất ra
- Trình định dạng chỉ định bố cục của các bản ghi nhật ký trong đầu ra cuối cùng
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 Python Client for Stackdriver Logging 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ý Python của bạn
Các phương pháp hay nhất về ghi nhật ký Python
Khả 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 để thực hành tốt nhất về ghi nhật ký ứng dụng web, vì vậy 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
- BẠO KÍCH
- LỖI
- CẢNH BÁO
- THÔNG TIN
- GỠ LỖI
Đă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
$ uwsgi --log-syslog=yourapp …
Đă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ỳ sự kết hợp nào của tiêu đề Hết hạn hoặc Thẻ điện tử, 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
________số 8Phâ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
with open[logfile, "rb"] as f: for line in csv.reader[f, delimiter=' ']: self._update[**self._parse[line]]
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ý được viết bằng Python tới Coralogix để tìm kiếm, theo dõ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ý Python
Phầ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ản
Khi 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]
- Một ứng dụng khách đưa ra yêu cầu ghi nhật ký bằng cách thực hiện một câu lệnh ghi nhật ký. Thông thường, các câu lệnh ghi nhật ký như vậy gọi một hàm/phương thức trong API [thư viện] ghi nhật ký bằng cách cung cấp dữ liệu nhật ký và cấp độ ghi nhật ký làm đối số. Mức ghi nhật ký chỉ định tầm quan trọng của yêu cầu nhật ký. Dữ liệu nhật ký thường là một thông báo nhật ký, là một chuỗi, cùng với một số dữ liệu bổ sung sẽ được ghi lại. Thông thường, API ghi nhật ký được hiển thị thông qua đối tượng logger
- Để cho phép xử lý một yêu cầu khi nó chạy qua thư viện ghi nhật ký, thư viện ghi nhật ký sẽ tạo một bản ghi nhật ký đại diện cho yêu cầu nhật ký và ghi lại dữ liệu nhật ký tương ứng
- Dựa trên cách thư viện ghi nhật ký được định cấu hình [thông qua cấu hình ghi nhật ký], thư viện ghi nhật ký lọc các yêu cầu/bản ghi nhật ký. Quá trình lọc này liên quan đến việc so sánh cấp độ ghi nhật ký được yêu cầu với cấp độ ghi nhật ký ngưỡng và chuyển các bản ghi nhật ký thông qua các bộ lọc do người dùng cung cấp
- Trình xử lý xử lý các bản ghi nhật ký đã lọc để lưu trữ dữ liệu nhật ký [e. g. , ghi dữ liệu nhật ký vào một tệp] hoặc thực hiện các hành động khác liên quan đến dữ liệu nhật ký [e. g. , gửi email có dữ liệu nhật ký]. Trong một số thư viện ghi nhật ký, trước khi xử lý các bản ghi nhật ký, trình xử lý có thể lọc lại các bản ghi nhật ký dựa trên cấp độ ghi nhật ký của trình xử lý và các bộ lọc dành riêng cho trình xử lý do người dùng cung cấp. Ngoài ra, khi cần, trình xử lý thường dựa vào trình định dạng do người dùng cung cấp để định dạng bản ghi nhật ký thành chuỗi, tôi. e. , các mục nhật ký
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ý Python
Thư 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ý
- Mô-đun
import logging logging.basicConfig[level=logging.DEBUG, format='%[asctime]s - %[levelname]s - %[message]s'] logging.debug['This is a log message.']
7 cung cấp API hướng tới khách hàng chính - Mô-đun
import logging logging.basicConfig[level=logging.DEBUG, format='%[asctime]s - %[levelname]s - %[message]s'] logging.debug['This is a log message.']
8 cung cấp API để định cấu hình đăng nhập trong ứng dụng khách - Mô-đun
import logging logging.basicConfig[level=logging.DEBUG, format='%[asctime]s - %[levelname]s - %[message]s'] logging.debug['This is a log message.']
9 cung cấp các trình xử lý khác nhau bao gồm các cách phổ biến để xử lý và lưu trữ bản ghi nhật ký
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 nhật ký Python 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ý Python
Ra khỏi hộp, thư viện ghi nhật ký Python hỗ trợ năm. 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. ,
- gỡ lỗi. Sử dụng
LogWithLevelName = logging.getLogger['myLoggerSample'] level = logging.getLevelName['INFO'] LogWithLevelName.setLevel[level]
4 để ghi thông tin chi tiết, thường chỉ được quan tâm khi chẩn đoán sự cố, e. g. , khi ứng dụng bắt đầu - Thông tin. Sử dụng
LogWithLevelName = logging.getLogger['myLoggerSample'] level = logging.getLevelName['INFO'] LogWithLevelName.setLevel[level]
3 để xác nhận phần mềm đang hoạt động như mong đợi, e. g. , khi ứng dụng khởi chạy thành công - Cảnh báo. Sử dụng
LogWithLevelName = logging.getLogger['myLoggerSample'] level = logging.getLevelName['INFO'] LogWithLevelName.setLevel[level]
2 để báo cáo các hành vi không mong muốn hoặc là dấu hiệu của các sự cố trong tương lai nhưng không ảnh hưởng đến hoạt động hiện tại của phần mềm, e. g. , khi ứng dụng phát hiện bộ nhớ thấp và điều này có thể ảnh hưởng đến hiệu suất trong tương lai của ứng dụng - Lỗi. Sử dụng
LogWithLevelName = logging.getLogger['myLoggerSample'] level = logging.getLevelName['INFO'] LogWithLevelName.setLevel[level]
1 để báo cáo phần mềm không thực hiện được một số chức năng, e. g. , khi ứng dụng không lưu được dữ liệu do không đủ quyền - Bạo kích. Sử dụng
LogWithLevelName = logging.getLogger['myLoggerSample'] level = logging.getLevelName['INFO'] LogWithLevelName.setLevel[level]
0 để báo cáo các lỗi nghiêm trọng có thể ngăn phần mềm tiếp tục thực thi, e. g. , khi ứng dụng không cấp phát bộ nhớ
Máy ghi nhật ký Python
Cá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ạo
Hà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 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 trình ghi nhật ký, thư viện đảm bảo rằng một trình ghi tồn tại cho từng cấp của cấu trúc phân cấp được chỉ định bởi tên và mọi trình ghi trong cấu trúc phân cấp được liên kết với trình ghi cha và con của nó
Mức ghi ngưỡng
Mỗ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 hàm
logging.getLogger[“coralogix”] logging.getLogger[“coralogix.database”] logging.getLogger[“coralogix.client”]9 được sử dụng để tạo bộ ghi nhật ký, hàm 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ý Python
Mọ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
'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, },
8 đưa ra các yêu cầu ghi nhật ký với các mức ghi nhật ký được chỉ định rõ ràng. Phương pháp này hữu ích khi sử dụng các mức ghi nhật ký tùy chỉnh'handlers': { 'stderr': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'your_formatter', }, },
9 đưa ra các yêu cầu nhật ký với cấp độ ghi nhật ký$ uwsgi --log-syslog=yourapp …
0 và ghi lại ngoại lệ hiện tại như một phần của các mục nhập nhật ký. Do đó, khách hàng chỉ nên gọi phương thức này từ một trình xử lý ngoại lệ
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 , , và
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
- Sau khi quyết định xử lý một yêu cầu nhật ký dựa trên cấp độ ghi nhật ký và ngưỡng ghi nhật ký, trình ghi nhật ký sẽ tạo một đối tượng
$ uwsgi --log-syslog=yourapp …
7 để thể hiện yêu cầu nhật ký trong quá trình xử lý tiếp theo của yêu cầu. Các đối tượng$ uwsgi --log-syslog=yourapp …
8 nắm bắt các đối số$ uwsgi --log-syslog=yourapp …
1 và$ uwsgi --log-syslog=yourapp …
2 của phương thức ghi nhật ký cũng như ngoại lệ và thông tin ngăn xếp cuộc gọi cùng với thông tin mã nguồn. Chúng cũng nắm bắt các khóa và giá trị trong đối số phụ của phương thức ghi nhật ký dưới dạng các trường - Sau khi mọi trình xử lý của trình ghi nhật ký đã xử lý yêu cầu nhật ký, trình xử lý của trình ghi nhật ký tổ tiên của nó sẽ xử lý yêu cầu [theo thứ tự chúng gặp phải khi đi lên hệ thống phân cấp trình ghi nhật ký]. Trường
access_log /var/log/nginx/access.log;
1 kiểm soát khía cạnh này, là trườngaccess_log /var/log/nginx/access.log;
2 theo mặc định
Ngoài các cấp độ ghi nhật ký, 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ý, e. 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ý Python
Bấ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ý Python
Cá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. , viết nó vào hoặc. 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 một ] hoặc chuyển bản ghi nhật ký cho các thực thể khác để xử lý thêm [e. g. , hãy cung cấp bản ghi nhật ký cho một hoặc một ]
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
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;0. Họ cũng hỗ trợ qua các phương thức
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;1 và
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;2
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. Khách hàng có thể đặt trình định dạng cho trình xử lý thông qua phương thức. 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 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 cần có trình xử lý tùy chỉnh, nhà phát triển có thể mở rộng lớp
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;3 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
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;4 để ghi lại bản ghi nhật ký được cung cấp
Trình định dạng nhật ký Python
Trình xử lý sử dụng đối tượng
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;5 để đị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 được yêu cầu, tên của trình ghi nhật ký và thông báo tường trình. 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
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;6 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
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;7, e. g. , '%[tên cấp độ]s. %[name]s. %[tin nhắn]s’
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;8, e. g. , '{tên cấp độ}. {Tên}. {thông điệp}'
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;9, 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
with open[logfile, "rb"] as f: for line in csv.reader[f, delimiter=' ']: self._update[**self._parse[line]]2
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
with open[logfile, "rb"] as f: for line in csv.reader[f, delimiter=' ']: self._update[**self._parse[line]]3 để 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
with open[logfile, "rb"] as f: for line in csv.reader[f, delimiter=' ']: self._update[**self._parse[line]]6. 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 ứng dụng khách 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
with open[logfile, "rb"] as f: for line in csv.reader[f, delimiter=' ']: self._update[**self._parse[line]]8 cung cấp dưới dạng các hàm
with open[logfile, "rb"] as f: for line in csv.reader[f, delimiter=' ']: self._update[**self._parse[line]]9 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 phục vụ 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 _______102 làm trình xử lý cho bộ ghi nhật ký 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 thực thể
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 _______105
Ví dụ về nhật ký Python
Dướ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ạ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 message0
Đoạn mã này thực hiện như sau
- Tạo một trình ghi nhật ký có tên là 'ứng dụng'
- Đặt mức ghi ngưỡng của thiết bị ghi thành INFO
- Tạo trình xử lý dựa trên luồng ghi các mục nhật ký vào luồng lỗi tiêu chuẩn
- Đặt ngưỡng ghi nhật ký của trình xử lý thành INFO
- Tạo một định dạng để chụp
- thời gian của yêu cầu nhật ký dưới dạng số giây kể từ kỷ nguyên,
- mức ghi nhật ký của yêu cầu,
- tên của người khai thác gỗ,
- tên của mô-đun đưa ra yêu cầu nhật ký và
- thông điệp nhật ký
- Đặt trình định dạng đã tạo làm trình định dạng của trình xử lý
- Thêm trình xử lý đã tạo vào trình ghi nhật ký này
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
- Các dòng được đánh dấu số 1 thêm bộ lọc vào trình xử lý. Bộ lọc này chỉ chấp nhận các bản ghi nhật ký nếu mức ghi nhật ký của chúng lớn hơn hoặc bằng
LogWithLevelName = logging.getLogger['myLoggerSample'] level = logging.getLevelName['INFO'] LogWithLevelName.setLevel[level]
1 hoặc chúng đến từ một thành phần có phiên bản cao hơn 4 - Dòng được đánh dấu #2 bao 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 message
12 để đưa thông tin phiên bản vào bản ghi nhật ký
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 một cơ chế để đưa thông tin theo ngữ cảnh vào các 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
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
- Yêu cầu ghi lại thông báo thông tin về việc bắt đầu ứng dụng được xử lý khi thông tin phiên bản do mô-đun cung cấp đáp ứng bộ lọc
- Yêu cầu ghi lại thông báo thông tin về việc ghi thành công bị bỏ qua vì thông tin phiên bản do mô-đun cung cấp không đáp ứng bộ lọc
- Yêu cầu ghi thông báo lỗi về việc không thể ghi dữ liệu được xử lý khi cấp độ ghi của thông báo đáp ứng bộ lọc
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ý Python
Cá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ý. trình bày cách sử dụng các phương pháp 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ện
Khá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. 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 ngày và nhật ký để xây dựng các phiên bản
# note that the log_format directly below is a single line log_format mycombined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'server_port'; access_log /var/log/nginx/access.log mycombinedplus;6. 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ý
- 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 message
19 định dạng yêu cầu nhật ký bằng INFO và nhật ký mức ghi nhật ký cao hơn thông qua 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 message
20 và đưa mục nhập nhật ký kết quả vào luồng lỗi tiêu chuẩn. Khóa2021-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
21 được chuyển dưới dạng đối số từ khóa cho hàm tạo2021-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
01.
Giá trị của khóa2021-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
21 minh họa cách truy cập các đối tượng bên ngoài cấu hình. Chuỗi tiền tố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
24 đề cập đến đối tượng có thể truy cập được khi chuỗi không có phần mở rộng. // tiền tố [i. e. , hệ thống. stderr] được xử lý thông qua cơ chế nhập thông thường. Tham khảo để biết thêm chi tiết. Tham khảo để biết chi tiết về một cơ chế tương tự dựa trên tiền tố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
25 để chỉ các đối tượng bên trong một cấu hình. - Trình xử lý cảnh báo định dạng các yêu cầu nhật ký LỖI và NGHIÊM TÚC thông qua 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 message
26 và gửi mục nhập nhật ký kết quả qua email đến các địa chỉ email đã cho. Các khóa2021-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
27,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
28,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
29 và chủ đề được chuyển dưới dạng đối số từ khóa cho hàm tạo của2021-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
30
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 thiết bị 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 để 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 trình ghi nhật ký 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áy
Lượ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 để biết thêm chi tiết
Cấu hình bằng Configparse-Format Files
Thư 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