Python tạo lớp ghi nhật ký tùy chỉnh

Bất kỳ mã nào chỉ có thể đọc được khi nó được viết với nhận xét thích hợp. Bạn có đồng ý không? Đã nói rằng nhiệm vụ của nhà phát triển không chỉ dừng lại ở việc viết mã. Yếu tố bảo trì khởi động ngay sau khi mã được đưa vào sản xuất. Mã của bạn có thể bảo trì được nếu nó trả lời các câu hỏi sau

Show
  • 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?

Python tạo lớp ghi nhật ký tùy chỉnh
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

Python tạo lớp ghi nhật ký tùy chỉnh
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

Python tạo lớp ghi nhật ký tùy chỉnh
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

image2

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

python logging module diagram

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 <
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
50. Vì đây là một API cũ hơn không cung cấp tất cả các chức năng mà lược đồ cấu hình dựa trên từ điển cung cấp, nên bạn nên sử dụng hàm
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
51;

Định cấu hình qua dây

Mặc dù các API trên có thể được sử dụng để cập nhật cấu hình ghi nhật ký khi ứng dụng khách đang chạy (e. g. , dịch vụ web), lập trình các cơ chế cập nhật như vậy từ đầu có thể cồng kềnh. Hàm

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
54 giúp giải quyết vấn đề này. Chức năng này khởi động máy chủ ổ cắm chấp nhận cấu hình mới qua dây và tải chúng thông qua chức năng
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
51 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
52. Tham khảo
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
57 để biết thêm chi tiết

Đang tải và lưu trữ cấu hình

Vì cấu hình được cung cấp cho

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
51 chỉ là một tập hợp các từ điển lồng nhau nên cấu hình ghi nhật ký có thể dễ dàng được trình bày ở định dạng JSON và YAML. Do đó, các chương trình có thể sử dụng mô-đun
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
59 trong thư viện chuẩn của Python hoặc thư viện xử lý YAML bên ngoài để đọc và ghi cấu hình ghi nhật ký từ tệp

Ví dụ: đoạn mã sau đủ để tải cấu hình ghi nhật ký được lưu trữ ở định dạng JSON

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
3

Hạn chế

Trong sơ đồ cấu hình được hỗ trợ, chúng tôi không thể định cấu hình bộ lọc để lọc ngoài tính năng lọc dựa trên tên đơn giản. Ví dụ: chúng tôi không thể tạo bộ lọc chỉ chấp nhận các yêu cầu nhật ký được tạo từ 6 giờ chiều đến 6 giờ sáng. Chúng tôi cần lập trình các bộ lọc như vậy bằng Python và thêm chúng vào trình ghi nhật ký và trình xử lý thông qua các hàm xuất xưởng hoặc phương thức

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
60

Ghi nhật ký Python Thực hành tốt và Gotchas

Trong phần này, chúng tôi sẽ liệt kê một vài thực tiễn tốt và các vấn đề liên quan đến thư viện ghi nhật ký. Danh sách này bắt nguồn từ kinh nghiệm của chúng tôi và chúng tôi dự định danh sách này sẽ bổ sung cho thông tin mở rộng có sẵn trong phần Ghi nhật ký HOWTO và Ghi nhật ký sách dạy nấu ăn trong tài liệu của Python

Vì không có viên đạn bạc nào nên tất cả các phương pháp hay và vấn đề đều có ngoại lệ hầu như luôn phù hợp với ngữ cảnh. Vì vậy, trước khi sử dụng các phương pháp hay và vấn đề cần lưu ý sau đây, hãy xem xét khả năng áp dụng của chúng trong ngữ cảnh ứng dụng của bạn và xác định xem chúng có phù hợp trong ngữ cảnh ứng dụng của bạn không

Tạo logger bằng chức năng getlogger

Hàm nhà máy

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
61 giúp thư viện quản lý ánh xạ từ tên trình ghi nhật ký sang phiên bản trình ghi nhật ký và duy trì hệ thống phân cấp trình ghi nhật ký. Đổi lại, ánh xạ và hệ thống phân cấp này mang lại những lợi ích sau

  1. Khách hàng có thể sử dụng chức năng
    logging.getLogger(“coralogix”)
    
    logging.getLogger(“coralogix.database”)
    
    logging.getLogger(“coralogix.client”)
    9 để truy cập cùng một bộ ghi trong các phần khác nhau của chương trình bằng cách chỉ truy xuất bộ ghi theo tên của nó
  2. Chỉ có một số lượng hữu hạn các logger được tạo trong thời gian chạy (trong trường hợp bình thường)
  3. Yêu cầu nhật ký có thể được truyền lên hệ thống phân cấp logger
  4. Khi không được chỉ định, ngưỡng ghi nhật ký
    2021-07-02 13:00:08,743 DEBUG Debug message
    
    2021-07-02 13:00:08,743 INFO Informative message
    
    2021-07-02 13:00:08,743 ERROR Error message
    31 của bộ ghi nhật ký có thể được suy ra từ các phần tử tăng dần của nó
  5. Cấu hình của thư viện ghi nhật ký có thể được cập nhật trong thời gian chạy bằng cách chỉ dựa vào tên trình ghi nhật ký

Sử dụng chức năng cấp độ ghi nhật ký

Sử dụng hàm _______364 hoặc các phương thức _______365 để ghi nhật ký ở các mức ghi nhật ký được xác định trước

Bên cạnh việc làm cho mã ngắn hơn một chút, việc sử dụng các hàm/phương thức này giúp phân chia các câu lệnh ghi nhật ký trong một chương trình thành hai bộ

  1. Những người đưa ra yêu cầu nhật ký với các mức ghi nhật ký được xác định trước
  2. Những người đưa ra yêu cầu nhật ký với các mức ghi nhật ký tùy chỉnh

Sử dụng các mức ghi nhật ký được xác định trước

Như được mô tả trong phần Cấp độ ghi nhật ký trong chương Khái niệm và API, các cấp độ ghi nhật ký được xác định trước do thư viện cung cấp nắm bắt hầu hết tất cả các tình huống ghi nhật ký xảy ra trong các chương trình. Hơn nữa, vì hầu hết các nhà phát triển đều quen thuộc với các mức ghi nhật ký được xác định trước (vì hầu hết các thư viện ghi nhật ký trên các ngôn ngữ lập trình khác nhau đều cung cấp các mức rất giống nhau), việc sử dụng các mức được xác định trước có thể giúp giảm gánh nặng triển khai, cấu hình và bảo trì. Vì vậy, trừ khi được yêu cầu, hãy sử dụng các mức ghi nhật ký được xác định trước

Tạo trình ghi nhật ký cấp mô-đun

Trong khi tạo logger, chúng ta có thể tạo logger cho từng lớp hoặc tạo logger cho từng mô-đun. Mặc dù tùy chọn đầu tiên cho phép cấu hình chi tiết, nhưng nó dẫn đến nhiều bộ ghi nhật ký hơn trong một chương trình, tôi. e. , mỗi lớp một. Ngược lại, tùy chọn thứ hai có thể giúp giảm số lượng bộ ghi trong một chương trình. Vì vậy, trừ khi cấu hình chi tiết như vậy là cần thiết, hãy tạo bộ ghi nhật ký cấp mô-đun

Đặt tên cho bộ ghi cấp mô-đun với tên của các mô-đun tương ứng

Vì tên logger là các giá trị chuỗi không thuộc vùng tên của chương trình Python nên chúng sẽ không xung đột với tên mô-đun. Do đó, hãy sử dụng tên của một mô-đun làm tên của bộ ghi cấp độ mô-đun tương ứng. Với cách đặt tên này, việc đặt tên bộ ghi nhật ký cõng trên cách đặt tên mô-đun dựa trên ký hiệu dấu chấm và do đó, đơn giản hóa việc tham khảo bộ ghi nhật ký

sử dụng ghi nhật ký. LoggerAdatper để thêm thông tin theo ngữ cảnh cục bộ

Như đã minh họa trong Đoạn 4, chúng ta có thể sử dụng

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
12 để đưa thông tin theo ngữ cảnh vào bản ghi nhật ký.
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
14 cũng có thể được sử dụng để sửa đổi thông điệp tường trình và dữ liệu nhật ký được cung cấp như một phần của yêu cầu nhật ký

Vì thư viện ghi nhật ký không quản lý các bộ điều hợp này nên không thể truy cập chúng thông qua tên chung. Vì lý do này, hãy sử dụng chúng để đưa thông tin theo ngữ cảnh cục bộ vào một mô-đun hoặc một lớp

Sử dụng bộ lọc hoặc 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message68 để thêm thông tin theo ngữ cảnh toàn cầu

Có hai tùy chọn để đưa liền mạch thông tin theo ngữ cảnh toàn cầu (phổ biến trên một ứng dụng) vào các bản ghi nhật ký

Tùy chọn đầu tiên là sử dụng hỗ trợ bộ lọc để sửa đổi các đối số bản ghi nhật ký được cung cấp cho các bộ lọc. Ví dụ: bộ lọc sau đưa thông tin phiên bản vào các bản ghi nhật ký đến

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
4

Có hai nhược điểm đối với tùy chọn này. Đầu tiên, nếu các bộ lọc phụ thuộc vào dữ liệu trong bản ghi nhật ký, thì các bộ lọc đưa dữ liệu vào bản ghi nhật ký sẽ được thực thi trước các bộ lọc sử dụng dữ liệu được đưa vào. Do đó, thứ tự các bộ lọc được thêm vào bộ ghi và trình xử lý trở nên quan trọng. Thứ hai, tùy chọn “lạm dụng” hỗ trợ lọc bản ghi nhật ký để mở rộng bản ghi nhật ký

Tùy chọn thứ hai là khởi tạo thư viện ghi nhật ký với chức năng tạo bản ghi nhật ký thông qua

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
69. Vì thông tin theo ngữ cảnh được đưa vào là toàn cầu nên nó có thể được đưa vào các bản ghi nhật ký khi chúng được tạo trong hàm
logging.getLogger(“coralogix”)

logging.getLogger(“coralogix.database”)

logging.getLogger(“coralogix.client”)
9 và đảm bảo dữ liệu sẽ có sẵn cho mọi bộ lọc, trình định dạng, trình ghi nhật ký và trình xử lý trong chương trình

Nhược điểm của tùy chọn này là chúng ta phải đảm bảo các hàm

logging.getLogger(“coralogix”)

logging.getLogger(“coralogix.database”)

logging.getLogger(“coralogix.client”)
9 được đóng góp bởi các thành phần khác nhau trong một chương trình hoạt động tốt với nhau. Mặc dù các chức năng của nhà máy ghi nhật ký có thể được xâu chuỗi, nhưng việc xâu chuỗi như vậy làm tăng độ phức tạp của chương trình

Sử dụng phương pháp dựa trên dữ liệu để định cấu hình thư viện ghi nhật ký

Nếu chương trình của bạn liên quan đến nhiều mô-đun và có thể là các thành phần của bên thứ ba, thì hãy sử dụng phương pháp dựa trên dữ liệu được mô tả trong chương Cấu hình để định cấu hình thư viện ghi nhật ký

Đính kèm các trình xử lý chung vào bộ ghi nhật ký ở cấp cao hơn trong hệ thống phân cấp bộ ghi

Nếu một trình xử lý là chung cho hai trình ghi nhật ký, trong đó một trình ghi nhật ký là con cháu của trình ghi nhật ký kia, thì hãy đính kèm trình xử lý đó với trình ghi nhật ký tăng dần và dựa vào thư viện ghi nhật ký để truyền các yêu cầu nhật ký từ trình ghi nhật ký kế thừa sang trình xử lý của trình ghi nhật ký tăng dần. Nếu thuộc tính

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
72 của trình ghi nhật ký chưa được sửa đổi, mẫu này sẽ giúp tránh các thông báo trùng lặp

Sử dụng hàm 2021-07-02 13:00:08,743 DEBUG Debug message 2021-07-02 13:00:08,743 INFO Informative message 2021-07-02 13:00:08,743 ERROR Error message73 để chặn quá trình xử lý các yêu cầu nhật ký dưới một mức ghi nhật ký nhất định trên tất cả các trình ghi nhật ký

Trình ghi nhật ký xử lý yêu cầu nhật ký nếu mức ghi nhật ký của yêu cầu nhật ký ít nhất cao bằng mức ghi nhật ký hiệu quả của trình ghi nhật ký. Cấp độ ghi nhật ký hiệu quả của người ghi nhật ký là cấp độ cao hơn trong hai cấp độ ghi nhật ký. mức ghi ngưỡng của trình ghi và mức ghi toàn bộ thư viện. Chúng tôi có thể đặt mức ghi nhật ký trên toàn thư viện thông qua hàm

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
74. Theo mặc định, mức ghi toàn bộ thư viện là 0, i. e. , các yêu cầu nhật ký của mọi cấp độ ghi sẽ được xử lý

Khi sử dụng chức năng này, chúng tôi có thể điều chỉnh đầu ra ghi nhật ký của một ứng dụng bằng cách tăng cấp độ ghi nhật ký trên toàn bộ ứng dụng

Điều gì về bộ nhớ đệm tham chiếu đến logger?

Trước khi chuyển sang vấn đề cần giải quyết, chúng ta hãy xem xét lợi ích của phương pháp phổ biến trong việc lưu vào bộ nhớ đệm các tham chiếu tới trình ghi nhật ký và truy cập trình ghi nhật ký thông qua các tham chiếu được lưu trong bộ nhớ cache, ví dụ:. g. , đây là cách thuộc tính _______375 được sử dụng trong các đoạn mã trước

Mẫu mã hóa này tránh các lệnh gọi lặp lại của hàm

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
61 để truy xuất cùng một bộ ghi cấp mô-đun; . Tuy nhiên, việc loại bỏ như vậy có thể dẫn đến yêu cầu nhật ký bị mất nếu việc truy xuất không dư thừa. Ví dụ: giả sử cấu hình thư viện ghi nhật ký trong một dịch vụ web hoạt động lâu dài được cập nhật với tùy chọn
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
77 này. Vì một bản cập nhật như vậy sẽ vô hiệu hóa bộ ghi nhật ký được lưu trong bộ nhớ cache, nên không có câu lệnh ghi nhật ký nào sử dụng bộ ghi nhật ký được lưu trong bộ nhớ cache sẽ ghi lại bất kỳ yêu cầu nào. Mặc dù chúng ta có thể khắc phục tình trạng này bằng cách cập nhật các tham chiếu đã lưu vào bộ nhớ cache cho trình ghi nhật ký, nhưng một giải pháp đơn giản hơn sẽ là sử dụng hàm
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
61 thay vì lưu các tham chiếu vào bộ nhớ đệm

Nói tóm lại, việc lưu trữ các tham chiếu vào bộ ghi nhật ký không phải lúc nào cũng là một cách thực hành tốt. Vì vậy, hãy xem xét bối cảnh của chương trình trong khi quyết định lưu trữ các tham chiếu vào bộ ghi nhật ký

Xử lý sự cố

Bộ lọc thất bại

Khi thư viện ghi nhật ký gọi các bộ lọc được liên kết với trình xử lý và trình ghi nhật ký, thư viện giả định rằng các bộ lọc sẽ luôn thực thi cho đến khi hoàn thành, tôi. e. , không thất bại về lỗi. Vì vậy, không có logic xử lý lỗi nào trong thư viện để xử lý các bộ lọc bị lỗi. Do đó, khi bộ lọc không thành công (thực thi đến khi hoàn thành), yêu cầu nhật ký tương ứng sẽ không được ghi lại

Đảm bảo các bộ lọc sẽ thực thi đến khi hoàn thành. Hơn nữa, khi sử dụng các bộ lọc tùy chỉnh và sử dụng dữ liệu bổ sung trong quá trình lọc

Trình định dạng không thành công

Thư viện ghi nhật ký đưa ra một giả định tương tự về các trình định dạng, tôi. e. , trình định dạng sẽ luôn thực thi cho đến khi hoàn thành. Do đó, khi một trình định dạng không thể thực thi đến khi hoàn thành, yêu cầu nhật ký tương ứng sẽ không được ghi lại

Đảm bảo các trình định dạng sẽ thực thi đến khi hoàn thành

Các khóa bắt buộc bị thiếu là đối số $ uwsgi --log-syslog=yourapp …6

Nếu bộ lọc/bộ định dạng tham chiếu đến các khóa của đối số

    $ uwsgi --log-syslog=yourapp …
6 được cung cấp như một phần của phương pháp ghi nhật ký, thì bộ lọc/bộ định dạng có thể bị lỗi khi đối số
    $ uwsgi --log-syslog=yourapp …
6 không cung cấp khóa
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
82

Đảm bảo mọi khóa của đối số

    $ uwsgi --log-syslog=yourapp …
6 được sử dụng trong bộ lọc hoặc bộ định dạng đều có sẵn trong mọi câu lệnh ghi nhật ký kích hoạt

Các khóa trong đối số $ uwsgi --log-syslog=yourapp …6 xung đột với các thuộc tính bắt buộc

Thư viện ghi nhật ký thêm các khóa của đối số

    $ uwsgi --log-syslog=yourapp …
6 (vào các phương thức ghi nhật ký khác nhau) làm thuộc tính cho các bản ghi nhật ký. Tuy nhiên, nếu
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
86 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
87 là các khóa trong đối số
    $ uwsgi --log-syslog=yourapp …
6, thì việc tạo bản ghi nhật ký sẽ không thành công và yêu cầu nhật ký tương ứng sẽ không được ghi lại

Lỗi tương tự xảy ra nếu

    $ uwsgi --log-syslog=yourapp …
2,
    $ uwsgi --log-syslog=yourapp …
3,
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
91,
    $ uwsgi --log-syslog=yourapp …
1,
  'handlers': {

    'stderr': {

        'level': 'INFO',

        'class': 'logging.StreamHandler',

        'formatter': 'your_formatter',

      },

    },
2 hoặc
2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
94 xảy ra dưới dạng các khóa trong đối số
    $ uwsgi --log-syslog=yourapp …
6;

Đảm bảo

2021-07-02 13:00:08,743 DEBUG Debug message

2021-07-02 13:00:08,743 INFO Informative message

2021-07-02 13:00:08,743 ERROR Error message
86,
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
87 và một số thuộc tính nhất định của
    $ uwsgi --log-syslog=yourapp …
8 không xuất hiện dưới dạng khóa trong đối số
    $ uwsgi --log-syslog=yourapp …
6 của phương pháp ghi nhật ký

Các thư viện sử dụng mức ghi nhật ký tùy chỉnh được kết hợp

Khi một chương trình và các thư viện phụ thuộc của nó sử dụng thư viện ghi nhật ký, các yêu cầu ghi nhật ký của chúng được kết hợp bởi thư viện ghi nhật ký cơ sở phục vụ các yêu cầu này. Trong trường hợp này, nếu các thành phần của chương trình sử dụng các mức ghi nhật ký tùy chỉnh không nhất quán lẫn nhau, thì kết quả ghi nhật ký có thể không dự đoán được

Không sử dụng các mức ghi nhật ký tùy chỉnh, cụ thể là trong thư viện

Bộ lọc của logger tổ tiên không kích hoạt

Theo mặc định, các yêu cầu nhật ký được truyền lên hệ thống phân cấp trình ghi nhật ký để được xử lý bởi trình xử lý của trình ghi nhật ký tổ tiên. Trong khi các bộ lọc của trình xử lý xử lý các yêu cầu nhật ký đó, thì các bộ lọc của các trình ghi nhật ký tương ứng không xử lý các yêu cầu nhật ký đó

Để áp dụng bộ lọc cho tất cả các yêu cầu nhật ký được gửi tới bộ ghi, hãy thêm bộ lọc vào bộ ghi

Id của trình xử lý/bộ lọc/bộ định dạng xung đột

Nếu nhiều trình xử lý chia sẻ cùng một id trình xử lý trong một cấu hình, thì id trình xử lý đó đề cập đến trình xử lý được tạo cuối cùng khi cấu hình được xử lý. Điều tương tự cũng xảy ra giữa các bộ lọc và trình định dạng chia sẻ id

Khi máy khách kết thúc, thư viện ghi nhật ký sẽ thực thi logic dọn dẹp của trình xử lý được liên kết với từng id trình xử lý. Vì vậy, nếu nhiều trình xử lý có cùng id trong một cấu hình, thì logic dọn dẹp của tất cả trừ trình xử lý được tạo cuối cùng sẽ không được thực thi và do đó, dẫn đến rò rỉ tài nguyên

Sử dụng id duy nhất cho các đối tượng thuộc loại trong cấu hình

Hiệu suất ghi nhật ký Python

Mặc dù các câu lệnh ghi nhật ký giúp nắm bắt thông tin tại các vị trí trong chương trình, nhưng chúng góp phần vào chi phí của chương trình về thời gian thực hiện (e. g. , ghi nhật ký trong các vòng lặp) và lưu trữ (e. g. , ghi nhiều dữ liệu). Mặc dù việc ghi nhật ký miễn phí nhưng hữu ích là không thể, nhưng chúng ta có thể giảm chi phí ghi nhật ký bằng cách đưa ra các lựa chọn dựa trên các cân nhắc về hiệu suất

Cân nhắc dựa trên cấu hình

Sau khi thêm các câu lệnh ghi nhật ký vào chương trình, chúng ta có thể sử dụng hỗ trợ để định cấu hình ghi nhật ký (được mô tả trước đó) để kiểm soát việc thực thi các câu lệnh ghi nhật ký và thời gian thực hiện liên quan. Cụ thể, hãy xem xét các khả năng cấu hình sau khi đưa ra quyết định về hiệu suất liên quan đến ghi nhật ký

  1. Thay đổi cấp độ ghi nhật ký của logger. Thay đổi này giúp ngăn chặn các thông báo nhật ký dưới một mức nhật ký nhất định. Điều này giúp giảm chi phí thực thi liên quan đến việc tạo bản ghi nhật ký không cần thiết
  2. Thay đổi trình xử lý. Thay đổi này giúp thay thế các trình xử lý chậm hơn bằng các trình xử lý nhanh hơn (e. g. , trong quá trình thử nghiệm, hãy sử dụng trình xử lý tạm thời thay vì trình xử lý liên tục) và thậm chí xóa các trình xử lý không liên quan đến ngữ cảnh. Điều này làm giảm chi phí thực thi liên quan đến việc xử lý các bản ghi nhật ký không cần thiết
  3. Thay đổi định dạng. Thay đổi này giúp loại trừ các phần không cần thiết của bản ghi nhật ký khỏi nhật ký (e. g. , loại trừ địa chỉ IP khi thực thi trong cài đặt một nút). Điều này làm giảm chi phí thực thi liên quan đến việc xử lý không cần thiết các phần của bản ghi nhật ký

Ở trên thay đổi phạm vi từ các khía cạnh thô hơn sang tốt hơn của hỗ trợ ghi nhật ký trong Python

Cân nhắc dựa trên mã

Mặc dù hỗ trợ cấu hình ghi nhật ký rất mạnh, nhưng nó không thể giúp kiểm soát tác động hiệu suất của các lựa chọn triển khai được đưa vào mã nguồn. Dưới đây là một số lựa chọn triển khai liên quan đến ghi nhật ký như vậy và lý do tại sao bạn nên xem xét chúng khi đưa ra quyết định về hiệu suất liên quan đến ghi nhật ký

Không thực hiện báo cáo ghi nhật ký không hoạt động

Khi thêm mô-đun ghi nhật ký vào thư viện chuẩn của Python, đã có những lo ngại về chi phí thực thi liên quan đến các câu lệnh ghi nhật ký không hoạt động — các câu lệnh ghi nhật ký đưa ra các yêu cầu ghi nhật ký với mức ghi nhật ký thấp hơn ngưỡng ghi nhật ký của trình ghi mục tiêu. Ví dụ: một câu lệnh ghi nhật ký gọi

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
01 sẽ thêm bao nhiêu thời gian vào thời gian thực thi của chương trình khi mức ghi nhật ký ngưỡng của trình ghi nhật ký là
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
02?

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
5

Ngày nay, mối lo ngại này không còn hợp lệ vì các phương thức ghi nhật ký trong lớp

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
03 thực hiện các kiểm tra tương tự và chỉ xử lý yêu cầu nhật ký nếu kiểm tra vượt qua. Ví dụ: như được hiển thị bên dưới, việc kiểm tra trên được thực hiện theo phương pháp
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
04

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
6

Do đó, các câu lệnh ghi nhật ký không hoạt động sẽ biến thành các câu lệnh không hoạt động một cách hiệu quả và không đóng góp vào chi phí thực thi chương trình

Mặc dù vậy, người ta nên xem xét hai khía cạnh sau khi thêm báo cáo ghi nhật ký

  1. Mỗi lần gọi phương thức ghi nhật ký phát sinh một chi phí nhỏ liên quan đến việc gọi phương thức ghi nhật ký và kiểm tra để xác định xem yêu cầu ghi nhật ký có nên tiếp tục hay không, ví dụ:. g. , một triệu yêu cầu của
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    01 khi mức ghi ngưỡng của trình ghi nhật ký là
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    02 mất nửa giây trên máy tính xách tay thông thường. Vì vậy, trong khi chi phí của một câu lệnh ghi nhật ký không hoạt động là nhỏ, thì tổng chi phí thực hiện của nhiều câu lệnh ghi nhật ký không hoạt động có thể nhanh chóng cộng lại là không hề nhỏ
  2. Mặc dù việc vô hiệu hóa câu lệnh ghi nhật ký ngăn cản quá trình xử lý yêu cầu nhật ký, nhưng nó không ngăn cản việc tính toán/tạo đối số cho câu lệnh ghi nhật ký. Vì vậy, nếu những tính toán/sáng tạo như vậy tốn kém, thì chúng có thể đóng góp không hề nhỏ vào chi phí thực hiện chương trình ngay cả khi câu lệnh ghi nhật ký tương ứng không hoạt động

Đừng háo hức xây dựng thông báo tường trình

Khách hàng có thể xây dựng thông điệp tường trình theo hai cách. háo hức và lười biếng

  1. Máy khách xây dựng thông điệp tường trình và chuyển nó tới 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, e. g. ,
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    08.
    Phương pháp này cung cấp tính linh hoạt về định dạng thông qua phương thức
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    09 và phương pháp
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    10, nhưng nó liên quan đến việc xây dựng các thông điệp tường trình một cách háo hức, tôi. e. , trước khi báo cáo ghi nhật ký được coi là hoạt động.
  2. Ứng dụng khách cung cấp chuỗi định dạng thông báo kiểu
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    11 (dưới dạng đối số
        $ uwsgi --log-syslog=yourapp …
    1) và các giá trị (dưới dạng đối số
        $ uwsgi --log-syslog=yourapp …
    2) để xây dựng thông báo nhật ký cho phương thức ghi nhật ký, e. g. ,
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    14. Sau khi câu lệnh ghi nhật ký được coi là hoạt động, trình ghi nhật ký sẽ xây dựng thông báo nhật ký bằng cách sử dụng toán tử định dạng chuỗi
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    15.
    Cách tiếp cận này dựa trên tính năng định dạng chuỗi cũ và kỳ quặc của Python nhưng nó liên quan đến việc xây dựng các thông điệp tường trình một cách lười biếng.

Mặc dù cả hai cách tiếp cận đều dẫn đến cùng một kết quả, nhưng chúng thể hiện các đặc điểm hiệu suất khác nhau do sự háo hức và lười biếng của việc xây dựng thông điệp

Ví dụ: trên máy tính xách tay thông thường, một triệu lệnh gọi không hoạt động của

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
16 mất 2197 mili giây trong khi một triệu lệnh gọi không hoạt động của
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
17 mất 1111 mili giây khi
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
18 là danh sách bốn số nguyên. Trong trường hợp có một triệu yêu cầu đang hoạt động, cách tiếp cận đầu tiên mất 11061 mili giây và cách tiếp cận thứ hai mất 10149 mili giây. Tiết kiệm 9–50% thời gian ghi nhật ký

Vì vậy, cách tiếp cận thứ hai (lười biếng) hiệu quả hơn cách tiếp cận thứ nhất (háo hức) trong trường hợp cả báo cáo ghi nhật ký không hoạt động và hoạt động. Hơn nữa, lợi ích sẽ lớn hơn khi việc xây dựng thông báo không tầm thường, e. g. , sử dụng nhiều đối số, chuyển đổi các đối số phức tạp thành chuỗi

Không thu thập thông tin ngầm không cần thiết

Theo mặc định, khi bản ghi nhật ký được tạo, dữ liệu sau sẽ được ghi lại trong bản ghi nhật ký

  1. Định danh của quy trình hiện tại
  2. Định danh và tên của chủ đề hiện tại
  3. Tên của quy trình hiện tại trong khung đa xử lý
  4. Tên tệp, số dòng, tên hàm và thông tin ngăn xếp cuộc gọi của câu lệnh ghi nhật ký

Trừ khi các bit dữ liệu này được ghi lại, việc thu thập chúng sẽ làm tăng chi phí thực thi một cách không cần thiết. Vì vậy, nếu các bit dữ liệu này sẽ không được ghi lại, thì hãy định cấu hình khung ghi nhật ký để không thu thập chúng bằng cách đặt các cờ sau

  1. import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    19
  2. import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    20
  3. import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    21
  4. import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    22

Không chặn luồng thực thi chính

Có những tình huống mà chúng tôi có thể muốn ghi dữ liệu trong luồng thực thi chính mà không mất hầu hết thời gian để ghi dữ liệu. Những tình huống như vậy là phổ biến trong các dịch vụ web, e. g. , một luồng xử lý yêu cầu cần ghi nhật ký các yêu cầu web đến mà không làm tăng đáng kể thời gian phản hồi của nó. Chúng ta có thể giải quyết những tình huống này bằng cách tách mối quan tâm giữa các chủ đề. một máy khách/luồng chính tạo một bản ghi nhật ký trong khi một luồng ghi nhật ký ghi lại bản ghi. Vì tác vụ ghi nhật ký thường chậm hơn vì nó liên quan đến các tài nguyên chậm hơn (e. g. , lưu trữ thứ cấp) hoặc các dịch vụ khác (e. g. , logging services such as Coralogix, pub-sub systems such as Kafka), this separation of concerns helps minimize the effort of logging on the execution time of the main/client thread

Thư viện ghi nhật ký Python giúp xử lý các tình huống như vậy thông qua các lớp

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
23 và
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
24 như sau

  1. Một cặp phiên bản
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    25 và
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    26 được khởi tạo với một hàng đợi
  2. Khi phiên bản
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    25 nhận được một bản ghi nhật ký từ ứng dụng khách, nó chỉ đặt yêu cầu nhật ký vào hàng đợi của nó trong khi thực thi trong chuỗi của ứng dụng khách. Với tính đơn giản của nhiệm vụ được thực hiện bởi
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    25, luồng máy khách hầu như không tạm dừng
  3. Khi một bản ghi nhật ký có sẵn trong hàng đợi
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.debug('This is a log message.')
    26, người nghe truy xuất bản ghi nhật ký và thực thi các trình xử lý đã đăng ký với người nghe để xử lý bản ghi nhật ký. Về mặt thực thi, trình xử lý đã đăng ký và trình xử lý đã đăng ký thực thi trong một luồng chuyên dụng khác với luồng máy khách

Ghi chú. Mặc dù

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
26 đi kèm với một chiến lược phân luồng mặc định, nhưng các nhà phát triển không bắt buộc phải sử dụng chiến lược này để sử dụng
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
25. Thay vào đó, các nhà phát triển có thể sử dụng các chiến lược phân luồng thay thế đáp ứng nhu cầu của họ

Đó là kết thúc nó cho hướng dẫn ghi nhật ký Python này. Nếu bạn đang tìm kiếm một giải pháp quản lý nhật ký để tập trung nhật ký Python của mình, hãy xem tích hợp Python dễ cấu hình của chúng tôi