logging --- Cơ sở ghi nhật ký cho Python

Source code: Lib/logging/__init__.py


Mô-đun này xác định các hàm và lớp triển khai hệ thống ghi nhật ký sự kiện linh hoạt cho các ứng dụng và thư viện.

Lợi ích chính của việc ghi nhật ký API do mô-đun thư viện tiêu chuẩn cung cấp là tất cả các mô-đun Python đều có thể tham gia ghi nhật ký, do đó, nhật ký ứng dụng của bạn có thể bao gồm các thông báo của riêng bạn được tích hợp với các thông báo từ mô-đun bên thứ ba.

Đây là một ví dụ đơn giản về cách sử dụng thành ngữ:

# myapp.py
nhập nhật 
nhập khẩu mylib
logger = log.getLogger(__name__)

chắc chắn chính():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logger.info('Đã bắt đầu')
    mylib.do_something()
    logger.info('Đã hoàn thành')

nếu __name__ == '__main__':
    chính()
# mylib.py
nhập nhật 
logger = log.getLogger(__name__)

chắc chắn do_something():
    logger.info('Đang làm gì đó')

Nếu bạn chạy myapp.py, bạn sẽ thấy điều này trong myapp.log:

INFO:__main__:Đã bắt đầu
INFO:mylib:Đang làm gì đó
INFO:__main__:Đã xong

Tính năng chính của cách sử dụng thành ngữ này là phần lớn mã chỉ đơn giản là tạo một trình ghi nhật ký cấp mô-đun với getLogger(__name__) và sử dụng trình ghi nhật ký đó để thực hiện mọi hoạt động ghi nhật ký cần thiết. Điều này ngắn gọn, đồng thời cho phép kiểm soát chi tiết mã xuôi dòng nếu cần. Các tin nhắn đã ghi vào trình ghi nhật ký cấp mô-đun sẽ được chuyển tiếp đến trình xử lý trình ghi nhật ký trong các mô-đun cấp cao hơn, cho đến trình ghi nhật ký cấp cao nhất được gọi là trình ghi nhật ký gốc; Cách tiếp cận này được gọi là ghi nhật ký phân cấp.

Để việc ghi nhật ký trở nên hữu ích, nó cần phải được cấu hình: đặt cấp độ và đích đến cho mỗi trình ghi nhật ký, có khả năng thay đổi cách ghi nhật ký của các mô-đun cụ thể, thường dựa trên các đối số dòng lệnh hoặc cấu hình ứng dụng. Trong hầu hết các trường hợp, giống như trường hợp trên, chỉ trình ghi nhật ký gốc mới cần được cấu hình như vậy, vì tất cả các trình ghi nhật ký cấp thấp hơn ở cấp mô-đun cuối cùng sẽ chuyển tiếp tin nhắn của chúng đến trình xử lý của nó. basicConfig() cung cấp một cách nhanh chóng để định cấu hình trình ghi nhật ký gốc để xử lý nhiều trường hợp sử dụng.

Mô-đun này cung cấp rất nhiều chức năng và tính linh hoạt. Nếu bạn không quen với việc ghi nhật ký, cách tốt nhất để nắm bắt được nó là xem các hướng dẫn (see the links above and on the right).

Các lớp cơ bản được xác định bởi mô-đun, cùng với các thuộc tính và phương thức của chúng, được liệt kê trong các phần bên dưới.

  • 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ý (do người ghi nhật ký tạo) đến đích thích hợp.

  • Bộ lọc cung cấp phương tiện chi tiết hơn để xác định bản ghi nhật ký nào sẽ được xuất ra.

  • Trình định dạng chỉ định cách bố trí các bản ghi nhật ký ở đầu ra cuối cùng.

Đối tượng ghi nhật ký

Trình ghi nhật ký có các thuộc tính và phương thức sau. Lưu ý rằng Trình ghi nhật ký phải được khởi tạo trực tiếp NEVER nhưng luôn thông qua hàm cấp mô-đun logging.getLogger(name). Nhiều lệnh gọi tới getLogger() có cùng tên sẽ luôn trả về một tham chiếu đến cùng một đối tượng Logger.

name có khả năng là một giá trị phân cấp được phân tách bằng dấu chấm, chẳng hạn như foo.bar.baz (mặc dù nó cũng có thể chỉ là foo đơn giản chẳng hạn). Những người ghi nhật ký ở vị trí thấp hơn trong danh sách phân cấp là con của những người ghi nhật ký ở vị trí cao hơn trong danh sách. Ví dụ: với một trình ghi nhật ký có tên foo, các trình ghi nhật ký có tên foo.bar, foo.bar.bazfoo.bam đều là hậu duệ của foo. Ngoài ra, tất cả các logger đều là hậu duệ của root logger. Hệ thống phân cấp tên trình ghi nhật ký tương tự như hệ thống phân cấp gói Python và giống hệt với nó nếu bạn sắp xếp các trình ghi nhật ký của mình trên cơ sở từng mô-đun bằng cách sử dụng cấu trúc được đề xuất logging.getLogger(__name__). Đó là bởi vì trong một mô-đun, __name__ là tên của mô-đun đó trong không gian tên gói Python.

class logging.Logger
name

Đây là tên của trình ghi nhật ký và là giá trị được chuyển đến getLogger() để lấy trình ghi nhật ký.

Ghi chú

Thuộc tính này phải được coi là chỉ đọc.

level

Ngưỡng của bộ ghi này, được đặt bằng phương pháp setLevel().

Ghi chú

Không đặt trực tiếp thuộc tính này - luôn sử dụng setLevel(), có chức năng kiểm tra cấp độ được chuyển cho nó.

parent

Trình ghi nhật ký gốc của trình ghi nhật ký này. Nó có thể thay đổi dựa trên việc khởi tạo sau này của các trình ghi nhật ký có cấp độ cao hơn trong hệ thống phân cấp không gian tên.

Ghi chú

Giá trị này phải được coi là chỉ đọc.

propagate

Nếu thuộc tính này được đánh giá là đúng, thì các sự kiện được ghi vào trình ghi nhật ký này sẽ được chuyển đến trình xử lý của trình ghi nhật ký cấp cao hơn (tổ tiên), ngoài bất kỳ trình xử lý nào được đính kèm với trình ghi nhật ký này. Tin nhắn được chuyển trực tiếp đến trình xử lý của trình ghi nhật ký tổ tiên - cả cấp độ lẫn bộ lọc của trình ghi nhật ký tổ tiên được đề cập đều không được xem xét.

Nếu điều này được đánh giá là sai, thông báo ghi nhật ký sẽ không được chuyển đến trình xử lý của trình ghi nhật ký tổ tiên.

Đánh vần nó bằng một ví dụ: Nếu thuộc tính lan truyền của trình ghi nhật ký có tên A.B.C đánh giá là đúng, thì bất kỳ sự kiện nào được ghi vào A.B.C thông qua lệnh gọi phương thức như logging.getLogger('A.B.C').error(...) sẽ [có thể chuyển cấp độ của trình ghi nhật ký đó và cài đặt bộ lọc] lần lượt được chuyển đến bất kỳ trình xử lý nào được đính kèm với trình ghi nhật ký có tên A.B, A và trình ghi nhật ký gốc, sau lần đầu tiên được chuyển đến bất kỳ trình xử lý nào được gắn với A.B.C. Nếu bất kỳ trình ghi nhật ký nào trong chuỗi A.B.C, A.B, A có thuộc tính propagate được đặt thành false thì đó là trình ghi nhật ký cuối cùng có trình xử lý được cung cấp sự kiện để xử lý và việc truyền bá sẽ dừng tại thời điểm đó.

Hàm tạo đặt thuộc tính này thành True.

Ghi chú

Nếu bạn đính kèm trình xử lý vào trình ghi nhật ký and một hoặc nhiều tổ tiên của nó, nó có thể phát ra cùng một bản ghi nhiều lần. Nói chung, bạn không cần phải đính kèm một trình xử lý vào nhiều hơn một trình ghi nhật ký - nếu bạn chỉ đính kèm trình xử lý đó vào trình ghi nhật ký thích hợp có mức cao nhất trong hệ thống phân cấp trình ghi nhật ký thì nó sẽ thấy tất cả các sự kiện được ghi lại bởi tất cả các trình ghi nhật ký hậu duệ, miễn là cài đặt truyền bá của chúng được đặt thành True. Một kịch bản phổ biến là chỉ đính kèm các trình xử lý vào bộ ghi nhật ký gốc và để việc truyền bá xử lý phần còn lại.

handlers

Danh sách các trình xử lý được đính kèm trực tiếp với phiên bản trình ghi nhật ký này.

Ghi chú

Thuộc tính này phải được coi là chỉ đọc; nó thường được thay đổi thông qua các phương thức addHandler()removeHandler(), sử dụng các khóa để đảm bảo hoạt động an toàn theo luồng.

disabled

Thuộc tính này vô hiệu hóa việc xử lý bất kỳ sự kiện nào. Nó được đặt thành False trong bộ khởi tạo và chỉ được thay đổi bằng cách ghi mã cấu hình.

Ghi chú

Thuộc tính này phải được coi là chỉ đọc.

setLevel(level)

Đặt ngưỡng cho trình ghi nhật ký này thành level. Các tin nhắn ghi nhật ký ít nghiêm trọng hơn level sẽ bị bỏ qua; Thông báo ghi nhật ký có mức độ nghiêm trọng level trở lên sẽ được phát ra bởi bất kỳ trình xử lý hoặc trình xử lý nào phục vụ trình ghi nhật ký này, trừ khi cấp độ của trình xử lý được đặt ở mức độ nghiêm trọng cao hơn level.

Khi một trình ghi nhật ký được tạo, cấp độ được đặt thành NOTSET (điều này khiến tất cả các thông báo được xử lý khi trình ghi nhật ký là trình ghi nhật ký gốc hoặc ủy quyền cho cấp độ gốc khi trình ghi nhật ký là trình ghi nhật ký không phải gốc). Lưu ý rằng trình ghi nhật ký gốc được tạo ở cấp độ WARNING.

Thuật ngữ 'ủy quyền cho cấp độ gốc' có nghĩa là nếu một trình ghi nhật ký có cấp độ NOTSET, thì chuỗi các trình ghi nhật ký tổ tiên của nó sẽ được duyệt qua cho đến khi tìm thấy tổ tiên có cấp độ khác với NOTSET hoặc đạt được gốc.

Nếu tìm thấy cấp độ tổ tiên có cấp độ khác với NOTSET thì cấp độ tổ tiên đó được coi là cấp độ hiệu quả của trình ghi nhật ký nơi tìm kiếm tổ tiên bắt đầu và được sử dụng để xác định cách xử lý sự kiện ghi nhật ký.

Nếu đã đạt đến mức root và có mức NOTSET thì tất cả tin nhắn sẽ được xử lý. Nếu không, cấp độ gốc sẽ được sử dụng làm cấp độ hiệu quả.

Xem Cấp độ ghi nhật ký để biết danh sách các cấp độ.

Thay đổi trong phiên bản 3.2: Tham số level hiện chấp nhận biểu diễn chuỗi cấp độ chẳng hạn như 'INFO' thay thế cho các hằng số nguyên như INFO. Tuy nhiên, lưu ý rằng các mức được lưu trữ nội bộ dưới dạng số nguyên và các phương thức, chẳng hạn như: getEffectiveLevel()isEnabledFor() sẽ trả về/mong đợi được truyền số nguyên.

isEnabledFor(level)

Cho biết liệu trình ghi nhật ký này có xử lý thông báo có mức độ nghiêm trọng level hay không. Phương pháp này trước tiên kiểm tra mức cấp mô-đun do logging.disable(level) đặt, sau đó là mức hiệu quả của trình ghi nhật ký do getEffectiveLevel() xác định.

getEffectiveLevel()

Cho biết mức độ hiệu quả của bộ ghi này. Nếu một giá trị khác NOTSET đã được đặt bằng setLevel() thì giá trị đó sẽ được trả về. Nếu không, hệ thống phân cấp sẽ di chuyển về phía gốc cho đến khi tìm thấy một giá trị khác NOTSET và giá trị đó được trả về. Giá trị được trả về là một số nguyên, thường là một trong số logging.DEBUG, logging.INFO, v.v.

getChild(suffix)

Trả về một trình ghi nhật ký là hậu duệ của trình ghi nhật ký này, được xác định bởi hậu tố. Do đó, logging.getLogger('abc').getChild('def.ghi') sẽ trả về cùng một trình ghi nhật ký như logging.getLogger('abc.def.ghi'). Đây là một phương pháp tiện lợi, hữu ích khi trình ghi nhật ký gốc được đặt tên bằng cách sử dụng ví dụ:. __name__ chứ không phải là một chuỗi ký tự.

Added in version 3.2.

getChildren()

Trả về một tập hợp các logger là con trực tiếp của logger này. Vì vậy, ví dụ: logging.getLogger().getChildren() có thể trả về một tập hợp chứa các trình ghi nhật ký có tên là foobar, nhưng một trình ghi nhật ký có tên foo.bar sẽ không được đưa vào tập hợp đó. Tương tự như vậy, logging.getLogger('foo').getChildren() có thể trả về một tập hợp bao gồm một trình ghi nhật ký có tên foo.bar, nhưng nó sẽ không bao gồm một tập hợp có tên foo.bar.baz.

Added in version 3.12.

debug(msg, *args, **kwargs)

Ghi lại thông báo ở mức DEBUG trên bộ ghi này. msg là chuỗi định dạng thông báo và args là các đối số được hợp nhất thành msg bằng toán tử định dạng chuỗi. (Lưu ý rằng điều này có nghĩa là bạn có thể sử dụng các từ khóa trong chuỗi định dạng, cùng với một đối số từ điển duy nhất.) Không có thao tác định dạng % nào được thực hiện trên msg khi không cung cấp args.

Có bốn đối số từ khóa trong kwargs được kiểm tra: exc_info, stack_info, stacklevelextra.

Nếu exc_info không đánh giá là sai, điều đó sẽ khiến thông tin ngoại lệ được thêm vào thông báo ghi nhật ký. Nếu một bộ ngoại lệ (ở định dạng được trả về bởi sys.exc_info()) hoặc một phiên bản ngoại lệ được cung cấp, thì nó sẽ được sử dụng; mặt khác, sys.exc_info() được gọi để lấy thông tin ngoại lệ.

Đối số từ khóa tùy chọn thứ hai là stack_info, mặc định là False. Nếu đúng, thông tin ngăn xếp sẽ được thêm vào thông báo ghi nhật ký, bao gồm cả lệnh gọi ghi nhật ký thực tế. Lưu ý rằng đây không phải là thông tin ngăn xếp giống như thông tin được hiển thị thông qua việc chỉ định exc_info: Cái trước là các khung xếp chồng từ cuối ngăn xếp lên đến lệnh gọi ghi nhật ký trong luồng hiện tại, trong khi cái sau là thông tin về các khung ngăn xếp đã được hủy liên kết, theo sau một ngoại lệ, trong khi tìm kiếm các trình xử lý ngoại lệ.

Bạn có thể chỉ định stack_info độc lập với exc_info, ví dụ: để chỉ ra cách bạn đạt đến một điểm nhất định trong mã của mình, ngay cả khi không có ngoại lệ nào được nêu ra. Các khung ngăn xếp được in theo dòng tiêu đề có nội dung:

Ngăn xếp (cuộc gọi gần đây nhất cuối cùng):

Điều này bắt chước Traceback (most recent call last): được sử dụng khi hiển thị các khung ngoại lệ.

Đối số từ khóa tùy chọn thứ ba là stacklevel, mặc định là 1. Nếu lớn hơn 1, số khung ngăn xếp tương ứng sẽ bị bỏ qua khi tính toán số dòng và tên hàm được đặt trong LogRecord được tạo cho sự kiện ghi nhật ký. Điều này có thể được sử dụng trong các trình trợ giúp ghi nhật ký để tên hàm, tên tệp và số dòng được ghi không phải là thông tin cho hàm/phương thức của trình trợ giúp mà là thông tin về lệnh gọi của nó. Tên của tham số này phản ánh tên tương đương trong mô-đun warnings.

Đối số từ khóa thứ tư là extra có thể được sử dụng để chuyển một từ điển được sử dụng để điền __dict__ của LogRecord được tạo cho sự kiện ghi nhật ký với các thuộc tính do người dùng xác định. Các thuộc tính tùy chỉnh này sau đó có thể được sử dụng theo ý muốn. Ví dụ: chúng có thể được tích hợp vào các tin nhắn được ghi lại. Ví dụ:

FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'người dùng': 'fbloggs'}
logger = log.getLogger('tcpserver')
logger.warning('Vấn đề về giao thức: %s', 'thiết lập lại kết nối', extra=d)

sẽ in một cái gì đó như

2006-02-08 22:20:02,165 192.168.0.1 fbloggs Sự cố giao thức: thiết lập lại kết nối

Các khóa trong từ điển được truyền trong extra không được xung đột với các khóa được hệ thống ghi nhật ký sử dụng. (Xem phần trên Thuộc tính LogRecord để biết thêm thông tin về những phím nào được hệ thống ghi nhật ký sử dụng.)

Nếu bạn chọn sử dụng các thuộc tính này trong các tin nhắn được ghi lại, bạn cần phải cẩn thận. Ví dụ: trong ví dụ trên, Formatter đã được thiết lập với một chuỗi định dạng mong đợi 'clientip' và 'user' trong từ điển thuộc tính của LogRecord. Nếu thiếu những thông tin này, thông báo sẽ không được ghi vào nhật ký vì sẽ xảy ra ngoại lệ về định dạng chuỗi. Vì vậy, trong trường hợp này, bạn luôn cần chuyển từ điển extra bằng các phím này.

Mặc dù điều này có thể gây khó chịu nhưng tính năng này được thiết kế để sử dụng trong các trường hợp đặc biệt, chẳng hạn như máy chủ đa luồng trong đó cùng một mã thực thi trong nhiều ngữ cảnh và các điều kiện thú vị phát sinh phụ thuộc vào ngữ cảnh này (chẳng hạn như địa chỉ IP của máy khách từ xa và tên người dùng được xác thực, trong ví dụ trên). Trong những trường hợp như vậy, rất có thể các Formatters chuyên dụng sẽ được sử dụng với Handlers cụ thể.

Nếu không có trình xử lý nào được đính kèm với trình ghi nhật ký này (hoặc bất kỳ tổ tiên nào của nó, có tính đến các thuộc tính Logger.propagate có liên quan), thì thông báo sẽ được gửi đến trình xử lý được đặt trên lastResort.

Thay đổi trong phiên bản 3.2: Tham số stack_info đã được thêm vào.

Thay đổi trong phiên bản 3.5: Tham số exc_info hiện có thể chấp nhận các trường hợp ngoại lệ.

Thay đổi trong phiên bản 3.8: Tham số stacklevel đã được thêm vào.

info(msg, *args, **kwargs)

Ghi lại thông báo ở mức INFO trên bộ ghi này. Các đối số được hiểu như đối với debug().

warning(msg, *args, **kwargs)

Ghi lại thông báo ở mức WARNING trên bộ ghi này. Các đối số được hiểu như đối với debug().

Ghi chú

Có một phương thức lỗi thời warn có chức năng giống với warning. Vì warn không được dùng nữa nên vui lòng không sử dụng nó - thay vào đó hãy sử dụng warning.

error(msg, *args, **kwargs)

Ghi lại thông báo ở mức ERROR trên bộ ghi này. Các đối số được hiểu như đối với debug().

critical(msg, *args, **kwargs)

Ghi lại thông báo ở mức CRITICAL trên bộ ghi này. Các đối số được hiểu như đối với debug().

log(level, msg, *args, **kwargs)

Ghi nhật ký thông báo với mức số nguyên level trên bộ ghi này. Các đối số khác được hiểu là dành cho debug().

exception(msg, *args, **kwargs)

Ghi lại thông báo ở mức ERROR trên bộ ghi này. Các đối số được hiểu như đối với debug(). Thông tin ngoại lệ được thêm vào thông báo ghi nhật ký. Phương thức này chỉ nên được gọi từ một trình xử lý ngoại lệ.

addFilter(filter)

Thêm bộ lọc filter được chỉ định vào bộ ghi này.

removeFilter(filter)

Xóa bộ lọc filter được chỉ định khỏi nhật ký này.

filter(record)

Áp dụng các bộ lọc của trình ghi nhật ký này cho bản ghi và trả về True nếu bản ghi được xử lý. Các bộ lọc lần lượt được tham khảo cho đến khi một trong số chúng trả về giá trị sai. Nếu không có giá trị nào trả về giá trị sai thì bản ghi sẽ được xử lý (chuyển tới trình xử lý). Nếu trả về một giá trị sai thì bản ghi sẽ không được xử lý thêm nữa.

addHandler(hdlr)

Thêm trình xử lý được chỉ định hdlr vào trình ghi nhật ký này.

removeHandler(hdlr)

Xóa trình xử lý được chỉ định hdlr khỏi nhật ký này.

findCaller(stack_info=False, stacklevel=1)

Tìm tên tệp nguồn và số dòng của người gọi. Trả về tên tệp, số dòng, tên hàm và thông tin ngăn xếp dưới dạng bộ dữ liệu 4 phần tử. Thông tin ngăn xếp được trả về dưới dạng None trừ khi stack_infoTrue.

Tham số stacklevel được truyền từ mã gọi debug() và các API khác. Nếu lớn hơn 1, phần vượt quá sẽ được sử dụng để bỏ qua các khung ngăn xếp trước khi xác định giá trị được trả về. Điều này thường sẽ hữu ích khi gọi các API ghi nhật ký từ mã trợ giúp/trình bao bọc, để thông tin trong nhật ký sự kiện không đề cập đến mã trình trợ giúp/trình bao bọc mà là mã gọi nó.

handle(record)

Xử lý một bản ghi bằng cách chuyển nó tới tất cả các trình xử lý được liên kết với trình ghi nhật ký này và tổ tiên của nó (cho đến khi tìm thấy giá trị sai là propagate). Phương pháp này được sử dụng cho các bản ghi chưa được chọn nhận được từ ổ cắm cũng như các bản ghi được tạo cục bộ. Lọc cấp độ ghi nhật ký được áp dụng bằng filter().

makeRecord(name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)

Đây là một phương thức xuất xưởng có thể được ghi đè trong các lớp con để tạo các phiên bản LogRecord chuyên dụng.

hasHandlers()

Kiểm tra xem trình ghi nhật ký này có bất kỳ trình xử lý nào được cấu hình hay không. Điều này được thực hiện bằng cách tìm kiếm các trình xử lý trong trình ghi nhật ký này và các trình xử lý cấp trên của nó trong hệ thống phân cấp của trình ghi nhật ký. Trả về True nếu tìm thấy trình xử lý, nếu không thì trả về False. Phương thức này dừng tìm kiếm theo thứ bậc bất cứ khi nào tìm thấy một trình ghi nhật ký có thuộc tính 'propagate' được đặt thành false - đó sẽ là trình ghi nhật ký cuối cùng được kiểm tra sự tồn tại của trình xử lý.

Added in version 3.2.

Thay đổi trong phiên bản 3.7: Người ghi nhật ký bây giờ có thể được ngâm và giải nén.

Cấp độ ghi nhật ký

Các giá trị số của mức ghi nhật ký được đưa ra trong bảng sau. Những điều này chủ yếu được quan tâm nếu bạn muốn xác định cấp độ của riêng mình 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 đè giá trị được xác định trước; tên được xác định trước bị mất.

Cấp độ

Giá trị số

Ý nghĩa của nó / Khi nào nên sử dụng nó

logging.NOTSET

0

Khi được đặt trên một trình ghi nhật ký, biểu thị rằng các trình ghi nhật ký tổ tiên sẽ được tham khảo để xác định mức hiệu quả. Nếu điều đó vẫn giải quyết được thành NOTSET thì tất cả các sự kiện đều được ghi lại. Khi được đặt trên trình xử lý, tất cả các sự kiện đều được xử lý.

logging.DEBUG

10

Thông tin chi tiết, thường chỉ được nhà phát triển đang cố gắng chẩn đoán sự cố quan tâm.

logging.INFO

20

Xác nhận rằng mọi thứ đang hoạt động như mong đợi.

logging.WARNING

30

Dấu hiệu cho thấy điều gì đó không mong muốn đã xảy ra hoặc sự cố có thể xảy ra trong tương lai gần (ví dụ: 'dung lượng ổ đĩa sắp hết'). Phần mềm vẫn hoạt động như mong đợi.

logging.ERROR

40

Do một sự cố nghiêm trọng hơn nên phần mềm không thể thực hiện được một số chức năng.

logging.CRITICAL

50

Một lỗi nghiêm trọng cho thấy bản thân chương trình có thể không thể tiếp tục chạy.

Đối tượng xử lý

Trình xử lý có các thuộc tính và phương thức sau. Lưu ý rằng Handler không bao giờ được khởi tạo trực tiếp; lớp này hoạt động như một cơ sở cho các lớp con hữu ích hơn. Tuy nhiên, phương thức __init__() trong các lớp con cần gọi Handler.__init__().

class logging.Handler
__init__(level=NOTSET)

Khởi tạo phiên bản Handler bằng cách đặt cấp độ của nó, đặt danh sách bộ lọc vào danh sách trống và tạo khóa (sử dụng createLock()) để tuần tự hóa quyền truy cập vào cơ chế I/O.

createLock()

Khởi tạo khóa luồng có thể được sử dụng để tuần tự hóa quyền truy cập vào chức năng I/O cơ bản có thể không an toàn cho luồng.

acquire()

Có được khóa luồng được tạo bằng createLock().

release()

Giải phóng khóa luồng có được bằng acquire().

setLevel(level)

Đặt ngưỡng cho trình xử lý này thành level. Các tin nhắn ghi nhật ký ít nghiêm trọng hơn level sẽ bị bỏ qua. Khi một trình xử lý được tạo, mức được đặt thành NOTSET (điều này khiến tất cả các tin nhắn đều được xử lý).

Xem Cấp độ ghi nhật ký để biết danh sách các cấp độ.

Thay đổi trong phiên bản 3.2: Tham số level hiện chấp nhận biểu diễn chuỗi cấp độ chẳng hạn như 'INFO' thay thế cho các hằng số nguyên như INFO.

setFormatter(fmt)

Đặt bộ định dạng cho trình xử lý này thành fmt. Đối số fmt phải là phiên bản Formatter hoặc None.

addFilter(filter)

Thêm bộ lọc filter được chỉ định vào trình xử lý này.

removeFilter(filter)

Xóa bộ lọc filter đã chỉ định khỏi trình xử lý này.

filter(record)

Áp dụng các bộ lọc của trình xử lý này cho bản ghi và trả về True nếu bản ghi được xử lý. Các bộ lọc lần lượt được tham khảo cho đến khi một trong số chúng trả về giá trị sai. Nếu không có giá trị nào trả về giá trị sai thì bản ghi sẽ được phát ra. Nếu trả về giá trị sai, trình xử lý sẽ không phát ra bản ghi.

flush()

Đảm bảo tất cả đầu ra ghi nhật ký đã được xóa. Phiên bản này không làm gì cả và được dự định sẽ được các lớp con triển khai.

close()

Dọn dẹp mọi tài nguyên được người xử lý sử dụng. Phiên bản này không có đầu ra nhưng loại bỏ trình xử lý khỏi bản đồ nội bộ của các trình xử lý, được sử dụng để tra cứu trình xử lý theo tên.

Các lớp con phải đảm bảo rằng điều này được gọi từ các phương thức close() được ghi đè.

handle(record)

Có điều kiện phát ra bản ghi ghi nhật ký được chỉ định, tùy thuộc vào các bộ lọc có thể đã được thêm vào trình xử lý. Kết thúc quá trình phát bản ghi thực tế bằng việc thu/giải phóng khóa luồng I/O.

handleError(record)

Phương thức này nên được gọi từ trình xử lý khi gặp ngoại lệ trong cuộc gọi emit(). Nếu thuộc tính cấp mô-đun raiseExceptionsFalse, các ngoại lệ sẽ bị bỏ qua một cách âm thầm. Đây là điều được mong muốn nhất đối với một hệ thống ghi nhật ký - hầu hết người dùng sẽ không quan tâm đến lỗi trong hệ thống ghi nhật ký, họ quan tâm nhiều hơn đến lỗi ứng dụng. Tuy nhiên, bạn có thể thay thế nó bằng một trình xử lý tùy chỉnh nếu muốn. Bản ghi được chỉ định là bản ghi đang được xử lý khi xảy ra ngoại lệ. (Giá trị mặc định của raiseExceptionsTrue, vì giá trị này hữu ích hơn trong quá trình phát triển).

format(record)

Thực hiện định dạng cho bản ghi - nếu bộ định dạng được đặt, hãy sử dụng nó. Nếu không, hãy sử dụng trình định dạng mặc định cho mô-đun.

emit(record)

Làm bất cứ điều gì cần thiết để thực sự ghi lại bản ghi ghi nhật ký đã chỉ định. Phiên bản này dự định được triển khai bởi các lớp con và do đó sẽ tạo ra NotImplementedError.

Cảnh báo

Phương thức này được gọi sau khi có được khóa cấp độ xử lý, khóa này sẽ được giải phóng sau khi phương thức này trả về. Khi bạn ghi đè phương thức này, hãy lưu ý rằng bạn nên cẩn thận khi gọi bất kỳ thứ gì gọi bất kỳ phần nào khác của API ghi nhật ký có thể thực hiện khóa vì điều đó có thể dẫn đến bế tắc. Cụ thể:

  • API cấu hình ghi nhật ký thu được khóa cấp mô-đun, sau đó khóa cấp trình xử lý riêng lẻ khi các trình xử lý đó được định cấu hình.

  • Nhiều API ghi nhật ký khóa khóa cấp mô-đun. Nếu một API như vậy được gọi từ phương thức này, nó có thể gây ra bế tắc nếu lệnh gọi cấu hình được thực hiện trên một luồng khác, vì luồng đó sẽ cố gắng lấy khóa cấp mô-đun before khóa cấp trình xử lý, trong khi luồng này cố gắng lấy khóa cấp mô-đun after khóa cấp trình xử lý (vì trong phương thức này, khóa cấp trình xử lý đã được lấy).

Để biết danh sách các trình xử lý được bao gồm dưới dạng tiêu chuẩn, hãy xem logging.handlers.

Đối tượng định dạng

class logging.Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)

Chịu trách nhiệm chuyển đổi LogRecord thành chuỗi đầu ra để con người hoặc hệ thống bên ngoài giải thích.

Tham số:
  • fmt (str) -- Một chuỗi định dạng trong style nhất định cho toàn bộ đầu ra được ghi lại. Các khóa ánh xạ có thể được rút ra từ Thuộc tính LogRecord của đối tượng LogRecord. Nếu không được chỉ định, '%(message)s' sẽ được sử dụng, đây chỉ là thông báo được ghi lại.

  • datefmt (str) -- Chuỗi định dạng cho phần ngày/giờ của kết quả được ghi lại. Nếu không được chỉ định, mặc định được mô tả trong formatTime() sẽ được sử dụng.

  • style (str) -- Có thể là một trong '%', '{' hoặc '$' và xác định cách chuỗi định dạng sẽ được hợp nhất với dữ liệu của nó: sử dụng một trong các Định dạng chuỗi kiểu printf (%), str.format() ({) hoặc string.Template ($). Điều này chỉ áp dụng cho fmt (ví dụ: '%(message)s' so với '{message}'), không áp dụng cho các thông báo nhật ký thực tế được chuyển đến các phương thức ghi nhật ký. Tuy nhiên, có other ways sử dụng định dạng {- và $ cho thông điệp tường trình.

  • validate (bool) -- Nếu True (mặc định), fmt không chính xác hoặc không khớp và style sẽ tạo ra ValueError; ví dụ: logging.Formatter('%(asctime)s - %(message)s', style='{').

  • defaults (dict[str, Any]) -- Từ điển có giá trị mặc định để sử dụng trong các trường tùy chỉnh. Ví dụ: logging.Formatter('%(ip)s %(message)s', defaults={"ip": None})

Thay đổi trong phiên bản 3.2: Đã thêm tham số style.

Thay đổi trong phiên bản 3.8: Đã thêm tham số validate.

Thay đổi trong phiên bản 3.10: Đã thêm tham số defaults.

format(record)

Từ điển thuộc tính của bản ghi được sử dụng làm toán hạng cho thao tác định dạng chuỗi. Trả về chuỗi kết quả. Trước khi định dạng từ điển, một số bước chuẩn bị được thực hiện. Thuộc tính message của bản ghi được tính bằng msg %*args*. Nếu chuỗi định dạng chứa '(asctime)', formatTime() được gọi để định dạng thời gian sự kiện. Nếu có thông tin ngoại lệ, thông tin đó sẽ được định dạng bằng formatException() và được thêm vào tin nhắn. Lưu ý rằng thông tin ngoại lệ được định dạng được lưu trong thuộc tính exc_text. Điều này rất hữu ích vì thông tin ngoại lệ có thể được chọn và gửi qua mạng, nhưng bạn nên cẩn thận nếu bạn có nhiều hơn một lớp con Formatter tùy chỉnh định dạng thông tin ngoại lệ. Trong trường hợp này, bạn sẽ phải xóa giá trị được lưu trong bộ nhớ đệm (bằng cách đặt thuộc tính exc_text thành None) sau khi trình định dạng đã thực hiện định dạng của nó, để trình định dạng tiếp theo xử lý sự kiện không sử dụng giá trị được lưu trong bộ nhớ đệm mà tính toán lại giá trị đó từ đầu.

Nếu có thông tin ngăn xếp, nó sẽ được thêm vào sau thông tin ngoại lệ, sử dụng formatStack() để chuyển đổi nếu cần.

formatTime(record, datefmt=None)

Phương thức này phải được gọi từ format() bởi một trình định dạng muốn sử dụng thời gian được định dạng. Phương thức này có thể được ghi đè trong các trình định dạng để đáp ứng bất kỳ yêu cầu cụ thể nào, nhưng hành vi cơ bản như sau: nếu datefmt (một chuỗi) được chỉ định, thì nó được sử dụng với time.strftime() để định dạng thời gian tạo bản ghi. Mặt khác, định dạng '%Y-%m-%d %H:%M:%S,uuu' được sử dụng, trong đó phần uuu là giá trị mili giây và các chữ cái khác theo tài liệu time.strftime(). Ví dụ về thời gian ở định dạng này là 2003-01-23 00:29:50,411. Chuỗi kết quả được trả về.

Hàm này sử dụng hàm do người dùng định cấu hình để chuyển đổi thời gian tạo thành một bộ dữ liệu. Theo mặc định, time.localtime() được sử dụng; để thay đổi điều này cho một phiên bản trình định dạng cụ thể, hãy đặt thuộc tính converter thành một hàm có cùng chữ ký với time.localtime() hoặc time.gmtime(). Để thay đổi nó cho tất cả các trình định dạng, ví dụ: nếu bạn muốn tất cả thời gian ghi nhật ký được hiển thị trong GMT, hãy đặt thuộc tính converter trong lớp Formatter.

Thay đổi trong phiên bản 3.3: Trước đây, định dạng mặc định được mã hóa cứng như trong ví dụ này: 2010-09-06 22:38:15,292 trong đó phần trước dấu phẩy được xử lý bằng chuỗi định dạng strptime ('%Y-%m-%d %H:%M:%S') và phần sau dấu phẩy là giá trị mili giây. Vì strptime không có trình giữ chỗ định dạng cho mili giây nên giá trị mili giây được thêm vào bằng chuỗi định dạng khác, '%s,%03d' --- và cả hai chuỗi định dạng này đã được mã hóa cứng vào phương thức này. Với sự thay đổi, các chuỗi này được định nghĩa là thuộc tính cấp độ lớp có thể được ghi đè ở cấp độ cá thể khi muốn. Tên của các thuộc tính là default_time_format (đối với chuỗi định dạng strptime) và default_msec_format (để nối thêm giá trị mili giây).

Thay đổi trong phiên bản 3.9: Zz000zz có thể là None.

formatException(exc_info)

Định dạng thông tin ngoại lệ đã chỉ định (một bộ ngoại lệ tiêu chuẩn được trả về bởi sys.exc_info()) dưới dạng một chuỗi. Việc triển khai mặc định này chỉ sử dụng traceback.print_exception(). Chuỗi kết quả được trả về.

formatStack(stack_info)

Định dạng thông tin ngăn xếp đã chỉ định (một chuỗi được trả về bởi traceback.print_stack(), nhưng đã xóa dòng mới cuối cùng) dưới dạng một chuỗi. Việc triển khai mặc định này chỉ trả về giá trị đầu vào.

class logging.BufferingFormatter(linefmt=None)

Lớp định dạng cơ sở thích hợp cho việc phân lớp khi bạn muốn định dạng một số bản ghi. Bạn có thể chuyển một phiên bản Formatter mà bạn muốn sử dụng để định dạng từng dòng (tương ứng với một bản ghi). Nếu không được chỉ định, trình định dạng mặc định (chỉ xuất ra thông báo sự kiện) sẽ được sử dụng làm trình định dạng dòng.

formatHeader(records)

Trả về tiêu đề cho danh sách records. Việc triển khai cơ sở chỉ trả về chuỗi trống. Bạn sẽ cần ghi đè phương thức này nếu bạn muốn có hành vi cụ thể, ví dụ: để hiển thị số lượng bản ghi, tiêu đề hoặc dòng phân cách.

formatFooter(records)

Trả về chân trang cho danh sách records. Việc triển khai cơ sở chỉ trả về chuỗi trống. Bạn sẽ cần ghi đè phương thức này nếu bạn muốn có hành vi cụ thể, ví dụ: để hiển thị số lượng bản ghi hoặc một dòng phân cách.

format(records)

Trả về văn bản đã định dạng cho danh sách records. Việc triển khai cơ sở chỉ trả về chuỗi trống nếu không có bản ghi; mặt khác, nó trả về phần nối của tiêu đề, mỗi bản ghi được định dạng bằng bộ định dạng dòng và chân trang.

Lọc đối tượng

Filters có thể được HandlersLoggers sử dụng để lọc phức tạp hơn mức được cung cấp bởi các cấp độ. Lớp bộ lọc cơ sở chỉ cho phép các sự kiện nằm dưới một điểm nhất định trong hệ thống phân cấp trình ghi nhật ký. Ví dụ: bộ lọc được khởi tạo bằng 'A.B' sẽ cho phép các sự kiện được ghi lại bởi trình ghi nhật ký 'A.B', 'A.B.C', 'A.B.C.D', 'A.B.D', v.v. nhưng không cho phép 'A.BB', 'B.A.B', v.v. Nếu được khởi tạo bằng chuỗi trống, tất cả các sự kiện đều được thông qua.

class logging.Filter(name='')

Trả về một thể hiện của lớp Filter. Nếu name được chỉ định, nó sẽ đặt tên cho một trình ghi nhật ký, cùng với các phần tử con của nó, sẽ cho phép các sự kiện của nó thông qua bộ lọc. Nếu name là chuỗi trống, hãy cho phép mọi sự kiện.

filter(record)

Bản ghi được chỉ định có được ghi lại không? Trả về sai cho không, đúng cho có. Bộ lọc có thể sửa đổi bản ghi nhật ký tại chỗ hoặc trả về một phiên bản bản ghi hoàn toàn khác sẽ thay thế bản ghi nhật ký ban đầu trong bất kỳ quá trình xử lý sự kiện nào trong tương lai.

Lưu ý rằng các bộ lọc gắn với trình xử lý sẽ được tham khảo trước khi một sự kiện được trình xử lý phát ra, trong khi các bộ lọc gắn với trình ghi nhật ký sẽ được tham khảo bất cứ khi nào một sự kiện được ghi lại (sử dụng debug(), info(), v.v.), trước khi gửi sự kiện đến trình xử lý. Điều này có nghĩa là các sự kiện được tạo bởi trình ghi nhật ký con sẽ không bị lọc bởi cài đặt bộ lọc của trình ghi nhật ký, trừ khi bộ lọc cũng được áp dụng cho các trình ghi nhật ký con đó.

Bạn thực sự không cần phải phân lớp Filter: bạn có thể chuyển bất kỳ phiên bản nào có phương thức filter có cùng ngữ nghĩa.

Thay đổi trong phiên bản 3.2: Bạn không cần tạo các lớp Filter chuyên biệt hoặc sử dụng các lớp khác bằng phương thức filter: bạn có thể sử dụng một hàm (hoặc có thể gọi khác) làm bộ lọc. Logic lọc sẽ kiểm tra xem đối tượng bộ lọc có thuộc tính filter hay không: nếu có, nó được coi là Filter và phương thức filter() của nó được gọi. Mặt khác, nó được coi là có thể gọi được và được gọi với bản ghi dưới dạng tham số duy nhất. Giá trị được trả về phải phù hợp với giá trị được trả về bởi filter().

Thay đổi trong phiên bản 3.12: Bây giờ bạn có thể trả về một phiên bản LogRecord từ các bộ lọc để thay thế bản ghi nhật ký thay vì sửa đổi nó tại chỗ. Điều này cho phép các bộ lọc được gắn vào Handler sửa đổi bản ghi nhật ký trước khi nó được phát ra mà không gây tác dụng phụ đối với các trình xử lý khác.

Mặc dù các bộ lọc được sử dụng chủ yếu để lọc các bản ghi dựa trên các tiêu chí phức tạp hơn các cấp độ, nhưng chúng có thể xem mọi bản ghi được xử lý bởi trình xử lý hoặc trình ghi nhật ký mà chúng được đính kèm: điều này có thể hữu ích nếu bạn muốn thực hiện những việc như đếm số lượng bản ghi đã được xử lý bởi một trình ghi nhật ký hoặc trình xử lý cụ thể hoặc thêm, thay đổi hoặc xóa các thuộc tính trong LogRecord đang được xử lý. Rõ ràng việc thay đổi LogRecord cần phải được thực hiện một cách cẩn thận, nhưng nó cho phép đưa thông tin theo ngữ cảnh vào nhật ký (xem Sử dụng Bộ lọc để truyền đạt thông tin theo ngữ cảnh).

Đối tượng LogRecord

Các phiên bản LogRecord được Logger tạo tự động mỗi khi có nội dung nào đó được ghi lại và có thể được tạo thủ công thông qua makeLogRecord() (ví dụ: từ một sự kiện được chọn qua đường dây).

class logging.LogRecord(name, level, pathname, lineno, msg, args, exc_info, func=None, sinfo=None)

Chứa tất cả thông tin liên quan đến sự kiện đang được ghi lại.

Thông tin chính được truyền trong msgargs, được kết hợp bằng msg % args để tạo thuộc tính message của bản ghi.

Tham số:
  • name (str) -- Tên của trình ghi nhật ký được sử dụng để ghi lại sự kiện được đại diện bởi LogRecord này. Lưu ý rằng tên trình ghi nhật ký trong LogRecord sẽ luôn có giá trị này, mặc dù nó có thể được phát ra bởi một trình xử lý gắn liền với một trình ghi nhật ký (tổ tiên) khác.

  • level (int) -- numeric level của sự kiện ghi nhật ký (chẳng hạn như 10 cho DEBUG, 20 cho INFO, v.v.). Lưu ý rằng điều này được chuyển đổi thành thuộc tính two của LogRecord: levelno cho giá trị số và levelname cho tên cấp độ tương ứng.

  • pathname (str) -- Đường dẫn chuỗi đầy đủ của tệp nguồn nơi thực hiện lệnh gọi ghi nhật ký.

  • lineno (int) -- Số dòng trong tệp nguồn nơi thực hiện cuộc gọi ghi nhật ký.

  • msg (Any) -- Thông báo mô tả sự kiện, có thể là chuỗi định dạng % với phần giữ chỗ cho dữ liệu biến đổi hoặc một đối tượng tùy ý (xem Sử dụng các đối tượng tùy ý làm tin nhắn).

  • args (tuple | dict[str, Any]) -- Dữ liệu biến để hợp nhất vào đối số msg để có được mô tả sự kiện.

  • exc_info (tuple[type[BaseException], BaseException, types.TracebackType] | None) -- Một bộ ngoại lệ với thông tin ngoại lệ hiện tại, được trả về bởi sys.exc_info() hoặc None nếu không có thông tin ngoại lệ.

  • func (str | None) -- Tên của hàm hoặc phương thức mà lệnh gọi ghi nhật ký được gọi.

  • sinfo (str | None) -- Một chuỗi văn bản biểu thị thông tin ngăn xếp từ đáy ngăn xếp trong luồng hiện tại cho đến lệnh gọi ghi nhật ký.

getMessage()

Trả về thông báo cho phiên bản LogRecord này sau khi hợp nhất mọi đối số do người dùng cung cấp với thông báo. Nếu đối số tin nhắn do người dùng cung cấp cho cuộc gọi ghi nhật ký không phải là một chuỗi, thì str() sẽ được gọi trên đó để chuyển đổi nó thành một chuỗi. Điều này cho phép sử dụng các lớp do người dùng định nghĩa làm tin nhắn, có phương thức __str__ có thể trả về chuỗi định dạng thực tế sẽ được sử dụng.

Thay đổi trong phiên bản 3.2: Việc tạo LogRecord đã được thực hiện dễ dàng hơn bằng cách cung cấp một nhà máy được sử dụng để tạo bản ghi. Nhà máy có thể được thiết lập bằng getLogRecordFactory()setLogRecordFactory() (xem phần này để biết chữ ký của nhà máy).

Chức năng này có thể được sử dụng để đưa các giá trị của riêng bạn vào LogRecord tại thời điểm tạo. Bạn có thể sử dụng mẫu sau:

old_factory = log.getLogRecordFactory()

def record_factory(*args, **kwargs):
    bản ghi = old_factory(*args, **kwargs)
    record.custom_attribute = 0xdecafbad
    hồ  trả lại

logging.setLogRecordFactory(record_factory)

Với mô hình này, nhiều nhà máy có thể bị xích và miễn là chúng không ghi đè lên các thuộc tính của nhau hoặc vô tình ghi đè lên các thuộc tính tiêu chuẩn được liệt kê ở trên thì sẽ không có gì đáng ngạc nhiên.

Thuộc tính LogRecord

LogRecord có một số thuộc tính, hầu hết chúng đều được lấy từ các tham số của hàm tạo. (Lưu ý rằng các tên không phải lúc nào cũng tương ứng chính xác giữa các tham số của hàm tạo LogRecord và thuộc tính LogRecord.) Các thuộc tính này có thể được sử dụng để hợp nhất dữ liệu từ bản ghi vào chuỗi định dạng. Bảng sau liệt kê (theo thứ tự bảng chữ cái) tên thuộc tính, ý nghĩa của chúng và phần giữ chỗ tương ứng trong chuỗi định dạng kiểu %.

Nếu bạn đang sử dụng định dạng {} (str.format()), bạn có thể sử dụng {attrname} làm phần giữ chỗ trong chuỗi định dạng. Nếu bạn đang sử dụng định dạng $ (string.Template), hãy sử dụng biểu mẫu ${attrname}. Tất nhiên, trong cả hai trường hợp, hãy thay thế attrname bằng tên thuộc tính thực tế mà bạn muốn sử dụng.

Trong trường hợp định dạng {}, bạn có thể chỉ định các cờ định dạng bằng cách đặt chúng sau tên thuộc tính, phân tách bằng dấu hai chấm. Ví dụ: phần giữ chỗ của {msecs:03.0f} sẽ định dạng giá trị mili giây của 4004. Tham khảo tài liệu str.format() để biết chi tiết đầy đủ về các tùy chọn có sẵn cho bạn.

Tên thuộc tính

định dạng

Mô tả

lập luận

Bạn không cần phải tự định dạng cái này.

Bộ đối số được hợp nhất thành msg để tạo ra message hoặc một lệnh có giá trị được sử dụng để hợp nhất (khi chỉ có một đối số và đó là một từ điển).

tăng dần

%(asctime)s

Thời gian con người có thể đọc được khi LogRecord được tạo. Theo mặc định, đây là dạng '2003-07-08 16:49:45,896' (các số sau dấu phẩy là phần mili giây của thời gian).

đã tạo

%(created)f

Thời điểm LogRecord được tạo (được trả về bởi time.time_ns()/1e9).

ex_info

Bạn không cần phải tự định dạng cái này.

Bộ ngoại lệ (à la sys.exc_info) hoặc, nếu không có ngoại lệ nào xảy ra, None.

văn bản exc_text

Bạn không cần phải tự định dạng cái này.

Thông tin ngoại lệ được định dạng dưới dạng chuỗi. Điều này được đặt khi Formatter.format() được gọi hoặc None nếu không có ngoại lệ nào xảy ra.

tên tập tin

%(filename)s

Phần tên tệp của pathname.

tên chức năng

%(funcName)s

Tên hàm chứa lệnh gọi ghi nhật ký.

tên cấp độ

%(levelname)s

Mức ghi văn bản cho tin nhắn ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').

cấp độ không

%(levelno)s

Mức ghi nhật ký số cho tin nhắn (DEBUG, INFO, WARNING, ERROR, CRITICAL).

vải lanh

%(lineno)d

Số dòng nguồn nơi cuộc gọi ghi nhật ký được thực hiện (nếu có).

tin nhắn

%(message)s

Tin nhắn được ghi lại, được tính là msg % args. Điều này được đặt khi Formatter.format() được gọi.

mô-đun

%(module)s

Mô-đun (phần tên của filename).

mili giây

%(msecs)d

Phần mili giây của thời gian khi LogRecord được tạo.

tin nhắn

Bạn không cần phải tự định dạng cái này.

Chuỗi định dạng được chuyển trong lệnh gọi ghi nhật ký ban đầu. Hợp nhất với args để tạo ra message hoặc một đối tượng tùy ý (xem Sử dụng các đối tượng tùy ý làm tin nhắn).

tên

%(name)s

Tên của logger được sử dụng để ghi lại cuộc gọi.

tên đường dẫn

%(pathname)s

Tên đường dẫn đầy đủ của tệp nguồn nơi lệnh gọi ghi nhật ký được thực hiện (nếu có).

quá trình

%(process)d

ID tiến trình (nếu có).

tên quy trình

%(processName)s

Tên quy trình (nếu có).

tương đốiĐã tạo

%(relativeCreated)d

Thời gian tính bằng mili giây khi LogRecord được tạo, liên quan đến thời gian mô-đun ghi nhật ký được tải.

thông tin ngăn xếp

Bạn không cần phải tự định dạng cái này.

Thông tin khung ngăn xếp (nếu có) từ cuối ngăn xếp trong luồng hiện tại, lên đến và bao gồm khung ngăn xếp của lệnh gọi ghi nhật ký dẫn đến việc tạo bản ghi này.

chủ đề

%(thread)d

ID chủ đề (nếu có).

tên chủ đề

%(threadName)s

Tên chủ đề (nếu có).

tên nhiệm vụ

%(taskName)s

tên asyncio.Task (nếu có).

Thay đổi trong phiên bản 3.1: processName đã được thêm vào.

Thay đổi trong phiên bản 3.12: taskName đã được thêm vào.

Đối tượng LoggerAdapter

Các phiên bản LoggerAdapter được sử dụng để chuyển thông tin theo ngữ cảnh vào các cuộc gọi ghi nhật ký một cách thuận tiện. Để biết ví dụ về cách sử dụng, hãy xem phần trên adding contextual information to your logging output.

class logging.LoggerAdapter(logger, extra=None, merge_extra=False)

Trả về một phiên bản của LoggerAdapter được khởi tạo với một phiên bản Logger cơ bản, một đối tượng giống dict tùy chọn (extra) và một boolean tùy chọn (merge_extra) cho biết liệu đối số extra của các lệnh gọi nhật ký riêng lẻ có nên được hợp nhất với LoggerAdapter bổ sung hay không. Hành vi mặc định là bỏ qua đối số extra của các lệnh gọi nhật ký riêng lẻ và chỉ sử dụng một trong các phiên bản LoggerAdapter

process(msg, kwargs)

Sửa đổi thông báo và/hoặc đối số từ khóa được chuyển đến cuộc gọi ghi nhật ký để chèn thông tin theo ngữ cảnh. Việc triển khai này lấy đối tượng được truyền dưới dạng extra cho hàm tạo và thêm nó vào kwargs bằng cách sử dụng khóa 'phụ'. Giá trị trả về là một bộ (msg, kwargs) có các phiên bản (có thể được sửa đổi) của các đối số được truyền vào.

manager

Đại biểu cho manager cơ bản trên logger.

_log

Đại biểu cho phương thức _log() cơ bản trên logger.

Ngoài những cách trên, LoggerAdapter còn hỗ trợ các phương thức sau của Logger: debug(), info(), warning(), error(), exception(), critical(), log(), isEnabledFor(), getEffectiveLevel(), setLevel()hasHandlers(). Các phương thức này có đặc điểm giống với các phương thức tương ứng của chúng trong Logger, vì vậy bạn có thể sử dụng hai loại phiên bản này thay thế cho nhau.

Thay đổi trong phiên bản 3.2: Các phương thức isEnabledFor(), getEffectiveLevel(), setLevel()hasHandlers() đã được thêm vào LoggerAdapter. Các phương thức này ủy quyền cho trình ghi nhật ký cơ bản.

Thay đổi trong phiên bản 3.6: Thuộc tính manager và phương thức _log() đã được thêm vào, ủy quyền cho trình ghi nhật ký cơ bản và cho phép các bộ điều hợp được lồng vào nhau.

Thay đổi trong phiên bản 3.10: Đối số extra hiện là tùy chọn.

Thay đổi trong phiên bản 3.13: Tham số merge_extra đã được thêm vào.

An toàn chủ đề

Mô-đun ghi nhật ký được thiết kế để đảm bảo an toàn cho luồng mà không cần khách hàng thực hiện bất kỳ công việc đặc biệt nào. Nó đạt được điều này thông qua việc sử dụng các khóa ren; có một khóa để tuần tự hóa quyền truy cập vào dữ liệu được chia sẻ của mô-đun và mỗi trình xử lý cũng tạo một khóa để tuần tự hóa quyền truy cập vào I/O cơ bản của nó.

Nếu bạn đang triển khai trình xử lý tín hiệu không đồng bộ bằng mô-đun signal, bạn có thể không sử dụng được tính năng ghi nhật ký từ bên trong các trình xử lý đó. Điều này là do việc triển khai khóa trong mô-đun threading không phải lúc nào cũng được đăng nhập lại và do đó không thể gọi được từ các trình xử lý tín hiệu như vậy.

Chức năng cấp mô-đun

Ngoài các lớp được mô tả ở trên, còn có một số hàm cấp mô-đun.

logging.getLogger(name=None)

Trả về một trình ghi nhật ký có tên được chỉ định hoặc, nếu tên là None, hãy trả về trình ghi nhật ký gốc của hệ thống phân cấp. Nếu được chỉ định, tên thường là tên phân cấp được phân tách bằng dấu chấm như 'a', 'a.b' hoặc 'a.b.c.d'. Việc lựa chọn những tên này hoàn toàn tùy thuộc vào nhà phát triển đang sử dụng tính năng ghi nhật ký, mặc dù vậy, chúng tôi khuyên bạn nên sử dụng __name__ trừ khi bạn có lý do cụ thể để không làm điều đó, như đã đề cập trong Đối tượng ghi nhật ký.

Tất cả lệnh gọi hàm này có tên cụ thể đều trả về cùng một phiên bản trình ghi nhật ký. Điều này có nghĩa là các phiên bản trình ghi nhật ký không bao giờ cần phải được chuyển giữa các phần khác nhau của ứng dụng.

logging.getLoggerClass()

Trả về lớp Logger tiêu chuẩn hoặc lớp cuối cùng được chuyển cho setLoggerClass(). Hàm này có thể được gọi từ bên trong định nghĩa lớp mới, để đảm bảo rằng việc cài đặt lớp Logger tùy chỉnh sẽ không hoàn tác các tùy chỉnh đã được áp dụng bởi mã khác. Ví dụ:

lớp MyLogger(logging.getLoggerClass()):
    # ... ghi đè hành vi ở đây
logging.getLogRecordFactory()

Trả về một giá trị có thể gọi được dùng để tạo LogRecord.

Added in version 3.2: Chức năng này đã được cung cấp, cùng với setLogRecordFactory(), để cho phép các nhà phát triển kiểm soát nhiều hơn cách tạo LogRecord đại diện cho một sự kiện ghi nhật ký.

Xem setLogRecordFactory() để biết thêm thông tin về cách gọi tên nhà máy.

logging.debug(msg, *args, **kwargs)

Đây là một chức năng tiện lợi gọi Logger.debug(), trên bộ ghi gốc. Việc xử lý các đối số về mọi mặt giống hệt với những gì được mô tả trong phương thức đó.

Sự khác biệt duy nhất là nếu trình ghi nhật ký gốc không có trình xử lý thì basicConfig() sẽ được gọi trước khi gọi debug trên trình ghi nhật ký gốc.

Đối với các tập lệnh rất ngắn hoặc trình diễn nhanh các tiện ích của logging, debug và các chức năng cấp mô-đun khác có thể thuận tiện. Tuy nhiên, hầu hết các chương trình sẽ muốn kiểm soát cẩn thận và rõ ràng cấu hình ghi nhật ký và do đó nên tạo một trình ghi nhật ký cấp mô-đun và gọi Logger.debug() (hoặc các phương thức cấp cụ thể khác) trên đó, như được mô tả ở phần đầu của tài liệu này.

logging.info(msg, *args, **kwargs)

Ghi lại thông báo có cấp độ INFO trên bộ ghi nhật ký gốc. Các đối số và hành vi khác cũng giống như đối với debug().

logging.warning(msg, *args, **kwargs)

Ghi lại thông báo có cấp độ WARNING trên bộ ghi nhật ký gốc. Các đối số và hành vi khác cũng giống như đối với debug().

Ghi chú

Có một chức năng lỗi thời warn có chức năng giống với warning. Vì warn không được dùng nữa nên vui lòng không sử dụng nó - thay vào đó hãy sử dụng warning.

logging.error(msg, *args, **kwargs)

Ghi lại thông báo có cấp độ ERROR trên bộ ghi nhật ký gốc. Các đối số và hành vi khác cũng giống như đối với debug().

logging.critical(msg, *args, **kwargs)

Ghi lại thông báo có cấp độ CRITICAL trên bộ ghi nhật ký gốc. Các đối số và hành vi khác cũng giống như đối với debug().

logging.exception(msg, *args, **kwargs)

Ghi lại thông báo có cấp độ ERROR trên bộ ghi nhật ký gốc. Các đối số và hành vi khác cũng giống như đối với debug(). Thông tin ngoại lệ được thêm vào thông báo ghi nhật ký. Hàm này chỉ nên được gọi từ trình xử lý ngoại lệ.

logging.log(level, msg, *args, **kwargs)

Ghi lại thông báo có cấp độ level trên bộ ghi nhật ký gốc. Các đối số và hành vi khác cũng giống như đối với debug().

logging.disable(level=CRITICAL)

Cung cấp mức ghi đè level cho tất cả các trình ghi nhật ký được ưu tiên hơn cấp độ của chính trình ghi nhật ký. Khi có nhu cầu tạm thời giảm tốc độ ghi nhật ký trên toàn bộ ứng dụng, chức năng này có thể hữu ích. Tác dụng của nó là vô hiệu hóa tất cả các lệnh gọi ghi nhật ký có mức độ nghiêm trọng level trở xuống, do đó nếu bạn gọi nó với giá trị INFO thì tất cả các sự kiện INFO và DEBUG sẽ bị loại bỏ, trong khi các sự kiện có mức độ nghiêm trọng WARNING trở lên sẽ được xử lý theo mức độ hiệu quả của trình ghi nhật ký. Nếu logging.disable(logging.NOTSET) được gọi, nó sẽ loại bỏ mức ghi đè này một cách hiệu quả, do đó kết quả ghi nhật ký lại phụ thuộc vào mức hiệu quả của từng trình ghi nhật ký riêng lẻ.

Lưu ý rằng nếu bạn đã xác định bất kỳ mức ghi nhật ký tùy chỉnh nào cao hơn CRITICAL (điều này không được khuyến nghị), bạn sẽ không thể dựa vào giá trị mặc định cho tham số level mà sẽ phải cung cấp một giá trị phù hợp một cách rõ ràng.

Thay đổi trong phiên bản 3.7: Tham số level được mặc định ở mức CRITICAL. Xem bpo-28524 để biết thêm thông tin về thay đổi này.

logging.addLevelName(level, levelName)

Liên kết cấp độ level với văn bản levelName trong từ điển nội bộ, được sử dụng để ánh xạ các cấp độ số thành biểu diễn văn bản, ví dụ: khi Formatter định dạng một tin nhắn. Chức năng này cũng có thể được sử dụng để xác định cấp độ của riêng bạn. Hạn chế duy nhất là tất cả các cấp độ được sử dụng phải được đăng ký bằng hàm này, các cấp độ phải là số nguyên dương và chúng phải tăng theo thứ tự mức độ nghiêm trọng tăng dần.

Ghi chú

Nếu bạn đang nghĩ đến việc xác định cấp độ của riêng mình, vui lòng xem phần trên Cấp độ tùy chỉnh.

logging.getLevelNamesMapping()

Trả về ánh xạ từ tên cấp tới cấp ghi nhật ký tương ứng của chúng. Ví dụ: chuỗi "CRITICAL" ánh xạ tới CRITICAL. Ánh xạ trả về được sao chép từ ánh xạ nội bộ trên mỗi lệnh gọi hàm này.

Added in version 3.11.

logging.getLevelName(level)

Trả về dạng văn bản hoặc dạng số của mức ghi nhật ký level.

Nếu level là một trong các cấp độ được xác định trước CRITICAL, ERROR, WARNING, INFO hoặc DEBUG thì bạn sẽ nhận được chuỗi tương ứng. Nếu bạn đã liên kết các cấp độ với tên bằng addLevelName() thì tên bạn đã liên kết với level sẽ được trả về. Nếu một giá trị số tương ứng với một trong các mức đã xác định được truyền vào thì biểu diễn chuỗi tương ứng sẽ được trả về.

Tham số level cũng chấp nhận biểu diễn chuỗi của cấp độ, chẳng hạn như 'INFO'. Trong những trường hợp như vậy, hàm này trả về giá trị số tương ứng của cấp độ.

Nếu không có giá trị số hoặc chuỗi phù hợp nào được truyền vào thì chuỗi 'Mức %s' % sẽ được trả về.

Ghi chú

Các cấp độ là số nguyên bên trong (vì chúng cần được so sánh trong logic ghi nhật ký). Hàm này được sử dụng để chuyển đổi giữa cấp số nguyên và tên cấp được hiển thị trong đầu ra nhật ký được định dạng bằng bộ xác định định dạng %(levelname)s (xem Thuộc tính LogRecord) và ngược lại.

Thay đổi trong phiên bản 3.4: Trong các phiên bản Python trước 3.4, hàm này cũng có thể được chuyển sang cấp độ văn bản và sẽ trả về giá trị số tương ứng của cấp độ đó. Hành vi không có giấy tờ này được coi là một lỗi và đã bị xóa trong Python 3.4 nhưng được khôi phục trong 3.4.2 do vẫn giữ được khả năng tương thích ngược.

logging.getHandlerByName(name)

Trả về một trình xử lý có name được chỉ định hoặc None nếu không có trình xử lý nào có tên đó.

Added in version 3.12.

logging.getHandlerNames()

Trả về một tập hợp bất biến của tất cả các tên trình xử lý đã biết.

Added in version 3.12.

logging.makeLogRecord(attrdict)

Tạo và trả về một phiên bản LogRecord mới có thuộc tính được xác định bởi attrdict. Hàm này hữu ích khi lấy từ điển thuộc tính LogRecord đã được chọn lọc, gửi qua ổ cắm và cấu trúc lại nó dưới dạng phiên bản LogRecord ở đầu nhận.

logging.basicConfig(**kwargs)

Thực hiện cấu hình cơ bản cho hệ thống ghi nhật ký bằng cách tạo StreamHandler với Formatter mặc định và thêm nó vào trình ghi nhật ký gốc. Các hàm debug(), info(), warning(), error()critical() sẽ tự động gọi basicConfig() nếu không có trình xử lý nào được xác định cho trình ghi nhật ký gốc.

Hàm này không làm gì nếu trình ghi nhật ký gốc đã được định cấu hình trình xử lý, trừ khi đối số từ khóa force được đặt thành True.

Ghi chú

Hàm này phải được gọi từ luồng chính trước khi các luồng khác được bắt đầu. Trong các phiên bản Python trước 2.7.1 và 3.2, nếu hàm này được gọi từ nhiều luồng, thì có thể (trong một số ít trường hợp) trình xử lý sẽ được thêm vào trình ghi nhật ký gốc nhiều lần, dẫn đến các kết quả không mong muốn như thông báo bị trùng lặp trong nhật ký.

Các đối số từ khóa sau đây được hỗ trợ.

định dạng

Mô tả

filename

Chỉ định rằng một FileHandler sẽ được tạo bằng cách sử dụng tên tệp được chỉ định, thay vì StreamHandler.

filemode

Nếu filename được chỉ định, hãy mở tệp trong mode này. Mặc định là 'a'.

format

Sử dụng chuỗi định dạng được chỉ định cho trình xử lý. Mặc định là các thuộc tính levelname, namemessage được phân tách bằng dấu hai chấm.

datefmt

Sử dụng định dạng ngày/giờ được chỉ định, được time.strftime() chấp nhận.

style

Nếu format được chỉ định, hãy sử dụng kiểu này cho chuỗi định dạng. Một trong các '%', '{' hoặc '$' tương ứng cho printf-style, str.format() hoặc string.Template. Mặc định là '%'.

level

Đặt mức ghi nhật ký gốc thành level được chỉ định.

stream

Sử dụng luồng được chỉ định để khởi tạo StreamHandler. Lưu ý rằng đối số này không tương thích với filename - nếu cả hai đều có mặt, ValueError sẽ được nâng lên.

handlers

Nếu được chỉ định, đây sẽ là một trình xử lý lặp lại đã được tạo để thêm vào trình ghi nhật ký gốc. Bất kỳ trình xử lý nào chưa có bộ định dạng sẽ được chỉ định bộ định dạng mặc định được tạo trong hàm này. Lưu ý rằng đối số này không tương thích với filename hoặc stream - nếu cả hai đều có mặt, ValueError sẽ được nâng lên.

force

Nếu đối số từ khóa này được chỉ định là đúng, thì mọi trình xử lý hiện có gắn với bộ ghi nhật ký gốc sẽ bị xóa và đóng trước khi thực hiện cấu hình như được chỉ định bởi các đối số khác.

encoding

Nếu đối số từ khóa này được chỉ định cùng với filename, giá trị của nó sẽ được sử dụng khi FileHandler được tạo và do đó được sử dụng khi mở tệp đầu ra.

errors

Nếu đối số từ khóa này được chỉ định cùng với filename, giá trị của nó sẽ được sử dụng khi FileHandler được tạo và do đó được sử dụng khi mở tệp đầu ra. Nếu không được chỉ định, giá trị 'dấu gạch chéo ngược' sẽ được sử dụng. Lưu ý rằng nếu None được chỉ định, nó sẽ được chuyển đến open(), điều đó có nghĩa là nó sẽ được xử lý giống như việc truyền 'lỗi'.

Thay đổi trong phiên bản 3.2: Đối số style đã được thêm vào.

Thay đổi trong phiên bản 3.3: Đối số handlers đã được thêm vào. Các bước kiểm tra bổ sung đã được thêm vào để nắm bắt các tình huống trong đó các đối số không tương thích được chỉ định (ví dụ: handlers cùng với stream hoặc filename hoặc stream cùng với filename).

Thay đổi trong phiên bản 3.8: Đối số force đã được thêm vào.

Thay đổi trong phiên bản 3.9: Các đối số encodingerrors đã được thêm vào.

logging.shutdown()

Thông báo cho hệ thống ghi nhật ký thực hiện tắt máy theo thứ tự bằng cách xóa và đóng tất cả các trình xử lý. Điều này sẽ được gọi khi thoát ứng dụng và không được sử dụng thêm hệ thống ghi nhật ký sau lệnh gọi này.

Khi mô-đun ghi nhật ký được nhập, nó sẽ đăng ký chức năng này làm trình xử lý thoát (xem atexit), vì vậy thông thường không cần phải thực hiện việc đó theo cách thủ công.

logging.setLoggerClass(klass)

Yêu cầu hệ thống ghi nhật ký sử dụng lớp klass khi khởi tạo trình ghi nhật ký. Lớp nên định nghĩa __init__() sao cho chỉ cần một đối số tên và __init__() sẽ gọi Logger.__init__(). Hàm này thường được gọi trước khi bất kỳ trình ghi nhật ký nào được khởi tạo bởi các ứng dụng cần sử dụng hành vi của trình ghi nhật ký tùy chỉnh. Sau lệnh gọi này, cũng như bất kỳ lúc nào khác, không khởi tạo trực tiếp trình ghi nhật ký bằng cách sử dụng lớp con: tiếp tục sử dụng logging.getLogger() API để lấy trình ghi nhật ký của bạn.

logging.setLogRecordFactory(factory)

Đặt một cuộc gọi có thể được sử dụng để tạo LogRecord.

Tham số:

factory -- Nhà máy có thể gọi được sử dụng để khởi tạo bản ghi nhật ký.

Added in version 3.2: Chức năng này đã được cung cấp, cùng với getLogRecordFactory(), để cho phép các nhà phát triển kiểm soát nhiều hơn cách tạo LogRecord đại diện cho một sự kiện ghi nhật ký.

Nhà máy có chữ ký sau:

factory(name, level, fn, lno, msg, args, exc_info, func=None, sinfo=None, **kwargs)

tên:

Tên nhật ký.

cấp độ:

Mức ghi nhật ký (số).

fn:

Tên đường dẫn đầy đủ của tệp nơi cuộc gọi ghi nhật ký được thực hiện.

tôi không:

Số dòng trong tệp nơi cuộc gọi ghi nhật ký được thực hiện.

tin nhắn:

Thông báo ghi nhật ký.

lập luận:

Các đối số cho thông điệp ghi nhật ký.

ex_info:

Một bộ ngoại lệ, hoặc None.

vui vẻ:

Tên của hàm hoặc phương thức đã gọi lệnh gọi ghi nhật ký.

thông tin sin:

Truy nguyên ngăn xếp như được cung cấp bởi traceback.print_stack(), hiển thị hệ thống phân cấp cuộc gọi.

kwargs:

Đối số từ khóa bổ sung.

Thuộc tính cấp mô-đun

logging.lastResort

"Trình xử lý cuối cùng" có sẵn thông qua thuộc tính này. Đây là StreamHandler ghi vào sys.stderr với cấp độ WARNING và được sử dụng để xử lý các sự kiện ghi nhật ký trong trường hợp không có bất kỳ cấu hình ghi nhật ký nào. Kết quả cuối cùng là chỉ in tin nhắn tới sys.stderr. Điều này thay thế thông báo lỗi trước đó nói rằng "không tìm thấy trình xử lý nào cho logger XYZ". Nếu bạn cần hành vi trước đó vì lý do nào đó, lastResort có thể được đặt thành None.

Added in version 3.2.

logging.raiseExceptions

Được sử dụng để xem liệu có nên phổ biến các ngoại lệ trong quá trình xử lý hay không.

Mặc định: True.

Nếu raiseExceptionsFalse, các ngoại lệ sẽ được âm thầm bỏ qua. Đây là điều được mong muốn nhất đối với một hệ thống ghi nhật ký - hầu hết người dùng sẽ không quan tâm đến lỗi trong hệ thống ghi nhật ký, họ quan tâm nhiều hơn đến lỗi ứng dụng.

Tích hợp với mô-đun cảnh báo

Chức năng captureWarnings() có thể được sử dụng để tích hợp logging với mô-đun warnings.

logging.captureWarnings(capture)

Chức năng này được sử dụng để bật và tắt tính năng ghi lại cảnh báo bằng cách đăng nhập và tắt.

Nếu captureTrue, các cảnh báo do mô-đun warnings đưa ra sẽ được chuyển hướng đến hệ thống ghi nhật ký. Cụ thể, một cảnh báo sẽ được định dạng bằng warnings.formatwarning() và chuỗi kết quả được ghi vào một trình ghi nhật ký có tên 'py.warnings' với mức độ nghiêm trọng là WARNING.

Nếu captureFalse, quá trình chuyển hướng cảnh báo đến hệ thống ghi nhật ký sẽ dừng lại và các cảnh báo sẽ được chuyển hướng đến đích ban đầu của chúng (tức là những cảnh báo có hiệu lực trước khi captureWarnings(True) được gọi).

Xem thêm

Mô-đun logging.config

Cấu hình API cho mô-đun ghi nhật ký.

Mô-đun logging.handlers

Trình xử lý hữu ích đi kèm với mô-đun ghi nhật ký.

PEP 282 - Hệ thống ghi nhật ký

Đề xuất mô tả tính năng này để đưa vào thư viện chuẩn Python.

Original Python logging package

Đây là nguồn ban đầu cho gói logging. Phiên bản của gói có sẵn từ trang này phù hợp để sử dụng với Python 1.5.2, 2.1.x và 2.2.x, không bao gồm gói logging trong thư viện chuẩn.