Hướng dẫn how to create log file in python - cách tạo tệp nhật ký trong python
Đăng nhập vào Python rất hiệu quả và dễ sử dụng. Bạn chỉ cần xác định mô -đun Python để ghi nhật ký bằng mô -đun ghi nhật ký nội bộ Python. Bạn có thể xác định bao nhiêu logger tùy thích. Bạn cũng có thể định cấu hình nó để in đầu ra vào bảng điều khiển cũng như ghi vào một tệp. Ngoài ra, bạn có thể xác định một trình xử lý tệp xoay sẽ thực hiện xoay vòng nhật ký cũng giúp trong tự động hóa xoay vòng. Dưới đây là đoạn trích xác định trực tiếp và gọi logger trong bất kỳ mô -đun Python nào. Show
Khi bạn đã xác định tệp này (giả sử logger_sinstall.py), bạn có thể nhập nó ở bất cứ đâu và sử dụng.
Hy vọng điều này giúp đỡ. Cảm ơn Vinay Sajip Hướng dẫn ghi nhật ký cơ bảnGhi nhật ký là một phương tiện để theo dõi các sự kiện xảy ra khi một số phần mềm chạy. Nhà phát triển phần mềm bổ sung các cuộc gọi đăng nhập vào mã của họ để chỉ ra rằng một số sự kiện đã xảy ra. Một sự kiện được mô tả bởi một thông điệp mô tả có thể tùy chọn chứa dữ liệu biến (nghĩa là dữ liệu có khả năng khác nhau cho mỗi lần xuất hiện của sự kiện). Các sự kiện cũng có tầm quan trọng mà nhà phát triển gán cho sự kiện này; Tầm quan trọng cũng có thể được gọi là mức độ hoặc mức độ nghiêm trọng. Khi nào nên sử dụng Logging¶Ghi nhật ký cung cấp một tập hợp các chức năng tiện lợi để sử dụng ghi nhật ký đơn giản. Đây là import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')0, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')1, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')2, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')3 và import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')4. Để xác định khi nào nên sử dụng ghi nhật ký, hãy xem bảng bên dưới, trong đó, cho mỗi tập hợp các nhiệm vụ phổ biến, công cụ tốt nhất để sử dụng cho nó.
Các chức năng ghi nhật ký được đặt tên theo mức độ hoặc mức độ nghiêm trọng của các sự kiện mà chúng được sử dụng để theo dõi. Các mức tiêu chuẩn và khả năng ứng dụng của chúng được mô tả dưới đây (theo thứ tự ngày càng tăng của mức độ nghiêm trọng):
Mức mặc định là DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö5, có nghĩa là chỉ các sự kiện ở cấp độ này trở lên sẽ được theo dõi, trừ khi gói ghi nhật ký được cấu hình để làm khác. Các sự kiện được theo dõi có thể được xử lý theo những cách khác nhau. Cách đơn giản nhất để xử lý các sự kiện theo dõi là in chúng vào bảng điều khiển. Một cách phổ biến khác là viết chúng vào một tệp đĩa. Một ví dụ đơn giảnMột ví dụ rất đơn giản là: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything Nếu bạn nhập các dòng này vào một tập lệnh và chạy nó, bạn sẽ thấy: in ra trên bảng điều khiển. Thông báo DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö4 không xuất hiện vì mức mặc định là DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö5. Thông báo được in bao gồm dấu hiệu của cấp độ và mô tả về sự kiện được cung cấp trong cuộc gọi đăng nhập, tức là ‘xem ra! Bây giờ đừng lo lắng về phần root gốc: nó sẽ được giải thích sau. Đầu ra thực tế có thể được định dạng khá linh hoạt nếu bạn cần điều đó; Tùy chọn định dạng cũng sẽ được giải thích sau. Đăng nhập vào một tập tinMột tình huống rất phổ biến là ghi lại các sự kiện ghi nhật ký trong một tệp, vì vậy hãy để Lôi nhìn vào đó tiếp theo. Hãy chắc chắn thử những điều sau đây trong một phiên dịch viên Python mới bắt đầu và don lồng chỉ tiếp tục từ phiên được mô tả ở trên: import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö') Thay đổi trong phiên bản 3.9: Đối số mã hóa đã được thêm vào. Trong các phiên bản Python trước đó hoặc nếu không được chỉ định, mã hóa được sử dụng là giá trị mặc định được sử dụng bởi getattr(logging, loglevel.upper())1. While not shown in the above example, an errors argument can also now be passed, which determines how encoding errors are handled. For available values and the default, see the documentation for getattr(logging, loglevel.upper())1. Và bây giờ nếu chúng ta mở tệp và xem xét những gì chúng ta có, chúng ta nên tìm các thông báo nhật ký: DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö Ví dụ này cũng cho thấy cách bạn có thể đặt mức ghi nhật ký đóng vai trò là ngưỡng để theo dõi. Trong trường hợp này, vì chúng tôi đặt ngưỡng thành DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö3, tất cả các tin nhắn đã được in. Nếu bạn muốn đặt mức ghi nhật ký từ tùy chọn dòng lệnh như: Và bạn có giá trị của tham số được truyền cho getattr(logging, loglevel.upper())4 trong một số loglevel biến, bạn có thể sử dụng: getattr(logging, loglevel.upper()) Để có được giá trị mà bạn sẽ chuyển sang getattr(logging, loglevel.upper())5 thông qua đối số cấp độ. Bạn có thể muốn lỗi kiểm tra bất kỳ giá trị đầu vào người dùng nào, có lẽ như trong ví dụ sau: # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...) Cuộc gọi đến getattr(logging, loglevel.upper())5 sẽ đến trước mọi cuộc gọi đến import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')0, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')1, v.v. Nếu không, các chức năng đó sẽ gọi getattr(logging, loglevel.upper())5 cho bạn với các tùy chọn mặc định. Vì nó dự định là một cơ sở cấu hình đơn giản một lần, chỉ có cuộc gọi đầu tiên thực sự sẽ làm bất cứ điều gì: các cuộc gọi tiếp theo là không có hiệu quả. Nếu bạn chạy tập lệnh trên nhiều lần, các tin nhắn từ các lần chạy liên tiếp sẽ được thêm vào ví dụ tệp.log. Nếu bạn muốn mỗi lần chạy bắt đầu một lần nữa, không nhớ các tin nhắn từ các lần chạy trước đó, bạn có thể chỉ định đối số FILEMODE, bằng cách thay đổi cuộc gọi trong ví dụ trên thành: logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG) Đầu ra sẽ giống như trước đây, nhưng tệp nhật ký không còn được thêm vào, vì vậy các tin nhắn từ các lần chạy trước đó bị mất. Đăng nhập từ nhiều mô -đunNếu chương trình của bạn bao gồm nhiều mô -đun, thì đây là một ví dụ về cách bạn có thể sắp xếp đăng nhập vào đó: # myapp.py import logging import mylib def main(): logging.basicConfig(filename='myapp.log', level=logging.INFO) logging.info('Started') mylib.do_something() logging.info('Finished') if __name__ == '__main__': main() # mylib.py import logging def do_something(): logging.info('Doing something') Nếu bạn chạy myApp.py, bạn sẽ thấy điều này trong myApp.log: 0Đó là hy vọng những gì bạn đã mong đợi để xem. Bạn có thể khái quát điều này thành nhiều mô -đun, sử dụng mẫu trong mylib.py. Lưu ý rằng đối với mẫu sử dụng đơn giản này, bạn đã giành chiến thắng, bằng cách xem trong tệp nhật ký, trong đó trong ứng dụng của bạn, tin nhắn của bạn đến, ngoài việc xem xét mô tả sự kiện. Nếu bạn muốn theo dõi vị trí của các tin nhắn của mình, bạn sẽ cần phải tham khảo tài liệu vượt quá cấp độ hướng dẫn - xem hướng dẫn đăng nhập nâng cao.Advanced Logging Tutorial. Dữ liệu biến ghi nhật kýĐể nhật ký dữ liệu biến, hãy sử dụng chuỗi định dạng cho thông báo Mô tả sự kiện và nối dữ liệu biến làm đối số. Ví dụ: 1sẽ hiển thị: 2Như bạn có thể thấy, việc hợp nhất dữ liệu biến vào thông báo Mô tả sự kiện sử dụng kiểu cũ, kiểu %của định dạng chuỗi. Đây là để tương thích ngược: Gói ghi nhật ký trước các tùy chọn định dạng mới hơn như # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)0 và # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)1. Các tùy chọn định dạng mới hơn này được hỗ trợ, nhưng khám phá chúng nằm ngoài phạm vi của hướng dẫn này: Xem bằng cách sử dụng các kiểu định dạng cụ thể trong suốt ứng dụng của bạn để biết thêm thông tin.Using particular formatting styles throughout your application for more information. Thay đổi định dạng của các tin nhắn được hiển thị lorĐể thay đổi định dạng được sử dụng để hiển thị tin nhắn, bạn cần chỉ định định dạng bạn muốn sử dụng: 3cái nào sẽ in: 4Lưu ý rằng ‘root, xuất hiện trong các ví dụ trước đó đã biến mất. Đối với một tập hợp đầy đủ các thứ có thể xuất hiện trong các chuỗi định dạng, bạn có thể tham khảo tài liệu cho các thuộc tính logrecord, nhưng để sử dụng đơn giản, bạn chỉ cần tên mức độ (mức độ nghiêm trọng), tin nhắn (mô tả sự kiện, bao gồm dữ liệu biến) và có lẽ để hiển thị Khi sự kiện xảy ra. Nó được mô tả trong phần sau.LogRecord attributes, but for simple usage, you just need the levelname (severity), message (event description, including variable data) and perhaps to display when the event occurred. This is described in the next section. Hiển thị ngày/giờ trong Tin nhắnĐể hiển thị ngày và thời gian của một sự kiện, bạn sẽ đặt ‘%(ASCTIME) S trong chuỗi định dạng của bạn: 5Mà sẽ in một cái gì đó như thế này: 6Định dạng mặc định cho hiển thị ngày/thời gian (hiển thị ở trên) giống như ISO8601 hoặc RFC 3339. Nếu bạn cần kiểm soát thêm định dạng ngày/giờ, hãy cung cấp đối số DATEFMT cho # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)2, như trong ví dụ này:RFC 3339. If you need more control over the formatting of the date/time, provide a datefmt argument to # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)2, as in this example: 7Mà sẽ hiển thị một cái gì đó như thế này: 8Định dạng của đối số DATEFMT giống như được hỗ trợ bởi # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)3. Bước tiếp theo¶Điều đó kết thúc hướng dẫn cơ bản. Nó là đủ để giúp bạn đứng dậy và chạy với ghi nhật ký. Có rất nhiều điều mà gói ghi nhật ký cung cấp, nhưng để tận dụng tốt nhất, bạn sẽ cần phải đầu tư thêm một chút thời gian để đọc các phần sau. Nếu bạn đã sẵn sàng cho điều đó, hãy lấy một số đồ uống yêu thích của bạn và tiếp tục. Nếu nhu cầu ghi nhật ký của bạn rất đơn giản, thì hãy sử dụng các ví dụ trên để kết hợp ghi nhật ký vào các tập lệnh của riêng bạn và nếu bạn gặp vấn đề hoặc không hiểu điều gì đó, vui lòng đăng một câu hỏi trên nhóm comp.lang.python usenet (có sẵn tại https : //groups.google.com/forum/#! Diễn đàn/comp.lang.python) và bạn sẽ nhận được sự giúp đỡ trước khi quá lâu. Vẫn ở đây? Bạn có thể tiếp tục đọc một vài phần tiếp theo, cung cấp một hướng dẫn nâng cao/chuyên sâu hơn một chút so với phần cơ bản ở trên. Sau đó, bạn có thể xem sách nấu ăn đăng nhập.Logging Cookbook. Hướng dẫn đăng nhập nâng caoThư viện ghi nhật ký có cách tiếp cận mô -đun và cung cấp một số loại thành phần: loggers, trình xử lý, bộ lọc và định dạng.
Thông tin sự kiện nhật ký được truyền giữa loggers, trình xử lý, bộ lọc và định dạng trong một ví dụ # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)4. Ghi nhật ký được thực hiện bằng cách gọi các phương thức trên các trường hợp của lớp # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)5 (sau đây gọi là loggers). Mỗi trường hợp có một tên và chúng được sắp xếp theo khái niệm theo hệ thống phân cấp không gian tên bằng cách sử dụng các dấu chấm (thời kỳ) làm dấu phân cách. Ví dụ: một logger có tên ‘quét, là cha mẹ của loggers‘ scan.text, ‘scan.html, và‘ scan.pdf. Tên logger có thể là bất cứ điều gì bạn muốn và chỉ ra khu vực của một ứng dụng trong đó một tin nhắn đã ghi lại bắt nguồn. Một quy ước tốt để sử dụng khi đặt tên loggers là sử dụng logger cấp mô-đun, trong mỗi mô-đun sử dụng ghi nhật ký, được đặt tên như sau: 9Điều này có nghĩa là tên logger theo dõi hệ thống phân cấp gói/mô -đun và nó rõ ràng trực giác khi các sự kiện được ghi lại chỉ từ tên logger. Rễ của hệ thống phân cấp của loggers được gọi là logger gốc. Đó là bộ ghi âm được sử dụng bởi các hàm import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')0, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')1, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')2, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')3 và import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')4, mà chỉ gọi phương thức đặt tên giống nhau của bộ ghi gốc. Các chức năng và các phương pháp có cùng chữ ký. Tên logger gốc được in dưới dạng ‘root, trong đầu ra đã ghi. Tất nhiên, đó có thể đăng nhập tin nhắn vào các điểm đến khác nhau. Hỗ trợ được bao gồm trong gói để ghi tin nhắn nhật ký vào các tệp, vị trí HTTP GET/POST, email qua SMTP, ổ cắm chung, hàng đợi hoặc cơ chế ghi nhật ký cụ thể của OS như Syslog hoặc nhật ký sự kiện Windows NT. Các điểm đến được phục vụ bởi các lớp xử lý. Bạn có thể tạo lớp đích đăng nhập của riêng mình nếu bạn có các yêu cầu đặc biệt không được đáp ứng bởi bất kỳ lớp xử lý tích hợp nào. Theo mặc định, không có đích nào được đặt cho bất kỳ tin nhắn ghi nhật ký nào. Bạn có thể chỉ định một đích (chẳng hạn như bảng điều khiển hoặc tệp) bằng cách sử dụng getattr(logging, loglevel.upper())5 như trong các ví dụ hướng dẫn. Nếu bạn gọi các chức năng import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')0, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')1, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')2, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')3 và import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')4, họ sẽ kiểm tra xem có đích nào được đặt không; và nếu một người không được đặt, họ sẽ đặt đích của bảng điều khiển ( logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)7) và định dạng mặc định cho thông báo được hiển thị trước khi ủy thác cho bộ ghi gốc để thực hiện đầu ra thông báo thực tế. Định dạng mặc định được đặt bởi getattr(logging, loglevel.upper())5 cho tin nhắn là: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything0 Bạn có thể thay đổi điều này bằng cách chuyển một chuỗi định dạng sang getattr(logging, loglevel.upper())5 với đối số từ khóa định dạng. Đối với tất cả các tùy chọn liên quan đến cách xây dựng chuỗi định dạng, hãy xem các đối tượng Formatter.Formatter Objects. Lưu lượng ghi nhật kýDòng thông tin sự kiện nhật ký trong loggers và trình xử lý được minh họa trong sơ đồ sau. Người khai thác gỗ¶# assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)5 Đối tượng có một công việc ba lần. Đầu tiên, họ hiển thị một số phương thức vào mã ứng dụng để các ứng dụng có thể đăng nhập tin nhắn khi chạy. Thứ hai, các đối tượng logger xác định thông báo nhật ký nào sẽ hoạt động dựa trên mức độ nghiêm trọng (cơ sở lọc mặc định) hoặc các đối tượng bộ lọc. Thứ ba, các đối tượng logger chuyển các tin nhắn nhật ký có liên quan cho tất cả các trình xử lý nhật ký quan tâm. Các phương thức được sử dụng rộng rãi nhất trên các đối tượng logger rơi vào hai loại: cấu hình và gửi tin nhắn. Đây là những phương pháp cấu hình phổ biến nhất:
Bạn không cần phải luôn gọi các phương thức này trên mọi logger bạn tạo. Xem hai đoạn cuối cùng trong phần này. Với đối tượng logger được định cấu hình, các phương thức sau tạo thông báo nhật ký:
00 Trả về một tham chiếu đến một thể hiện logger với tên được chỉ định nếu nó được cung cấp hoặc 01 nếu không. Các tên là các cấu trúc phân cấp được phân tách thời kỳ. Nhiều cuộc gọi đến 00 có cùng tên sẽ trả về một tham chiếu đến cùng một đối tượng logger. Loggers nằm hơn nữa trong danh sách phân cấp là trẻ em của loggers cao hơn trong danh sách. Ví dụ, được đưa ra một logger có tên là 03, loggers có tên của 04, 05 và 06 đều là hậu duệ của 03.Loggers có một khái niệm về mức độ hiệu quả. Nếu một cấp độ không được đặt rõ ràng trên logger, mức độ của cha mẹ được sử dụng thay vào đó làm mức hiệu quả. Nếu cha mẹ không có cấp cấp rõ ràng, cha mẹ của nó được kiểm tra, v.v. - tất cả các tổ tiên được tìm kiếm cho đến khi tìm thấy cấp độ được thiết lập rõ ràng. Logger gốc luôn có một mức cấp rõ ràng ( DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö5 theo mặc định). Khi quyết định có xử lý một sự kiện hay không, mức độ hiệu quả của logger được sử dụng để xác định xem sự kiện có được chuyển cho trình xử lý logger hay không. Những người đăng nhập trẻ em tuyên truyền các thông điệp lên đến những người xử lý liên quan đến loggers tổ tiên của họ. Bởi vì điều này, không cần thiết phải xác định và định cấu hình trình xử lý cho tất cả các loggers mà ứng dụng sử dụng. Nó là đủ để định cấu hình trình xử lý cho một bộ ghi cấp cấp cao nhất và tạo bộ ghi nhật ký con khi cần thiết. . Người xử lý vàCác đối tượng 10 chịu trách nhiệm gửi các thông báo nhật ký thích hợp (dựa trên thông báo nhật ký Mức độ nghiêm trọng) đối với điểm đến được chỉ định của Handler. # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)5 Các đối tượng có thể thêm các đối tượng xử lý bằng không hoặc nhiều hơn với phương thức 12. Là một kịch bản ví dụ, một ứng dụng có thể muốn gửi tất cả các thông báo nhật ký đến tệp nhật ký, tất cả các thông báo nhật ký lỗi hoặc cao hơn cho stdout và tất cả các thông báo quan trọng đến địa chỉ email. Kịch bản này yêu cầu ba trình xử lý riêng lẻ trong đó mỗi người xử lý chịu trách nhiệm gửi tin nhắn về mức độ nghiêm trọng cụ thể đến một địa điểm cụ thể.Thư viện tiêu chuẩn bao gồm khá nhiều loại xử lý (xem Trình xử lý hữu ích); Các hướng dẫn sử dụng chủ yếu là 13 và 14 trong các ví dụ của nó.Useful Handlers); the tutorials use mainly 13 and 14 in its examples.Có rất ít phương pháp trong một người xử lý cho các nhà phát triển ứng dụng quan tâm đến bản thân. Các phương thức xử lý duy nhất có vẻ phù hợp với các nhà phát triển ứng dụng đang sử dụng các đối tượng xử lý tích hợp (nghĩa là không tạo trình xử lý tùy chỉnh) là các phương thức cấu hình sau:
Mã ứng dụng không nên trực tiếp khởi tạo và sử dụng các trường hợp là 10. Thay vào đó, lớp 10 là một lớp cơ sở xác định giao diện mà tất cả các trình xử lý nên có và thiết lập một số hành vi mặc định mà các lớp con có thể sử dụng (hoặc ghi đè).Định dạngCác đối tượng Formatter định cấu hình thứ tự, cấu trúc và nội dung cuối cùng của thông báo nhật ký. Không giống như lớp cơ sở ____122, mã ứng dụng có thể khởi tạo các lớp định dạng, mặc dù bạn có thể phân lớp định dạng nếu ứng dụng của bạn cần hành vi đặc biệt. Trình xây dựng có ba đối số tùy chọn - chuỗi định dạng tin nhắn, chuỗi định dạng ngày và chỉ báo kiểu. logging.formatter .__ init __ (fmt = none, datefmt = none, style = '%') ¶__init__(fmt=None, datefmt=None, style='%')¶Nếu không có chuỗi định dạng tin nhắn, mặc định là sử dụng thông báo RAW. Nếu không có chuỗi định dạng ngày, định dạng ngày mặc định là: với các mili giây đã được giải quyết vào cuối. 23 là một trong số 24, 25 hoặc 26. Nếu một trong số này không được chỉ định, thì 24 sẽ được sử dụng.Nếu 23 là 24, chuỗi định dạng thông báo sử dụng thay thế chuỗi kiểu 30; Các khóa có thể được ghi lại trong các thuộc tính logrecord. Nếu kiểu là 25, chuỗi định dạng thông báo được giả sử là tương thích với # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)0 (sử dụng các đối số từ khóa), trong khi nếu kiểu này là 26 thì chuỗi định dạng thông báo sẽ phù hợp với những gì được mong đợi bởi 34.LogRecord attributes. If the style is 25, the message format string is assumed to be compatible with
# assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)0 (using keyword arguments), while if the style is 26 then the message format string should conform to what is expected by 34.Đã thay đổi trong phiên bản 3.2: Đã thêm tham số 23 parameter.Chuỗi định dạng thông báo sau đây sẽ ghi lại thời gian ở định dạng có thể đọc được của con người, mức độ nghiêm trọng của tin nhắn và nội dung của tin nhắn, theo thứ tự đó: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything1 Formatters sử dụng chức năng có thể định cấu hình người dùng để chuyển đổi thời gian tạo của bản ghi thành một tuple. Theo mặc định, 36 được sử dụng; Để thay đổi điều này cho một thể hiện định dạng cụ thể, hãy đặt thuộc tính 37 của phiên bản thành hàm có cùng chữ ký với 36 hoặc 39. Để thay đổi nó cho tất cả các định dạng, ví dụ, nếu bạn muốn tất cả thời gian đăng nhập được hiển thị trong GMT, hãy đặt thuộc tính 37 trong lớp định dạng (thành 41 cho hiển thị GMT).Định cấu hình ghi nhật kýCác lập trình viên có thể định cấu hình đăng nhập theo ba cách:
Đối với tài liệu tham khảo về hai tùy chọn cuối cùng, xem các chức năng cấu hình. Ví dụ sau đây định cấu hình một bộ ghi âm rất đơn giản, trình xử lý bảng điều khiển và một định dạng đơn giản bằng cách sử dụng mã Python:Configuration functions. The following example configures a very simple logger, a console handler, and a simple formatter using Python code: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything2 Chạy mô -đun này từ dòng lệnh tạo ra đầu ra sau: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything3 Mô -đun Python sau đây tạo ra một logger, người xử lý và định dạng gần giống với các mô -đun trong ví dụ được liệt kê ở trên, với sự khác biệt duy nhất là tên của các đối tượng: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything4 Đây là tệp đăng nhập.conf: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything5 Đầu ra gần giống với ví dụ không dựa trên tệp-file: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything6 Bạn có thể thấy rằng cách tiếp cận tệp cấu hình có một vài lợi thế so với cách tiếp cận mã Python, chủ yếu phân tách cấu hình và mã và khả năng của những người không kiểm duyệt để dễ dàng sửa đổi các thuộc tính ghi nhật ký. Cảnh báo Hàm 42 có tham số mặc định, 45, mặc định là 46 vì lý do tương thích ngược. Điều này có thể hoặc không phải là những gì bạn muốn, vì nó sẽ gây ra bất kỳ bộ ghi nhật ký không root nào trước khi cuộc gọi 42 bị vô hiệu hóa trừ khi chúng (hoặc tổ tiên) được đặt tên rõ ràng trong cấu hình. Vui lòng tham khảo tài liệu tham khảo để biết thêm thông tin và chỉ định 09 cho tham số này nếu bạn muốn.Từ điển được chuyển đến 43 cũng có thể chỉ định giá trị boolean với khóa 45, nếu không được chỉ định rõ ràng trong từ điển cũng mặc định được hiểu là 46. Điều này dẫn đến hành vi phân tích logger được mô tả ở trên, có thể không phải là những gì bạn muốn - trong trường hợp đó, cung cấp chính một cách rõ ràng với giá trị 09.Lưu ý rằng các tên lớp được tham chiếu trong các tệp cấu hình cần phải liên quan đến mô -đun ghi nhật ký hoặc các giá trị tuyệt đối có thể được giải quyết bằng cách sử dụng các cơ chế nhập thông thường. Do đó, bạn có thể sử dụng 53 (liên quan đến mô -đun ghi nhật ký) hoặc 54 (đối với một lớp được xác định trong gói 55 và mô -đun 56, trong đó 55 có sẵn trên đường dẫn nhập Python).Trong Python 3.2, một phương tiện mới để định cấu hình ghi nhật ký đã được giới thiệu, sử dụng từ điển để giữ thông tin cấu hình. Điều này cung cấp một superset của chức năng của cách tiếp cận dựa trên tệp cấu hình được nêu ở trên và là phương thức cấu hình được đề xuất cho các ứng dụng và triển khai mới. Bởi vì một từ điển Python được sử dụng để chứa thông tin cấu hình và vì bạn có thể điền từ điển đó bằng các phương tiện khác nhau, bạn có nhiều tùy chọn hơn cho cấu hình. Ví dụ: bạn có thể sử dụng tệp cấu hình ở định dạng JSON hoặc, nếu bạn có quyền truy cập vào chức năng xử lý YAML, một tệp ở định dạng YAML, để điền vào Từ điển cấu hình. Hoặc, tất nhiên, bạn có thể xây dựng từ điển trong mã Python, nhận nó ở dạng ngâm trên một ổ cắm hoặc sử dụng bất kỳ cách tiếp cận nào có ý nghĩa cho ứng dụng của bạn. Ở đây, một ví dụ về cấu hình tương tự như trên, ở định dạng YAML cho cách tiếp cận dựa trên từ điển mới: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything7 Để biết thêm thông tin về việc đăng nhập bằng từ điển, hãy xem các chức năng cấu hình.Configuration functions. Điều gì xảy ra nếu không có cấu hình nào được cung cấp JoNếu không có cấu hình ghi nhật ký được cung cấp, có thể có một tình huống trong đó một sự kiện ghi nhật ký cần phải được đầu ra, nhưng không có người xử lý nào có thể được tìm thấy để xuất hiện sự kiện. Hành vi của gói ghi nhật ký trong những trường hợp này phụ thuộc vào phiên bản Python. Đối với các phiên bản của Python trước 3.2, hành vi như sau:
Trong Python 3.2 trở lên, hành vi như sau:
Để có được hành vi trước 3,2, 60 có thể được đặt thành 65.Định cấu hình ghi nhật ký cho thư việnKhi phát triển một thư viện sử dụng ghi nhật ký, bạn nên cẩn thận để ghi lại cách thư viện sử dụng ghi nhật ký - ví dụ: tên của loggers được sử dụng. Một số xem xét cũng cần được cung cấp cho cấu hình ghi nhật ký của nó. Nếu ứng dụng sử dụng không sử dụng ghi nhật ký và mã thư viện thực hiện các cuộc gọi ghi nhật ký, thì (như được mô tả trong phần trước) Các sự kiện về mức độ nghiêm trọng DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö5 và lớn hơn sẽ được in thành logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)7. Đây được coi là hành vi mặc định tốt nhất. Nếu vì một lý do nào đó, bạn không muốn những tin nhắn này được in trong trường hợp không có bất kỳ cấu hình ghi nhật ký nào, bạn có thể đính kèm trình xử lý không làm gì vào bộ ghi cấp cao nhất cho thư viện của bạn. Điều này tránh được thông điệp được in, vì một trình xử lý sẽ luôn được tìm thấy cho các sự kiện thư viện: nó không tạo ra bất kỳ đầu ra nào. Nếu người dùng thư viện định cấu hình ghi nhật ký để sử dụng ứng dụng, có lẽ cấu hình đó sẽ thêm một số trình xử lý và nếu các cấp được cấu hình phù hợp thì các cuộc gọi đăng nhập được thực hiện trong mã thư viện sẽ gửi đầu ra cho những người xử lý đó là bình thường. Một trình xử lý không có gì được bao gồm trong gói ghi nhật ký: 68 (kể từ Python 3.1). Một thể hiện của trình xử lý này có thể được thêm vào bộ ghi cấp cao nhất của không gian tên ghi nhật ký được sử dụng bởi thư viện (nếu bạn muốn ngăn thư viện của bạn các sự kiện ghi nhật ký được xuất ra logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)7 trong trường hợp không có cấu hình ghi nhật ký). Nếu tất cả việc đăng nhập bởi một thư viện foo được thực hiện bằng cách sử dụng loggers có tên khớp ‘foo.x,‘ foo.x.y, v.v. thì mã: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything8 Nên có hiệu ứng mong muốn. Nếu một tổ chức tạo ra một số thư viện, thì tên logger được chỉ định có thể là ‘orgname.foo, chứ không chỉ là‘ foo. Ghi chú Chúng tôi khuyên bạn không nên đăng nhập vào logger gốc trong thư viện của mình. Thay vào đó, hãy sử dụng một logger có tên độc đáo và dễ nhận dạng, chẳng hạn như 70 cho gói hoặc mô-đun cấp cao nhất của thư viện. Đăng nhập vào logger root sẽ khiến nhà phát triển ứng dụng khó hoặc không thể định cấu hình xác suất ghi nhật ký hoặc trình xử lý thư viện của bạn như họ muốn.Ghi chú Chúng tôi khuyên bạn không nên đăng nhập vào logger gốc trong thư viện của mình. Thay vào đó, hãy sử dụng một logger có tên độc đáo và dễ nhận dạng, chẳng hạn như 70 cho gói hoặc mô-đun cấp cao nhất của thư viện. Đăng nhập vào logger root sẽ khiến nhà phát triển ứng dụng khó hoặc không thể định cấu hình xác suất ghi nhật ký hoặc trình xử lý thư viện của bạn như họ muốn.Mức ghi nhật kýCác giá trị số của các mức ghi nhật ký được đưa ra trong bảng sau. Đây chủ yếu được quan tâm nếu bạn muốn xác định cấp độ của riêng bạn và cần chúng có các giá trị cụ thể liên quan đến các cấp độ được xác định trước. Nếu bạn xác định một mức có cùng giá trị số, nó sẽ ghi đè lên giá trị được xác định trước; Tên được xác định trước bị mất.
Các cấp độ cũng có thể được liên kết với logger, được đặt bởi nhà phát triển hoặc thông qua việc tải cấu hình ghi nhật ký đã lưu. Khi một phương thức ghi nhật ký được gọi trên logger, logger sẽ so sánh mức của chính nó với mức được liên kết với lệnh gọi phương thức. Nếu cấp độ logger cao hơn phương thức gọi, thì không có thông báo ghi nhật ký nào được tạo. Đây là cơ chế cơ bản kiểm soát tính phân từ của đầu ra ghi nhật ký. Tin nhắn ghi nhật ký được mã hóa dưới dạng các trường hợp của lớp # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)4. Khi một logger quyết định thực sự đăng nhập một sự kiện, một thể hiện # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)4 được tạo từ thông báo ghi nhật ký. Tin nhắn ghi nhật ký phải tuân theo một cơ chế điều phối thông qua việc sử dụng trình xử lý, đó là các trường hợp của các lớp con của lớp 10. Người xử lý chịu trách nhiệm đảm bảo rằng một tin nhắn đã đăng nhập (dưới dạng # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)4) kết thúc ở một vị trí cụ thể (hoặc tập hợp các vị trí) hữu ích cho đối tượng mục tiêu cho thông báo đó (như người dùng cuối, nhân viên bàn hỗ trợ, hệ thống Quản trị viên, nhà phát triển). Người xử lý được thông qua # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)4 trường hợp dành cho các điểm đến cụ thể. Mỗi logger có thể có số 0, một hoặc nhiều trình xử lý được liên kết với nó (thông qua phương pháp 12 của # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)5). Ngoài bất kỳ trình xử lý nào được liên kết trực tiếp với logger, tất cả các trình xử lý được liên kết với tất cả các tổ tiên của logger được gọi để gửi tin nhắn (trừ khi cờ truyền cho logger được đặt thành giá trị sai, tại điểm chuyển đến người xử lý tổ tiên dừng lại ). Giống như đối với loggers, người xử lý có thể có các cấp độ liên quan đến chúng. Một cấp độ Handler, hoạt động như một bộ lọc theo cách tương tự như cấp độ logger. Nếu một người xử lý quyết định thực sự gửi một sự kiện, phương thức 85 được sử dụng để gửi tin nhắn đến đích. Hầu hết các lớp con do người dùng xác định của 10 sẽ cần ghi đè lên 85 này.Cấp độ tùy chỉnhXác định cấp độ của riêng bạn là có thể, nhưng không cần thiết, vì các cấp độ hiện tại đã được chọn trên cơ sở kinh nghiệm thực tế. Tuy nhiên, nếu bạn bị thuyết phục rằng bạn cần các cấp độ tùy chỉnh, nên được thực hiện cẩn thận khi làm điều này và có thể là một ý tưởng rất tồi để xác định các cấp tùy chỉnh nếu bạn đang phát triển thư viện. Đó là bởi vì nếu nhiều tác giả thư viện đều xác định các cấp tùy chỉnh của riêng họ, có khả năng đầu ra ghi nhật ký từ nhiều thư viện như vậy được sử dụng cùng nhau sẽ khó sử dụng nhà phát triển để kiểm soát và/hoặc giải thích cho các thư viện khác nhau. Người xử lý hữu íchNgoài lớp cơ sở 10, nhiều lớp con hữu ích được cung cấp:
Các lớp 68, 13 và 14 được xác định trong gói ghi nhật ký lõi. Các bộ xử lý khác được xác định trong mô-đun phụ, import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything13. (Ngoài ra còn có một mô hình phụ khác, import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything14, cho chức năng cấu hình.) Tin nhắn đã ghi được định dạng để trình bày thông qua các trường hợp của lớp import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything15. Chúng được khởi tạo với một chuỗi định dạng phù hợp để sử dụng với toán tử % và từ điển. Để định dạng nhiều tin nhắn trong một lô, các phiên bản là import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything16 có thể được sử dụng. Ngoài chuỗi định dạng (được áp dụng cho mỗi thông báo trong đợt), còn có điều khoản cho chuỗi định dạng tiêu đề và rơ moóc. Khi lọc dựa trên cấp độ logger và/hoặc trình xử lý là không đủ, các trường hợp của import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything17 có thể được thêm vào cả hai trường hợp # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)5 và 10 (thông qua phương thức 18 của chúng). Trước khi quyết định xử lý một thông báo thêm, cả loggers và người xử lý đều tham khảo tất cả các bộ lọc của họ để được phép. Nếu bất kỳ bộ lọc nào trả về một giá trị sai, thông báo không được xử lý thêm.Chức năng import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything17 cơ bản cho phép lọc theo tên logger cụ thể. Nếu tính năng này được sử dụng, các tin nhắn được gửi đến logger được đặt tên và con cái của nó được phép thông qua bộ lọc và tất cả các tin nhắn khác đã bị rơi. Ngoại lệ được nâng lên trong quá trình ghi nhật kýGói ghi nhật ký được thiết kế để nuốt các ngoại lệ xảy ra trong khi đăng nhập vào sản xuất. Điều này là do đó các lỗi xảy ra trong khi xử lý các sự kiện ghi nhật ký - chẳng hạn như ghi nhật ký sai, mạng hoặc các lỗi tương tự khác - không khiến ứng dụng sử dụng đăng nhập để chấm dứt sớm. import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything22 và import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything23 ngoại lệ không bao giờ bị nuốt. Các trường hợp ngoại lệ khác xảy ra trong phương pháp 85 của lớp con 10 được chuyển sang phương pháp import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything26 của nó. Việc triển khai mặc định của import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything26 trong 10 kiểm tra xem liệu biến cấp độ mô-đun, import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything29, có được đặt không. Nếu được đặt, một dấu vết được in thành logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)7. Nếu không được đặt, ngoại lệ bị nuốt. Ghi chú Giá trị mặc định của import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything29 là 46. Điều này là do trong quá trình phát triển, bạn thường muốn được thông báo về bất kỳ trường hợp ngoại lệ nào xảy ra. Nó khuyên bạn nên đặt import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything29 thành 09 để sử dụng sản xuất.Sử dụng các đối tượng tùy ý làm tin nhắn lorTrong các phần trước và ví dụ, người ta đã giả định rằng thông báo được truyền khi đăng nhập sự kiện là một chuỗi. Tuy nhiên, đây không phải là khả năng duy nhất. Bạn có thể truyền một đối tượng tùy ý dưới dạng thông báo và phương thức import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything35 của nó sẽ được gọi khi hệ thống ghi nhật ký cần chuyển đổi nó thành biểu diễn chuỗi. Trên thực tế, nếu bạn muốn, bạn có thể tránh tính toán hoàn toàn một đại diện chuỗi - ví dụ: 96 phát ra một sự kiện bằng cách ngâm nó và gửi nó qua dây.Tối ưu hóa¶Định dạng của các đối số tin nhắn được hoãn lại cho đến khi không thể tránh được. Tuy nhiên, việc tính toán các đối số được chuyển cho phương thức ghi nhật ký cũng có thể tốn kém và bạn có thể muốn tránh làm điều đó nếu logger sẽ loại bỏ sự kiện của bạn. Để quyết định phải làm gì, bạn có thể gọi phương thức import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything37 có đối số cấp độ và trả về đúng nếu sự kiện sẽ được tạo bởi logger cho mức độ gọi đó. Bạn có thể viết mã như thế này: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything9 Vì vậy, nếu ngưỡng của logger được đặt ở trên DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö3, các cuộc gọi đến import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything39 và import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything40 không bao giờ được thực hiện. Ghi chú Giá trị mặc định của import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything29 là 46. Điều này là do trong quá trình phát triển, bạn thường muốn được thông báo về bất kỳ trường hợp ngoại lệ nào xảy ra. Nó khuyên bạn nên đặt import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything29 thành 09 để sử dụng sản xuất.Sử dụng các đối tượng tùy ý làm tin nhắn lor
Cũng lưu ý rằng mô -đun ghi nhật ký lõi chỉ bao gồm các trình xử lý cơ bản. Nếu bạn không nhập khẩu import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything13 và import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything14, họ đã giành được bất kỳ bộ nhớ nào. Tệp nhật ký trong Python là gì?Python có ghi nhật ký mô-đun tích hợp cho phép viết các thông báo trạng thái vào tệp hoặc bất kỳ luồng đầu ra nào khác. Tệp có thể chứa thông tin về phần của mã được thực thi và vấn đề nào đã được phát sinh.allows writing status messages to a file or any other output streams. The file can contain the information on which part of the code is executed and what problems have been arisen.
Có nhật ký trong Python không?Python đi kèm với một mô -đun ghi nhật ký trong thư viện tiêu chuẩn có thể cung cấp một khung linh hoạt để phát ra thông điệp nhật ký từ các chương trình Python.Mô-đun này được sử dụng rộng rãi bởi các thư viện và thường là điểm đầu tiên cho hầu hết các nhà phát triển khi ghi nhật ký. that can provide a flexible framework for emitting log messages from Python programs. This module is widely used by libraries and is often the first go-to point for most developers when it comes to logging. |