Các trình xử lý hữu ích sau đây được cung cấp trong gói. Lưu ý rằng ba trong số các trình xử lý [ và ] thực sự được xác định trong chính mô-đun, nhưng đã được ghi lại ở đây cùng với các trình xử lý khác
StreamHandler
Lớp, nằm trong gói lõi, gửi đầu ra ghi nhật ký tới các luồng như sys. thiết bị xuất chuẩn, hệ thống. stderr hoặc bất kỳ đối tượng giống tệp nào [hay chính xác hơn là bất kỳ đối tượng nào hỗ trợ các phương thức write[]
và flush[]
]
Trả về một thể hiện mới của lớp. Nếu luồng được chỉ định, phiên bản sẽ sử dụng luồng đó để ghi nhật ký đầu ra; . stderr sẽ được sử dụng
phát ra[bản ghi]Nếu một trình định dạng được chỉ định, nó sẽ được sử dụng để định dạng bản ghi. Bản ghi sau đó được ghi vào luồng theo sau bởi. Nếu có thông tin ngoại lệ, nó sẽ được định dạng bằng cách sử dụng và thêm vào luồng
xả[]Xóa luồng bằng cách gọi phương thức của nó. Lưu ý rằng phương thức logging.handlers
4 được kế thừa từ đó và do đó không có đầu ra, vì vậy đôi khi có thể cần một cuộc gọi rõ ràng
Đặt luồng của phiên bản thành giá trị đã chỉ định, nếu nó khác. Luồng cũ bị xóa trước khi luồng mới được đặt
Thông sốluồng - Luồng mà trình xử lý nên sử dụng
trả lạiluồng cũ, nếu luồng đã bị thay đổi hoặc Không có nếu không
Mới trong phiên bản 3. 7
Kẻ hủy diệtChuỗi được sử dụng làm dấu kết thúc khi ghi bản ghi được định dạng vào luồng. Giá trị mặc định là logging.handlers
7
Nếu bạn không muốn kết thúc dòng mới, bạn có thể đặt thuộc tính logging.handlers
1 của phiên bản trình xử lý thành chuỗi trống
Trong các phiên bản trước, bộ kết thúc được mã hóa cứng thành logging.handlers
7
Mới trong phiên bản 3. 2
Trình xử lý tệp
Lớp, nằm trong gói lõi, gửi đầu ra ghi nhật ký tới một tệp đĩa. Nó kế thừa chức năng đầu ra từ
lớp ghi nhật ký. Trình xử lý tệp[tên tệp , chế độ='a', encoding=None, delay=False, errors=None]Trả về một thể hiện mới của lớp. Tệp được chỉ định được mở và được sử dụng làm luồng để ghi nhật ký. Nếu chế độ không được chỉ định, StreamHandler
4 được sử dụng. Nếu mã hóa không phải là StreamHandler
5, nó được sử dụng để mở tệp bằng mã hóa đó. Nếu độ trễ là đúng, thì việc mở tệp bị hoãn lại cho đến khi lệnh gọi đầu tiên đến. Theo mặc định, tệp phát triển vô thời hạn. Nếu lỗi được chỉ định, nó được sử dụng để xác định cách xử lý lỗi mã hóa
Đã thay đổi trong phiên bản 3. 6. Cũng như các giá trị chuỗi, các đối tượng cũng được chấp nhận cho đối số tên tệp.
Đã thay đổi trong phiên bản 3. 9. Thông số lỗi đã được thêm vào.
đóng[]Đóng tệp
phát ra[bản ghi]Xuất bản ghi ra tệp
Lưu ý rằng nếu tệp bị đóng do tắt nhật ký khi thoát và chế độ tệp là 'w', thì bản ghi sẽ không được phát ra [xem bpo-42378]
NullHandler
Mới trong phiên bản 3. 1
Lớp, nằm trong gói lõi, không thực hiện bất kỳ định dạng hoặc đầu ra nào. Nó thực chất là một trình xử lý 'no-op' để các nhà phát triển thư viện sử dụng
lớp ghi nhật ký. NullHandlerTrả về một thể hiện mới của lớp
phát ra[bản ghi]Phương pháp này không làm gì cả
xử lý[bản ghi]Phương pháp này không làm gì cả
createLock[]Phương thức này trả về StreamHandler
5 cho khóa, vì không có I/O cơ bản nào cần truy cập theo thứ tự
Xem để biết thêm thông tin về cách sử dụng
Trình xử lý tệp đã xem
Lớp, nằm trong mô-đun, là một write[]
0 xem tệp mà nó đang ghi vào. Nếu tệp thay đổi, tệp sẽ được đóng và mở lại bằng tên tệp
Thay đổi tệp có thể xảy ra do sử dụng các chương trình như newsyslog và logrotate thực hiện xoay tệp nhật ký. Trình xử lý này, dành cho sử dụng trong Unix/Linux, xem tệp để xem nó có thay đổi kể từ lần phát cuối cùng không. [Một tập tin được coi là đã thay đổi nếu thiết bị hoặc inode của nó đã thay đổi. ] Nếu tệp đã thay đổi, luồng tệp cũ bị đóng và tệp được mở để nhận luồng mới
Trình xử lý này không thích hợp để sử dụng trong Windows, bởi vì trong Windows các tệp nhật ký mở không thể được di chuyển hoặc đổi tên - việc ghi nhật ký sẽ mở các tệp bằng các khóa độc quyền - và do đó không cần một trình xử lý như vậy. Hơn nữa, ST_INO không được hỗ trợ trong Windows;
lớp ghi nhật ký. người xử lý. WatchedFileHandler[tên tệp , chế độ='a', encoding=None, delay=False, errors=None]Trả về một thể hiện mới của lớp. Tệp được chỉ định được mở và được sử dụng làm luồng để ghi nhật ký. Nếu chế độ không được chỉ định, StreamHandler
4 được sử dụng. Nếu mã hóa không phải là StreamHandler
5, nó được sử dụng để mở tệp bằng mã hóa đó. Nếu độ trễ là đúng, thì việc mở tệp bị hoãn lại cho đến khi lệnh gọi đầu tiên đến. Theo mặc định, tệp phát triển vô thời hạn. Nếu lỗi được cung cấp, nó sẽ xác định cách xử lý lỗi mã hóa
Đã thay đổi trong phiên bản 3. 6. Cũng như các giá trị chuỗi, các đối tượng cũng được chấp nhận cho đối số tên tệp.
Đã thay đổi trong phiên bản 3. 9. Thông số lỗi đã được thêm vào.
reopenIfNeeded[]Kiểm tra xem tập tin đã thay đổi chưa. Nếu có, luồng hiện tại sẽ bị xóa và đóng và tệp được mở lại, thường là tiền thân để xuất bản ghi vào tệp
Mới trong phiên bản 3. 6
phát ra[bản ghi]Xuất bản ghi vào tệp, nhưng trước tiên hãy gọi để mở lại tệp nếu nó đã thay đổi
BaseRotatingHandler
Lớp, nằm trong mô-đun, là lớp cơ sở cho các trình xử lý tệp quay vòng và. Bạn không cần khởi tạo lớp này, nhưng nó có các thuộc tính và phương thức mà bạn có thể cần ghi đè
lớp ghi nhật ký. người xử lý. BaseRotatingHandler[tên tệp , chế độ, encoding=None, delay=False, errors=None]Các thông số như đối với write[]
0. các thuộc tính là
Nếu thuộc tính này được đặt thành có thể gọi được, phương thức sẽ ủy quyền cho thuộc tính có thể gọi này. Các tham số được truyền cho có thể gọi được là các tham số được truyền cho
Ghi chú
Chức năng đặt tên được gọi khá nhiều lần trong quá trình tái đầu tư, do đó, chức năng này phải đơn giản và nhanh nhất có thể. Nó cũng sẽ trả về cùng một đầu ra mỗi lần cho một đầu vào nhất định, nếu không, hành vi tái đầu tư có thể không hoạt động như mong đợi
Cũng cần lưu ý rằng cần cẩn thận khi sử dụng trình đặt tên để bảo toàn các thuộc tính nhất định trong tên tệp được sử dụng trong quá trình xoay. Ví dụ: dự kiến sẽ có một tập hợp các tệp nhật ký có tên chứa các số nguyên liên tiếp, để xoay vòng hoạt động như mong đợi và xóa các tệp nhật ký cũ [dựa trên tham số write[]
42 được truyền cho trình khởi tạo của trình xử lý] bằng cách xác định các tệp cũ nhất cần xóa. Để điều này xảy ra, tên tệp phải được sắp xếp theo phần ngày/giờ của tên tệp và người đặt tên cần tôn trọng điều này. [Nếu muốn một người đặt tên không tôn trọng sơ đồ này, thì nó sẽ cần được sử dụng trong một lớp con ghi đè phương thức để phù hợp với sơ đồ đặt tên tùy chỉnh. ]
Mới trong phiên bản 3. 3
máy quayNếu thuộc tính này được đặt thành có thể gọi được, phương thức sẽ ủy quyền cho thuộc tính có thể gọi này. Các tham số được truyền cho có thể gọi được là các tham số được truyền cho
Mới trong phiên bản 3. 3
tên_tệp xoay[tên_tệp_xoay]Sửa đổi tên tệp của tệp nhật ký khi xoay
Điều này được cung cấp để có thể cung cấp tên tệp tùy chỉnh
Việc triển khai mặc định gọi thuộc tính 'namer' của trình xử lý, nếu nó có thể gọi được, hãy chuyển tên mặc định cho nó. Nếu thuộc tính không thể gọi được [mặc định là StreamHandler
5], tên được trả về không thay đổi
default_name – Tên mặc định cho tệp nhật ký
Mới trong phiên bản 3. 3
xoay[nguồn , điểm đến]Khi xoay, xoay log hiện tại
Việc triển khai mặc định gọi thuộc tính 'rotator' của trình xử lý, nếu nó có thể gọi được, chuyển các đối số nguồn và đích cho nó. Nếu thuộc tính không thể gọi được [mặc định là StreamHandler
5], nguồn được đổi tên đơn giản thành đích
nguồn – Tên tệp nguồn. Đây thường là tên tệp cơ sở, e. g. 'kiểm tra. nhật ký'
dest – Tên tập tin đích. Đây thường là những gì nguồn được xoay, e. g. 'kiểm tra. đăng nhập. 1’
Mới trong phiên bản 3. 3
Lý do các thuộc tính tồn tại là để giúp bạn tiết kiệm phải phân lớp - bạn có thể sử dụng các lệnh gọi tương tự cho các trường hợp của và. Nếu trình gọi tên hoặc công cụ quay vòng có thể gọi được đưa ra một ngoại lệ, điều này sẽ được xử lý giống như bất kỳ ngoại lệ nào khác trong cuộc gọi StreamHandler
6, tôi. e. thông qua phương thức StreamHandler
2 của trình xử lý
Nếu bạn cần thực hiện nhiều thay đổi quan trọng hơn đối với quá trình xoay vòng, bạn có thể ghi đè các phương thức
Ví dụ, xem
Xoay FileHandler
Lớp, nằm trong mô-đun, hỗ trợ xoay các tệp nhật ký đĩa
lớp ghi nhật ký. người xử lý. RotatingFileHandler[tên tệp , chế độ='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None]Trả về một thể hiện mới của lớp. Tệp được chỉ định được mở và được sử dụng làm luồng để ghi nhật ký. Nếu chế độ không được chỉ định, StreamHandler
4 được sử dụng. Nếu mã hóa không phải là StreamHandler
5, nó được sử dụng để mở tệp bằng mã hóa đó. Nếu độ trễ là đúng, thì việc mở tệp bị hoãn lại cho đến khi lệnh gọi đầu tiên đến. Theo mặc định, tệp phát triển vô thời hạn. Nếu lỗi được cung cấp, nó sẽ xác định cách xử lý lỗi mã hóa
Bạn có thể sử dụng các giá trị maxBytes và backupCount để cho phép tệp cuộn qua ở kích thước định trước. Khi sắp vượt quá kích thước, tệp sẽ bị đóng và một tệp mới sẽ được mở âm thầm để xuất ra. Rollover xảy ra bất cứ khi nào tệp nhật ký hiện tại có độ dài gần maxBytes; . Khi backupCount khác không, hệ thống sẽ lưu các tệp nhật ký cũ bằng cách nối thêm các phần mở rộng ‘. 1', '. 2’ v.v. , đến tên tệp. Ví dụ: với backupCount là 5 và tên tệp cơ sở là StreamHandler
9, bạn sẽ nhận được StreamHandler
9, write[]
41, write[]
42, tối đa là write[]
43. Tệp được ghi vào luôn là StreamHandler
9. Khi tệp này được lấp đầy, nó sẽ bị đóng và đổi tên thành write[]
41, và nếu tệp write[]
41, write[]
42, v.v. tồn tại, sau đó chúng được đổi tên thành write[]
42, write[]
49, v.v. tương ứng
Đã thay đổi trong phiên bản 3. 6. Cũng như các giá trị chuỗi, các đối tượng cũng được chấp nhận cho đối số tên tệp.
Đã thay đổi trong phiên bản 3. 9. Thông số lỗi đã được thêm vào.
Rollover, như mô tả ở trên
phát ra[bản ghi]Xuất bản ghi vào tệp, phục vụ cho di chuột qua như được mô tả trước đây
TimedRotatingFileHandler
Lớp, nằm trong mô-đun, hỗ trợ xoay các tệp nhật ký đĩa theo các khoảng thời gian nhất định
lớp ghi nhật ký. người xử lý. TimedRotatingFileHandler[tên tệp , khi nào='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None]Trả về một thể hiện mới của lớp. Tệp được chỉ định được mở và được sử dụng làm luồng để ghi nhật ký. Khi xoay nó cũng đặt hậu tố tên tệp. Xoay vòng xảy ra dựa trên sản phẩm của thời điểm và khoảng thời gian
Bạn có thể sử dụng thời điểm để chỉ định loại khoảng thời gian. Danh sách các giá trị có thể ở bên dưới. Lưu ý rằng chúng không phân biệt chữ hoa chữ thường
Giá trị
Loại khoảng thời gian
Nếu/như thế nào atTime được sử dụng
write[]
4
giây
Làm ngơ
write[]
5
Phút
Làm ngơ
write[]
6
Giờ
Làm ngơ
write[]
7
ngày
Làm ngơ
write[]
8
Ngày trong tuần [0=thứ hai]
Được sử dụng để tính toán thời gian tái đầu tư ban đầu
write[]
9
Chuyển qua lúc nửa đêm, nếu atTime không được chỉ định, nếu không thì tại thời điểm atTime
Được sử dụng để tính toán thời gian tái đầu tư ban đầu
Khi sử dụng xoay vòng theo ngày trong tuần, hãy chỉ định 'W0' cho Thứ Hai, 'W1' cho Thứ Ba, v.v. cho đến 'W6' cho Chủ nhật. Trong trường hợp này, giá trị được truyền cho khoảng thời gian không được sử dụng
Hệ thống sẽ lưu các tệp nhật ký cũ bằng cách thêm phần mở rộng vào tên tệp. Các tiện ích mở rộng dựa trên ngày và giờ, sử dụng định dạng strftime flush[]
0 hoặc phần đầu của nó, tùy thuộc vào khoảng thời gian tái đầu tư
Khi tính toán thời gian tái đầu tư tiếp theo lần đầu tiên [khi trình xử lý được tạo], thời gian sửa đổi cuối cùng của tệp nhật ký hiện có hoặc thời gian hiện tại sẽ được sử dụng để tính toán khi nào sẽ xảy ra lần luân chuyển tiếp theo
Nếu đối số utc là đúng, thời gian trong UTC sẽ được sử dụng;
Nếu backupCount khác 0, thì tối đa các tệp backupCount sẽ được giữ lại và nếu nhiều tệp khác được tạo khi di chuột qua, thì tệp cũ nhất sẽ bị xóa. Logic xóa sử dụng khoảng thời gian để xác định tệp nào cần xóa, vì vậy việc thay đổi khoảng thời gian có thể khiến các tệp cũ nằm lung tung
Nếu độ trễ là đúng, thì việc mở tệp bị hoãn lại cho đến khi lệnh gọi đầu tiên đến
Nếu atTime không phải là StreamHandler
5, thì đó phải là phiên bản flush[]
3 chỉ định thời gian trong ngày khi quá trình chuyển đổi xảy ra, đối với các trường hợp quá trình chuyển đổi được đặt diễn ra “lúc nửa đêm” hoặc “vào một ngày cụ thể trong tuần”. Lưu ý rằng trong những trường hợp này, giá trị atTime được sử dụng một cách hiệu quả để tính toán lần tái đầu tư ban đầu và các lần tái đầu tư tiếp theo sẽ được tính toán thông qua phép tính khoảng thời gian thông thường
Nếu lỗi được chỉ định, nó được sử dụng để xác định cách xử lý lỗi mã hóa
Ghi chú
Việc tính toán thời gian tái đầu tư ban đầu được thực hiện khi trình xử lý được khởi tạo. Tính toán thời gian tái đầu tư tiếp theo chỉ được thực hiện khi tái đầu tư xảy ra và tái đầu tư chỉ xảy ra khi phát ra đầu ra. Nếu điều này không được ghi nhớ, nó có thể dẫn đến một số nhầm lẫn. Ví dụ: nếu khoảng thời gian "mỗi phút" được đặt, điều đó không có nghĩa là bạn sẽ luôn thấy các tệp nhật ký có thời gian [trong tên tệp] cách nhau một phút; . Mặt khác, nếu các thông báo ghi nhật ký chỉ được xuất năm phút một lần [giả sử], thì sẽ có khoảng trống trong thời gian tệp tương ứng với số phút không có đầu ra [và do đó không xảy ra chuyển đổi]
Đã thay đổi trong phiên bản 3. 4. tham số atTime đã được thêm vào.
Đã thay đổi trong phiên bản 3. 6. Cũng như các giá trị chuỗi, các đối tượng cũng được chấp nhận cho đối số tên tệp.
Đã thay đổi trong phiên bản 3. 9. Thông số lỗi đã được thêm vào.
doRollover[]Rollover, như mô tả ở trên
phát ra[bản ghi]Xuất bản ghi vào tệp, phục vụ cho việc tái đầu tư như mô tả ở trên
getFilesToDelete[]Trả về danh sách tên tệp sẽ bị xóa như một phần của rollover. Đây là những đường dẫn tuyệt đối của các tệp nhật ký sao lưu cũ nhất được ghi bởi trình xử lý
Trình xử lý ổ cắm
Lớp, nằm trong mô-đun, gửi đầu ra ghi nhật ký tới ổ cắm mạng. Lớp cơ sở sử dụng ổ cắm TCP
lớp ghi nhật ký. người xử lý. SocketHandler[máy chủ , cổng]Trả về một phiên bản mới của lớp dự định giao tiếp với một máy từ xa có địa chỉ được cung cấp bởi máy chủ và cổng
Đã thay đổi trong phiên bản 3. 4. Nếu flush[]
8 được chỉ định là StreamHandler
5, ổ cắm tên miền Unix được tạo bằng cách sử dụng giá trị trong logging.handlers
00 - nếu không, ổ cắm TCP được tạo.
Đóng ổ cắm
phát ra[]Chọn từ điển thuộc tính của bản ghi và ghi nó vào ổ cắm ở định dạng nhị phân. Nếu có lỗi với ổ cắm, hãy bỏ gói âm thầm. Nếu kết nối trước đó bị mất, hãy thiết lập lại kết nối. Để giải nén bản ghi ở đầu nhận thành một , hãy sử dụng hàm
xử lý Lỗi[]Xử lý lỗi xảy ra trong quá trình. Nguyên nhân rất có thể là do mất kết nối. Đóng ổ cắm để chúng tôi có thể thử lại vào sự kiện tiếp theo
makeSocket[]Đây là một phương thức xuất xưởng cho phép các lớp con xác định loại ổ cắm chính xác mà chúng muốn. Việc triển khai mặc định tạo một ổ cắm TCP []
makePickle[bản ghi]Chọn từ điển thuộc tính của bản ghi ở định dạng nhị phân với tiền tố độ dài và trả lại bản ghi ở trạng thái sẵn sàng để truyền qua ổ cắm. Các chi tiết của hoạt động này là tương đương với
data = pickle.dumps[record_attr_dict, 1] datalen = struct.pack['>L', len[data]] return datalen + data
Lưu ý rằng dưa chua không hoàn toàn an toàn. Nếu bạn lo ngại về bảo mật, bạn có thể muốn ghi đè phương thức này để triển khai cơ chế an toàn hơn. Ví dụ: bạn có thể ký các dưa chua bằng HMAC và sau đó xác minh chúng ở đầu nhận hoặc cách khác, bạn có thể vô hiệu hóa tính năng bỏ chọn các đối tượng chung ở đầu nhận
gửi[gói]Gửi gói chuỗi byte được chọn đến ổ cắm. Định dạng của chuỗi byte đã gửi được mô tả trong tài liệu về
Chức năng này cho phép gửi một phần, điều này có thể xảy ra khi mạng bận
createSocket[]Cố gắng tạo một ổ cắm; . Khi gặp lỗi ban đầu, trình xử lý sẽ bỏ thông báo mà nó đang cố gửi. Khi các tin nhắn tiếp theo được xử lý bởi cùng một phiên bản, nó sẽ không thử kết nối cho đến khi một thời gian trôi qua. Các tham số mặc định sao cho độ trễ ban đầu là một giây và nếu sau độ trễ đó mà kết nối vẫn không thể thực hiện được, trình xử lý sẽ nhân đôi độ trễ mỗi lần lên tối đa là 30 giây
Hành vi này được kiểm soát bởi các thuộc tính trình xử lý sau
logging.handlers
06 [độ trễ ban đầu, mặc định là 1. 0 giây]logging.handlers
07 [số nhân, mặc định là 2. 0]logging.handlers
08 [độ trễ tối đa, mặc định là 30. 0 giây]
Điều này có nghĩa là nếu trình nghe từ xa khởi động sau khi trình xử lý đã được sử dụng, bạn có thể bị mất tin nhắn [vì trình xử lý thậm chí sẽ không thử kết nối cho đến khi hết thời gian trễ mà chỉ âm thầm gửi tin nhắn trong thời gian trễ]
DatagramHandler
Lớp, nằm trong mô-đun, kế thừa từ để hỗ trợ gửi thông báo ghi nhật ký qua ổ cắm UDP
lớp ghi nhật ký. người xử lý. DatagramHandler[máy chủ , cổng]Trả về một phiên bản mới của lớp dự định giao tiếp với một máy từ xa có địa chỉ được cung cấp bởi máy chủ và cổng
Ghi chú
Vì UDP không phải là giao thức phát trực tuyến nên không có kết nối liên tục giữa phiên bản của trình xử lý này và máy chủ lưu trữ. Vì lý do này, khi sử dụng ổ cắm mạng, có thể phải thực hiện tra cứu DNS mỗi khi một sự kiện được ghi lại, điều này có thể gây ra một số độ trễ cho hệ thống. Nếu điều này ảnh hưởng đến bạn, bạn có thể tự tra cứu và khởi tạo trình xử lý này bằng cách sử dụng địa chỉ IP đã tra cứu thay vì tên máy chủ
Đã thay đổi trong phiên bản 3. 4. Nếu flush[]
8 được chỉ định là StreamHandler
5, ổ cắm tên miền Unix được tạo bằng cách sử dụng giá trị trong logging.handlers
00 - nếu không, ổ cắm UDP được tạo.
Chọn từ điển thuộc tính của bản ghi và ghi nó vào ổ cắm ở định dạng nhị phân. Nếu có lỗi với ổ cắm, hãy bỏ gói âm thầm. Để giải nén bản ghi ở đầu nhận thành một , hãy sử dụng hàm
makeSocket[]Phương thức xuất xưởng của ở đây được ghi đè để tạo ổ cắm UDP []
gửi[s]Gửi một chuỗi byte được chọn đến một ổ cắm. Định dạng của chuỗi byte đã gửi được mô tả trong tài liệu về
SysLogHandler
Lớp, nằm trong mô-đun, hỗ trợ gửi thông báo ghi nhật ký đến nhật ký hệ thống Unix từ xa hoặc cục bộ
lớp ghi nhật ký. người xử lý. SysLogHandler[địa chỉ=[ . SOCK_DGRAM SYSLOG_UDP_PORT], facility=LOG_USER, socktype=socket.SOCK_DGRAM]Trả về một phiên bản mới của lớp dự định giao tiếp với một máy Unix từ xa có địa chỉ được cung cấp bởi địa chỉ dưới dạng bộ dữ liệu logging.handlers
24. Nếu địa chỉ không được chỉ định, logging.handlers
25 được sử dụng. Địa chỉ được sử dụng để mở một ổ cắm. Một cách khác để cung cấp bộ dữ liệu logging.handlers
24 là cung cấp địa chỉ dưới dạng chuỗi, ví dụ: '/dev/log'. Trong trường hợp này, một ổ cắm tên miền Unix được sử dụng để gửi thông báo tới nhật ký hệ thống. Nếu cơ sở không được chỉ định, logging.handlers
27 được sử dụng. Loại ổ cắm được mở tùy thuộc vào đối số socktype, được đặt mặc định và do đó mở ổ cắm UDP. Để mở một ổ cắm TCP [để sử dụng với các daemon nhật ký hệ thống mới hơn như rsyslog], hãy chỉ định một giá trị là
Lưu ý rằng nếu máy chủ của bạn không nghe trên cổng UDP 514, có thể không hoạt động. Trong trường hợp đó, hãy kiểm tra xem bạn nên sử dụng địa chỉ nào cho ổ cắm tên miền - địa chỉ này phụ thuộc vào hệ thống. Ví dụ: trên Linux, nó thường là '/dev/log' nhưng trên OS/X, nó là '/var/run/syslog'. Bạn sẽ cần kiểm tra nền tảng của mình và sử dụng địa chỉ thích hợp [bạn có thể cần thực hiện việc kiểm tra này trong thời gian chạy nếu ứng dụng của bạn cần chạy trên nhiều nền tảng]. Trên Windows, bạn phải sử dụng tùy chọn UDP
Ghi chú
Trên macOS 12. x [Monterey], Apple đã thay đổi hành vi của trình nền nhật ký hệ thống của họ - nó không còn lắng nghe trên ổ cắm tên miền nữa. Do đó, bạn không thể mong đợi làm việc trên hệ thống này
Xem gh-91070 để biết thêm thông tin
Đã thay đổi trong phiên bản 3. 2. loại vớ đã được thêm vào.
đóng[]Đóng ổ cắm cho máy chủ từ xa
createSocket[]Cố gắng tạo một ổ cắm và nếu đó không phải là ổ cắm datagram, hãy kết nối nó với đầu kia. Phương thức này được gọi trong quá trình khởi tạo trình xử lý, nhưng nó không được coi là lỗi nếu đầu kia không nghe vào thời điểm này - phương thức sẽ được gọi lại khi phát ra một sự kiện, nếu nhưng nó không được coi là lỗi nếu đầu kia
Mới trong phiên bản 3. 11
phát ra[bản ghi]Bản ghi được định dạng và sau đó được gửi đến máy chủ nhật ký hệ thống. Nếu có thông tin ngoại lệ, nó sẽ không được gửi đến máy chủ
Đã thay đổi trong phiên bản 3. 2. 1. [Xem. bpo-12168. ] Trong các phiên bản trước, thông báo được gửi đến trình nền nhật ký hệ thống luôn được kết thúc bằng byte NUL, vì các phiên bản đầu tiên của các trình tiện ích này mong đợi một thông báo kết thúc NUL - ngay cả khi nó không có trong thông số kỹ thuật có liên quan [RFC 5424]. Các phiên bản gần đây hơn của các trình tiện ích này không mong đợi byte NUL nhưng sẽ loại bỏ nó nếu nó ở đó và thậm chí các trình tiện ích gần đây hơn [tuân thủ chặt chẽ hơn với RFC 5424] chuyển byte NUL vào như một phần của thông báo.
Để cho phép xử lý dễ dàng hơn các thông báo nhật ký hệ thống khi đối mặt với tất cả các hành vi daemon khác nhau này, việc nối thêm byte NUL đã được thực hiện có thể định cấu hình, thông qua việc sử dụng thuộc tính cấp lớp, logging.handlers
32. Điều này mặc định là logging.handlers
33 [duy trì hành vi hiện có] nhưng có thể được đặt thành logging.handlers
34 trên phiên bản logging.handlers
21 để phiên bản đó không nối thêm bộ kết thúc NUL
Đã thay đổi trong phiên bản 3. 3. [Xem. bpo-12419. ] Trong các phiên bản trước, không có cơ sở nào cho tiền tố “nhận dạng” hoặc “thẻ” để xác định nguồn gốc của thông báo. Điều này hiện có thể được chỉ định bằng cách sử dụng thuộc tính cấp lớp, mặc định là logging.handlers
36 để duy trì hành vi hiện có, nhưng có thể được ghi đè trên phiên bản logging.handlers
21 để phiên bản đó thêm nhận dạng vào mọi thư được xử lý. Lưu ý rằng nhận dạng được cung cấp phải là văn bản, không phải byte và được thêm vào trước thông báo chính xác như.
Mã hóa cơ sở và mức độ ưu tiên thành một số nguyên. Bạn có thể truyền vào chuỗi hoặc số nguyên - nếu chuỗi được truyền, từ điển ánh xạ bên trong được sử dụng để chuyển đổi chúng thành số nguyên
Các giá trị logging.handlers
38 tượng trưng được xác định trong và phản ánh các giá trị được xác định trong tệp tiêu đề logging.handlers
40
ưu tiên
Tên [chuỗi]
giá trị tượng trưng
logging.handlers
41
LOG_ALERT
logging.handlers
42 hoặc logging.handlers
43
LOG_CRIT
logging.handlers
44
LOG_DEBUG
logging.handlers
45 hoặc logging.handlers
46
LOG_EMERG
logging.handlers
47 hoặc logging.handlers
48
LOG_ERR
logging.handlers
49
LOG_INFO
logging.handlers
50
LOG_THÔNG BÁO
logging.handlers
51 hoặc logging.handlers
52
LOG_WARNING
Cơ sở
Tên [chuỗi]
giá trị tượng trưng
logging.handlers
53
LOG_AUTH
logging.handlers
54
LOG_AUTHPRIV
logging.handlers
55
LOG_CRON
logging.handlers
56
LOG_DAEMON
logging.handlers
57
ĐĂNG_FTP
logging.handlers
58
LOG_KERN
logging.handlers
59
LOG_LPR
logging.handlers
60
LOG_MAIL
logging.handlers
61
LOG_TIN TỨC
logging.handlers
62
LOG_SYSLOG
logging.handlers
63
LOG_USER
logging.handlers
64
LOG_UUCP
logging.handlers
65
LOG_LOCAL0
logging.handlers
66
LOG_LOCAL1
logging.handlers
67
LOG_LOCAL2
logging.handlers
68
LOG_LOCAL3
logging.handlers
69
LOG_LOCAL4
logging.handlers
70
LOG_LOCAL5
logging.handlers
71
LOG_LOCAL6
logging.handlers
72
LOG_LOCAL7
mapPriority[tên cấp độ]Ánh xạ tên mức ghi nhật ký thành tên ưu tiên nhật ký hệ thống. Bạn có thể cần phải ghi đè điều này nếu bạn đang sử dụng các mức tùy chỉnh hoặc nếu thuật toán mặc định không phù hợp với nhu cầu của bạn. Thuật toán mặc định ánh xạ logging.handlers
73, logging.handlers
74, logging.handlers
75, logging.handlers
76 và logging.handlers
77 thành các tên nhật ký hệ thống tương đương và tất cả các tên cấp độ khác thành 'cảnh báo'
NTEventLogHandler
Lớp, nằm trong mô-đun, hỗ trợ gửi thông báo ghi nhật ký tới nhật ký sự kiện Windows NT, Windows 2000 hoặc Windows XP cục bộ. Trước khi bạn có thể sử dụng nó, bạn cần cài đặt tiện ích mở rộng Win32 của Mark Hammond cho Python
lớp ghi nhật ký. người xử lý. NTEventLogHandler[tên ứng dụng , dllname=None, logtype='Application']Trả về một thể hiện mới của lớp. Tên ứng dụng được sử dụng để xác định tên ứng dụng khi nó xuất hiện trong nhật ký sự kiện. Một mục đăng ký thích hợp được tạo bằng tên này. Tên dll nên cung cấp tên đường dẫn đủ điều kiện của một. dll hoặc. exe chứa các định nghĩa thông báo để giữ trong nhật ký [nếu không được chỉ định, thì sử dụng logging.handlers
81 - phần này được cài đặt với các tiện ích mở rộng Win32 và chứa một số định nghĩa thông báo giữ chỗ cơ bản. Lưu ý rằng việc sử dụng các trình giữ chỗ này sẽ làm cho nhật ký sự kiện của bạn trở nên lớn hơn vì toàn bộ nguồn thông báo được lưu giữ trong nhật ký. Nếu bạn muốn nhật ký mỏng hơn, bạn phải chuyển tên của chính mình. dll hoặc. exe chứa định nghĩa thông báo bạn muốn sử dụng trong nhật ký sự kiện]. Loại nhật ký là một trong số logging.handlers
82, logging.handlers
83 hoặc logging.handlers
84 và mặc định là logging.handlers
82
Tại thời điểm này, bạn có thể xóa tên ứng dụng khỏi sổ đăng ký dưới dạng nguồn của các mục nhật ký sự kiện. Tuy nhiên, nếu bạn làm điều này, bạn sẽ không thể xem các sự kiện như bạn dự định trong Trình xem nhật ký sự kiện - nó cần có thể truy cập vào sổ đăng ký để lấy. tên dll. Phiên bản hiện tại không làm điều này
phát ra[bản ghi]Xác định ID thông báo, danh mục sự kiện và loại sự kiện, sau đó ghi thông báo vào nhật ký sự kiện NT
getEventCategory[bản ghi]Trả về danh mục sự kiện cho bản ghi. Ghi đè điều này nếu bạn muốn chỉ định danh mục của riêng mình. Phiên bản này trả về 0
getEventType[bản ghi]Trả về loại sự kiện cho bản ghi. Ghi đè lên điều này nếu bạn muốn chỉ định các loại của riêng bạn. Phiên bản này thực hiện ánh xạ bằng cách sử dụng thuộc tính typemap của trình xử lý, thuộc tính này được thiết lập trong logging.handlers
86 thành một từ điển chứa ánh xạ cho logging.handlers
73, logging.handlers
74, logging.handlers
75, logging.handlers
76 và logging.handlers
77. Nếu bạn đang sử dụng các cấp độ của riêng mình, bạn sẽ cần ghi đè phương thức này hoặc đặt một từ điển phù hợp vào thuộc tính bản đồ của trình xử lý
Trả về ID tin nhắn cho bản ghi. Nếu bạn đang sử dụng tin nhắn của riêng mình, bạn có thể thực hiện việc này bằng cách chuyển tin nhắn đến bộ ghi dưới dạng ID thay vì chuỗi định dạng. Sau đó, tại đây, bạn có thể sử dụng tra cứu từ điển để lấy ID tin nhắn. Phiên bản này trả về 1, là ID tin nhắn cơ sở trong logging.handlers
92
Trình xử lý SMTP
Lớp, nằm trong mô-đun, hỗ trợ gửi thông báo ghi nhật ký đến địa chỉ email qua SMTP
lớp ghi nhật ký. người xử lý. SMTPHandler[mailhost , fromaddr . 0, toaddrs, subject, credentials=None, secure=None, timeout=1.0]Trả về một thể hiện mới của lớp. Phiên bản được khởi tạo với địa chỉ từ và đến và dòng chủ đề của email. Toaddrs phải là một danh sách các chuỗi. Để chỉ định cổng SMTP không chuẩn, hãy sử dụng định dạng bộ [máy chủ, cổng] cho đối số máy chủ lưu trữ. Nếu bạn sử dụng một chuỗi, cổng SMTP tiêu chuẩn sẽ được sử dụng. Nếu máy chủ SMTP của bạn yêu cầu xác thực, bạn có thể chỉ định một bộ [tên người dùng, mật khẩu] cho đối số thông tin xác thực
Để chỉ định việc sử dụng giao thức bảo mật [TLS], hãy chuyển một bộ vào đối số bảo mật. Điều này sẽ chỉ được sử dụng khi thông tin đăng nhập xác thực được cung cấp. Bộ dữ liệu phải là bộ trống hoặc bộ giá trị đơn có tên của tệp khóa hoặc bộ giá trị 2 có tên của tệp khóa và tệp chứng chỉ. [Bộ dữ liệu này được truyền cho phương thức. ]
Thời gian chờ có thể được chỉ định để liên lạc với máy chủ SMTP bằng cách sử dụng đối số thời gian chờ
Mới trong phiên bản 3. 3. Đã thêm đối số thời gian chờ.
phát ra[bản ghi]Định dạng bản ghi và gửi nó đến người nhận được chỉ định
getSubject[bản ghi]Nếu bạn muốn chỉ định dòng chủ đề phụ thuộc vào bản ghi, hãy ghi đè phương thức này
Trình xử lý bộ nhớ
Lớp, nằm trong mô-đun, hỗ trợ đệm các bản ghi nhật ký trong bộ nhớ, định kỳ xóa chúng tới trình xử lý đích. Xả xảy ra bất cứ khi nào bộ đệm đầy hoặc khi nhìn thấy một sự kiện có mức độ nghiêm trọng nhất định trở lên
là một lớp con của lớp tổng quát hơn, là một lớp trừu tượng. Bộ đệm này ghi lại các bản ghi trong bộ nhớ. Bất cứ khi nào mỗi bản ghi được thêm vào bộ đệm, một kiểm tra được thực hiện bằng cách gọi StreamHandler
01 để xem liệu bộ đệm có nên được xóa hay không. Nếu cần, thì flush[]
dự kiến sẽ thực hiện việc xả nước
Khởi tạo trình xử lý với bộ đệm có dung lượng đã chỉ định. Ở đây, dung lượng có nghĩa là số lượng bản ghi nhật ký được lưu vào bộ đệm
phát ra[bản ghi]Nối bản ghi vào bộ đệm. Nếu trả về true, gọi để xử lý bộ đệm
xả[]Bạn có thể ghi đè điều này để thực hiện hành vi xả tùy chỉnh. Phiên bản này chỉ làm trống bộ đệm
nênFlush[bản ghi]Trả lại logging.handlers
33 nếu bộ đệm hết dung lượng. Phương thức này có thể được ghi đè để thực hiện các chiến lược xóa tùy chỉnh
Trả về một thể hiện mới của lớp. Phiên bản được khởi tạo với kích thước dung lượng bộ đệm [số lượng bản ghi được lưu vào bộ đệm]. Nếu flushLevel không được chỉ định, logging.handlers
76 được sử dụng. Nếu không có mục tiêu nào được chỉ định, mục tiêu sẽ cần được đặt bằng cách sử dụng trước khi trình xử lý này thực hiện bất kỳ điều gì hữu ích. Nếu flushOnClose được chỉ định là logging.handlers
34, thì bộ đệm sẽ không bị xóa khi đóng trình xử lý. Nếu không được chỉ định hoặc được chỉ định là logging.handlers
33, hành vi xóa bộ đệm trước đó sẽ xảy ra khi đóng trình xử lý
Đã thay đổi trong phiên bản 3. 6. Tham số flushOnClose đã được thêm vào.
đóng[]Gọi , đặt mục tiêu thành StreamHandler
5 và xóa bộ đệm
Đối với a , flushing có nghĩa là chỉ gửi các bản ghi được đệm tới đích, nếu có. Bộ đệm cũng bị xóa khi điều này xảy ra. Ghi đè nếu bạn muốn hành vi khác
setTarget[mục tiêu]Đặt trình xử lý đích cho trình xử lý này
nênFlush[bản ghi]Kiểm tra bộ đệm đầy hoặc bản ghi ở flushLevel hoặc cao hơn
Trình xử lý HTTP
Lớp, nằm trong mô-đun, hỗ trợ gửi thông báo ghi nhật ký tới máy chủ web, sử dụng ngữ nghĩa StreamHandler
16 hoặc StreamHandler
17
Trả về một thể hiện mới của lớp. Máy chủ có thể ở dạng StreamHandler
19, nếu bạn cần sử dụng một số cổng cụ thể. Nếu không có phương thức nào được chỉ định, thì sử dụng StreamHandler
16. Nếu bảo mật là đúng, kết nối HTTPS sẽ được sử dụng. Tham số ngữ cảnh có thể được đặt thành một phiên bản để định cấu hình cài đặt SSL được sử dụng cho kết nối HTTPS. Nếu thông tin đăng nhập được chỉ định, thì đó phải là 2 bộ bao gồm tên người dùng và mật khẩu, sẽ được đặt trong tiêu đề 'Ủy quyền' HTTP bằng cách sử dụng xác thực Cơ bản. Nếu bạn chỉ định thông tin đăng nhập, bạn cũng nên chỉ định safe=True để tên người dùng và mật khẩu của bạn không được chuyển dưới dạng văn bản rõ ràng qua dây
Đã thay đổi trong phiên bản 3. 5. Tham số bối cảnh đã được thêm vào.
mapLogRecord[bản ghi]Cung cấp một từ điển, dựa trên StreamHandler
22, được mã hóa URL và gửi đến máy chủ web. Việc triển khai mặc định chỉ trả về StreamHandler
23. Phương thức này có thể bị ghi đè nếu e. g. chỉ một tập hợp con của sẽ được gửi đến máy chủ web hoặc nếu cần tùy chỉnh cụ thể hơn những gì được gửi đến máy chủ
Gửi bản ghi đến máy chủ web dưới dạng từ điển được mã hóa URL. Phương thức được sử dụng để chuyển đổi bản ghi thành từ điển được gửi
Ghi chú
Vì việc chuẩn bị một bản ghi để gửi nó đến một máy chủ web không giống như một thao tác định dạng chung, nên việc sử dụng để chỉ định một cho một không có tác dụng. Thay vì gọi , trình xử lý này gọi và sau đó mã hóa từ điển ở dạng phù hợp để gửi đến máy chủ web
Trình xử lý hàng đợi
Mới trong phiên bản 3. 2
Lớp, nằm trong mô-đun, hỗ trợ gửi thông báo ghi nhật ký đến một hàng đợi, chẳng hạn như những thông báo được triển khai trong mô-đun hoặc
Cùng với lớp, có thể được sử dụng để cho phép các trình xử lý thực hiện công việc của họ trên một luồng riêng biệt với luồng thực hiện ghi nhật ký. Điều này rất quan trọng trong các ứng dụng web và cả các ứng dụng dịch vụ khác, nơi các luồng phục vụ máy khách cần phản hồi nhanh nhất có thể, trong khi mọi hoạt động có khả năng chậm [chẳng hạn như gửi email qua ] được thực hiện trên một luồng riêng biệt
lớp ghi nhật ký. người xử lý. QueueHandler[hàng đợi]Trả về một thể hiện mới của lớp. Thể hiện được khởi tạo với hàng đợi để gửi tin nhắn đến. Hàng đợi có thể là bất kỳ đối tượng giống hàng đợi nào; . Hàng đợi không bắt buộc phải có API theo dõi tác vụ, nghĩa là bạn có thể sử dụng các phiên bản cho hàng đợi
Ghi chú
Nếu bạn đang sử dụng, bạn nên tránh sử dụng và thay vào đó hãy sử dụng
phát ra[bản ghi]Enqueues kết quả của việc chuẩn bị LogRecord. Nếu một ngoại lệ xảy ra [e. g. vì một hàng đợi giới hạn đã đầy], phương thức này được gọi để xử lý lỗi. Điều này có thể dẫn đến việc bản ghi bị hủy một cách lặng lẽ [nếu StreamHandler
46 là logging.handlers
34] hoặc một thông báo được in tới StreamHandler
48 [nếu StreamHandler
46 là logging.handlers
33]
Lập hồ sơ xếp hàng. Đối tượng được phương thức này trả về được xếp vào hàng đợi
Việc triển khai cơ sở định dạng bản ghi để hợp nhất thông báo, đối số, ngoại lệ và thông tin ngăn xếp, nếu có. Nó cũng xóa các mục không thể chọn khỏi bản ghi tại chỗ. Cụ thể, nó ghi đè các thuộc tính StreamHandler
51 và StreamHandler
52 của bản ghi bằng thông báo đã hợp nhất [thu được bằng cách gọi phương thức của trình xử lý] và đặt các thuộc tính StreamHandler
54, StreamHandler
55 và StreamHandler
56 thành StreamHandler
5
Bạn có thể muốn ghi đè phương thức này nếu muốn chuyển đổi bản ghi thành chuỗi dict hoặc JSON hoặc gửi bản sao đã sửa đổi của bản ghi trong khi vẫn giữ nguyên bản gốc
Ghi chú
Việc triển khai cơ sở định dạng thư với các đối số, đặt các thuộc tính StreamHandler
52 và StreamHandler
51 cho thư được định dạng và đặt các thuộc tính StreamHandler
54 và StreamHandler
56 thành StreamHandler
5 để cho phép chọn lọc và ngăn chặn các nỗ lực định dạng tiếp theo. Điều này có nghĩa là trình xử lý ở bên sẽ không có thông tin để thực hiện định dạng tùy chỉnh, e. g. ngoại lệ. Bạn có thể muốn phân lớp StreamHandler
32 và ghi đè phương thức này lên e. g. tránh đặt StreamHandler
56 thành StreamHandler
5. Lưu ý rằng các thay đổi của StreamHandler
52 / StreamHandler
51 / StreamHandler
54 có liên quan đến việc đảm bảo bản ghi có thể chọn được và bạn có thể hoặc không thể tránh làm điều đó tùy thuộc vào việc StreamHandler
54 của bạn có thể chọn được hay không. [Lưu ý rằng bạn có thể phải xem xét không chỉ mã của riêng mình mà còn cả mã trong bất kỳ thư viện nào bạn sử dụng. ]
Liệt kê bản ghi trên hàng đợi bằng cách sử dụng StreamHandler
71;
QueueListener
Mới trong phiên bản 3. 2
Lớp, nằm trong mô-đun, hỗ trợ nhận thông báo ghi nhật ký từ hàng đợi, chẳng hạn như các thông báo được triển khai trong mô-đun hoặc. Các tin nhắn được nhận từ một hàng đợi trong một luồng nội bộ và được chuyển, trên cùng một luồng, tới một hoặc nhiều trình xử lý để xử lý. Mặc dù bản thân nó không phải là trình xử lý, nhưng nó được ghi lại ở đây vì nó hoạt động song song với
Cùng với lớp, có thể được sử dụng để cho phép các trình xử lý thực hiện công việc của họ trên một luồng riêng biệt với luồng thực hiện ghi nhật ký. Điều này rất quan trọng trong các ứng dụng web và cả các ứng dụng dịch vụ khác, nơi các luồng phục vụ máy khách cần phản hồi nhanh nhất có thể, trong khi mọi hoạt động có khả năng chậm [chẳng hạn như gửi email qua ] được thực hiện trên một luồng riêng biệt
lớp ghi nhật ký. người xử lý. QueueListener[hàng đợi , *handlers, respect_handler_level=False]Trả về một thể hiện mới của lớp. Phiên bản được khởi tạo với hàng đợi để gửi tin nhắn đến và danh sách các trình xử lý sẽ xử lý các mục được đặt trên hàng đợi. Hàng đợi có thể là bất kỳ đối tượng giống hàng đợi nào; . Hàng đợi không bắt buộc phải có API theo dõi tác vụ [mặc dù nó được sử dụng nếu có], nghĩa là bạn có thể sử dụng các phiên bản cho hàng đợi
Ghi chú
Nếu bạn đang sử dụng, bạn nên tránh sử dụng và thay vào đó hãy sử dụng
Nếu StreamHandler
87 là logging.handlers
33, cấp độ của trình xử lý được tôn trọng [so với cấp độ của tin nhắn] khi quyết định có chuyển tin nhắn đến trình xử lý đó hay không;
Đã thay đổi trong phiên bản 3. 5. Đối số StreamHandler
87 đã được thêm vào.
Xếp hàng một bản ghi và trả lại nó, chặn tùy chọn
Việc triển khai cơ sở sử dụng StreamHandler
90. Bạn có thể muốn ghi đè phương thức này nếu bạn muốn sử dụng thời gian chờ hoặc làm việc với việc triển khai hàng đợi tùy chỉnh
Lập biên bản xử lý
Việc triển khai này chỉ trả về bản ghi đã chuyển vào. Bạn có thể muốn ghi đè phương thức này nếu bạn cần thực hiện bất kỳ thao tác sắp xếp hoặc thao tác tùy chỉnh nào đối với bản ghi trước khi chuyển nó tới trình xử lý
xử lý[bản ghi]Xử lý một bản ghi
Điều này chỉ lặp qua các trình xử lý cung cấp cho họ bản ghi để xử lý. Đối tượng thực tế được chuyển đến trình xử lý là đối tượng được trả về từ
bắt đầu[]Bắt đầu người nghe
Điều này khởi động một luồng nền để theo dõi hàng đợi để LogRecords xử lý
dừng[]Dừng người nghe
Điều này yêu cầu luồng kết thúc và sau đó đợi nó làm như vậy. Lưu ý rằng nếu bạn không gọi điều này trước khi ứng dụng của bạn thoát, có thể có một số bản ghi vẫn còn trên hàng đợi và sẽ không được xử lý
enqueue_sentinel[]Viết một lính canh vào hàng đợi để báo cho người nghe thoát. Việc triển khai này sử dụng StreamHandler
71. Bạn có thể muốn ghi đè phương thức này nếu bạn muốn sử dụng thời gian chờ hoặc làm việc với việc triển khai hàng đợi tùy chỉnh