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

  • Mã của bạn có thể mở rộng được không?
  • Mã của bạn có thể đọc được không?
  • Mã của bạn có thể gỡ lỗi được không?

nguồn hình ảnh. Google

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. Google

Mộ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ém

Logger Factory trong Python

Vậy chúng ta có gì ở đây nào?

  1. Lớp Logger Factory
  2. Các lớp mô-đun nơi bạn sử dụng chúng

LoggerFactory

Chú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ắt

Tạ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ý 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 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ý 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 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

  1. PHÊ BÌNH
  2. LỖI
  3. CẢNH BÁO
  4. THÔNG TIN
  5. 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

________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ý 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]

  1. 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
  2. Để 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
  3. 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
  4. 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 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 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?

  1. 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
  2. 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
  3. 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 chức nă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
  4. 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
  5. Phê bình. 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 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ưỡ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 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ý 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 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

  1. 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 để biểu thị 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 ghi lại 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
  2. 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ường
    access_log /var/log/nginx/access.log;
    2 theo mặc định

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ý 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. , 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ý Python

Trì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 message
00. 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 message
01 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 message
02 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 message
01 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 message
04. 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ý 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 message
0

Đoạn mã này thực hiện như sau

  1. Tạo một trình ghi nhật ký có tên là 'ứng dụng'
  2. Đặt mức ghi ngưỡng của thiết bị ghi thành INFO
  3. 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
  4. Đặt ngưỡng ghi nhật ký của trình xử lý thành INFO
  5. 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 tường trình
  6. Đặt trình định dạng đã tạo làm trình định dạng của trình xử lý
  7. 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 message
1

Đ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 message
06 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 message
2

Đ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 message
07. 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 message
08 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 message
09. 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 message
08 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 message
3

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 message
4

Đ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 message
5

Đoạn mã này sửa đổi Đoạn mã 1 như sau

  1. 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
  2. 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 message
13 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 message
6

Đ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 message
14 để 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

  1. 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
  2. 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
  3. 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ý. Đ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ệ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 message
15. Đố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 message
16 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 message
17

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
7

Đ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 message
8

Đ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 message
9

Đ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ạ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
    20 và đưa mục nhập nhật ký kết quả vào luồng lỗi tiêu chuẩn. 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 message
    21 được chuyển dưới dạng đối số từ khóa cho hàm tạ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 message
    01.
    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 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 Truy cập vào đối tượng bên ngoài để biết thêm chi tiết. Tham khảo Truy cập vào các đối tượng bên trong để 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ó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 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ủ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 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 message
31 [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 message
32 [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 message
33 [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 message
34 [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 message
35 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 message
36 . 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 message
35 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 message
36 

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 message
40. 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 message
40, 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 message
16 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 message
43 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 message
45 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 message
46 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 message
48 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 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 message
49 thông qua hàm

Chủ Đề