Hướng dẫn python logging latency - độ trễ ghi nhật ký python

Tôi đang phát triển API REST thời gian thực bằng Python3+Chai/UWSGI. Tôi đã trải nghiệm độ trễ trong mã của mình, đôi khi 100 người, điều này quan trọng trong ứng dụng của tôi.

Sử dụng mô -đun logging, tôi đã cố gắng xác định các phần chậm của mã của mình, in thời gian các mã số đã mất bao lâu để chạy. Tôi biết đây là một cách cực kỳ kém để định hình mã, nhưng đôi khi nó có thể thực hiện công việc khá tốt.

Mặc dù tôi đã xác định được một số bộ phận chậm, tôi vẫn thiếu một cái gì đó - các phần riêng lẻ dường như mất 10 giây, nhưng rất thường xuyên chúng mất 100 cái MS nói chung. Sau một số thí nghiệm ngày càng điên rồ khiến tôi gần như hoàn toàn điên rồ, tôi đã đến như sau:

t = round(100*time.time())
logging.info('[%s] Foo' % t)
logging.info('[%s] Bar' % t)

Đáng ngạc nhiên, nó cho:

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar

Mặc dù điều này có vẻ khó tin, có hai cuộc gọi logging.info() do đó, và vì một số lý do, có một khoảng cách gần 800 ms giữa chúng. Có ai có thể cho tôi biết những gì đang xảy ra? Đáng chú ý là nếu có nhiều cuộc gọi info(), độ trễ chỉ xuất hiện một lần trong toàn bộ phương thức API, thường xuyên nhất là ngay từ đầu (sau cuộc gọi đầu tiên). Giả thuyết duy nhất của tôi là độ trễ của đĩa, có một số công nhân (nhưng không quá nhiều!) Chạy đồng thời và tôi đang sử dụng đĩa quay, không có SSD. Nhưng tôi nghĩ rằng có bộ đệm và hệ điều hành sẽ làm không đồng bộ đĩa cho tôi. Tôi có sai trong các giả định của mình không? Tôi có nên tránh đăng nhập hoàn toàn để tránh độ trễ không?

CHỈNH SỬA

Dựa trên đề xuất của Vinay Sajip, tôi đã chuyển sang mã khởi tạo sau:

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])

Có vẻ như nó hoạt động tốt (nếu tôi nhận xét queue_listener.start(), không có đầu ra), nhưng độ trễ tương tự vẫn xuất hiện. Tôi không thấy làm thế nào nó thậm chí có thể, cuộc gọi nên không chặn. Tôi cũng đặt gc.collect() vào cuối mỗi yêu cầu để đảm bảo vấn đề không phải do người thu gom rác - mà không có bất kỳ ảnh hưởng nào. Tôi cũng đã cố gắng tắt ghi nhật ký cho cả ngày. Các độ trễ biến mất, vì vậy tôi nghĩ rằng nguồn của chúng phải nằm trong mô -đun logging ...

Mã nguồn: Lib/Logging/Handlers.py Lib/logging/handlers.py


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ý (

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
0,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
1 và
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
2) thực sự được xác định trong chính mô -đun
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
3, nhưng đã được ghi lại ở đây cùng với các trình xử lý khác.

Streamhandler¶

Lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
0, nằm trong gói lõi
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
3, gửi đầu ra đăng nhập vào các luồng như sys.stdout, sys.stderr hoặc bất kỳ đối tượng giống như tệp nào (hoặc, chính xác hơn là bất kỳ đối tượng nào hỗ trợ các phương thức
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
6 và
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
7).

classLogging.StreamHandler (stream = none) ¶logging.StreamHandler(stream=None)

Trả về một thể hiện mới của lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
0. Nếu luồng được chỉ định, phiên bản sẽ sử dụng nó để ghi nhật ký đầu ra; Nếu không, sys.stderr sẽ được sử dụng.

phát ra (ghi) ¶(record)

Nếu một định dạng được chỉ định, nó được sử dụng để định dạng bản ghi. Bản ghi sau đó được viết vào luồng theo sau là

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
9. Nếu thông tin ngoại lệ có mặt, nó được định dạng bằng
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
0 và được thêm vào luồng.

tuôn ra()¶()

Xóa luồng bằng cách gọi phương thức

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
7 của nó. Lưu ý rằng phương pháp
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
2 được kế thừa từ
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
3 và do đó không cần đầu ra, do đó, một cuộc gọi
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
7 rõ ràng có thể cần thiết đôi khi.

setstream (luồng) ¶(stream)

Đặt luồng phiên bản thành giá trị được chỉ định, nếu nó khác. Luồng cũ được xả trước khi luồng mới được đặt.

Thông số

Phát trực tuyến - luồng mà người xử lý nên sử dụng. – The stream that the handler should use.

Trả lại

luồng cũ, nếu luồng được thay đổi, hoặc không có gì nếu đó là không.

Mới trong phiên bản 3.7.

Kẻ hủy diệt¶

Chuỗi được sử dụng làm Kẻ hủy diệt khi viết một bản ghi được định dạng vào luồng. Giá trị mặc định là

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
5.

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 Handler ____ ____19 cho chuỗi trống.

Trong các phiên bản trước, Terminator đã được mã hóa cứng là

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
5.

Mới trong phiên bản 3.2.

FileHandler¶

Lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
1, nằm trong gói lõi
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
3, gửi đầu ra ghi nhật ký vào tệp đĩa. Nó kế thừa chức năng đầu ra từ
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
0.

classLogging.fileHandler (fileName, mode = 'a', entsing = none, delay = false, error = none) ¶logging.FileHandler(filename, mode='a', encoding=None, delay=False, errors=None)

Trả về một thể hiện mới của lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
1. Tệp được chỉ định được mở và sử dụng làm luồng để ghi nhật ký. Nếu chế độ không được chỉ định,
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
2 được sử dụng. Nếu mã hóa không phải là
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3, nó được sử dụng để mở tệp với mã hóa đó. Nếu độ trễ là đúng, thì việc mở tệp được hoãn lại cho đến khi cuộc gọi đầu tiên đến
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
4. 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

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
5 cũng được chấp nhận cho đối số tên tệp.As well as string values,
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
5 objects are also accepted for the filename argument.

Thay đổi trong phiên bản 3.9: Tham số lỗi đã được thêm vào.The errors parameter was added.

gần()¶()

Đóng tệp.

phát ra (ghi) ¶(record)

Xuất bản ghi vào tệp.

Lưu ý rằng nếu tệp đã bị đóng do đóng cửa khi đăng nhập ở 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

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
2, nằm trong gói lõi
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
3, 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ý ‘không có op để sử dụng bởi các nhà phát triển thư viện.

classLogging.nullHandler¶logging.NullHandler

Trả về một thể hiện mới của lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
2.

phát ra (ghi) ¶(record)

Xuất bản ghi vào tệp.

Lưu ý rằng nếu tệp đã bị đóng do đóng cửa khi đăng nhập ở thoát và chế độ tệp là ‘W, thì bản ghi sẽ không được phát ra (xem BPO-42378).(record)

Xuất bản ghi vào tệp.

Lưu ý rằng nếu tệp đã bị đóng do đóng cửa khi đăng nhập ở 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.Configuring Logging for a Library for more information on how to use

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
2.

Lớp 2014-07-16 23:21:23,531 [140554568353] Foo 2014-07-16 23:21:24,312 [140554568353] Bar 2, nằm trong gói lõi 2014-07-16 23:21:23,531 [140554568353] Foo 2014-07-16 23:21:24,312 [140554568353] Bar 3, 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ý ‘không có op để sử dụng bởi các nhà phát triển thư viện.

classLogging.nullHandler¶

Trả về một thể hiện mới của lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
2.

Phương pháp này không làm gì cả.

Xử lý (ghi) logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False, errors=None)

createlock () ¶

Thay đổi trong phiên bản 3.6: cũng như các giá trị chuỗi, các đối tượng

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
5 cũng được chấp nhận cho đối số tên tệp.As well as string values,
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
5 objects are also accepted for the filename argument.

Thay đổi trong phiên bản 3.9: Tham số lỗi đã được thêm vào.The errors parameter was added.

gần()¶()

Đóng tệp.

phát ra (ghi) ¶

phát ra (ghi) ¶(record)

Xuất bản ghi vào tệp.

Lưu ý rằng nếu tệp đã bị đóng do đóng cửa khi đăng nhập ở 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.logging.handlers.BaseRotatingHandler(filename, mode, encoding=None, delay=False, errors=None)

Lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
2, nằm trong gói lõi
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
3, 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ý ‘không có op để sử dụng bởi các nhà phát triển thư viện.

classLogging.nullHandler¶

Trả về một thể hiện mới của lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
2.

Ghi chú

Hàm Namer được gọi là khá nhiều lần trong quá trình tái đầu tư, vì vậy nó 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 đã cho, nếu không hành vi tái đầu tư có thể không hoạt động như mong đợi.

Nó cũng đáng chú ý rằng cần phải cẩn thận khi sử dụng tên tên để bảo tồn một số thuộc tính nhất định trong tên tệp được sử dụng trong quá trình xoay. Ví dụ: logging.info()3 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, do đó, xoay hoạt động như mong đợi và logging.info()4 xóa các tệp nhật ký cũ (dựa trên tham số info()0 đượ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 . Để điều này xảy ra, tên tệp nên được sắp xếp bằng cách sử dụng phần ngày/thời gian của tên tệp và tên tên cần phải tôn trọng điều này. .

Mới trong phiên bản 3.3.

người quay vòng

Nếu thuộc tính này được đặt thành một người có thể gọi, phương thức info()3 được ủy quyền cho điều này có thể gọi được. Các tham số được truyền cho người được gọi là các tham số được chuyển đến info()3.

Mới trong phiên bản 3.3.

người quay vòng(default_name)

Nếu thuộc tính này được đặt thành một người có thể gọi, phương thức info()3 được ủy quyền cho điều này có thể gọi được. Các tham số được truyền cho người được gọi là các tham số được chuyển đến info()3.

rotation_filename (default_name) ¶

Sửa đổi tên tệp của tệp nhật ký khi xoay.

Điều này được cung cấp để một tên tệp tùy chỉnh có thể được cung cấp.

Việc triển khai mặc định gọi thuộc tính ‘Namer của người 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à

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3), tên được trả về không thay đổi. – The default name for the log file.

Mới trong phiên bản 3.3.

người quay vòng(source, dest)

Nếu thuộc tính này được đặt thành một người có thể gọi, phương thức info()3 được ủy quyền cho điều này có thể gọi được. Các tham số được truyền cho người được gọi là các tham số được chuyển đến info()3.

rotation_filename (default_name) ¶

Điều này được cung cấp để một tên tệp tùy chỉnh có thể được cung cấp.
  • Việc triển khai mặc định gọi thuộc tính ‘Namer của người 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à

    data = pickle.dumps(record_attr_dict, 1)
    datalen = struct.pack('>L', len(data))
    return datalen + data
    
    3), tên được trả về không thay đổi. – The source filename. This is normally the base filename, e.g. ‘test.log’.

  • Thông số – The destination filename. This is normally what the source is rotated to, e.g. ‘test.log.1’.

Mới trong phiên bản 3.3.

người quay vòng

Nếu thuộc tính này được đặt thành một người có thể gọi, phương thức info()3 được ủy quyền cho điều này có thể gọi được. Các tham số được truyền cho người được gọi là các tham số được chuyển đến info()3.

rotation_filename (default_name) ¶Using a rotator and namer to customize log rotation processing.

Sửa đổi tên tệp của tệp nhật ký khi xoay.

Điều này được cung cấp để một tên tệp tùy chỉnh có thể được cung cấp.

Việc triển khai mặc định gọi thuộc tính ‘Namer của người 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à
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3), tên được trả về không thay đổi.
logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None)

Thông số

Default_name - Tên mặc định cho tệp nhật ký.

Xoay (Nguồn, Dest) ¶As well as string values,

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
5 objects are also accepted for the filename argument.

Khi xoay, xoay nhật ký hiện tại.The errors parameter was added.

Việc triển khai mặc định gọi thuộc tính ‘Rotator của người xử lý, nếu nó có thể gọi được, chuyển các đối số nguồn và định mệnh cho nó. Nếu thuộc tính không thể gọi được (mặc định là
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3), nguồn đơn giản được đổi tên thành đích.
()

Nguồn - Tên tệp nguồn. Đây thường là tên tệp cơ sở, ví dụ: Test.log.

Dest - Tên tệp đích. Đây thường là những gì nguồn được xoay thành, ví dụ: Test.log.1.(record)

Xuất bản ghi vào tệp, phục vụ cho rollover như được mô tả trước đây.

TimedRotatingFileHandler¶

Lớp logging.info()4, nằm trong mô -đun logging2, hỗ trợ xoay các tệp nhật ký đĩa theo các khoảng thời gian nhất định.

classLogging.handlers.TimedRotatingFileHandler (fileName, when = 'h', intercal = 1, backupCount = 0, expoding = none, delay = false, utc = falselogging.handlers.TimedRotatingFileHandler(filename, when='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 logging.info()4. Tệp được chỉ định được mở và sử dụng làm luồng để ghi nhật ký. Khi quay, nó cũng đặt hậu tố tên tệp. Xoay xảy ra dựa trên sản phẩm của khi nào và khoảng thời gian.

Bạn có thể sử dụng khi nào để chỉ định loại khoảng thời gian. Danh sách các giá trị có thể dưới đây. Lưu ý rằng chúng không nhạy cảm với trường hợp.

Giá trị

Loại khoảng thời gian

Nếu/làm thế nào Attime được sử dụng

logging2

Giây

Làm ngơ

logging3

Phút

Làm ngơ

logging4

Phút

Làm ngơ

logging5

Phút

Làm ngơ

logging6

Phút

Giờ

logging7

Ngày

Giờ

Ngày

Ngày trong tuần (0 = Thứ Hai)

Được sử dụng để tính thời gian tái đầu tiên ban đầu

Lăn qua lúc nửa đêm, nếu không được chỉ định, khác tại thời điểm

Khi sử dụng vòng quay dựa trên tuần, 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 được sử dụng.

Hệ thống sẽ lưu các tệp nhật ký cũ bằng cách nối các tiện ích mở rộng vào tên tệp. Các tiện ích mở rộng là dựa trên ngày và thời gian, sử dụng định dạng strftime logging8 hoặc một phần hàng đầu của chúng, tùy thuộc vào khoảng thời gian tái đầu tư.

Khi tính toán thời gian rollover 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, được sử dụng để tính toán khi nào vòng quay tiếp theo sẽ xảy ra.

Nếu đối số UTC là đúng, thời gian trong UTC sẽ được sử dụng; Nếu không, thời gian địa phương được sử dụng.

Nếu BackupCount là khác nhau, tại hầu hết các tệp BackupCount sẽ được giữ và nếu nhiều hơn sẽ được tạo khi xảy ra rollover, thì tệp lâu đời nhất sẽ bị xóa. Logic xóa sử dụng khoảng thời gian để xác định tệp nào để xóa, do đó, việc thay đổi khoảng thời gian có thể khiến các tệp cũ nằm xung quanh.

Nếu độ trễ là đúng, thì việc mở tệp được hoãn lại cho đến khi cuộc gọi đầu tiên đến

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
4.

Nếu Attime không phải là

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3, thì đó phải là một ví dụ ____101, trong đó chỉ định thời gian trong ngày xảy ra, đối với các trường hợp Rollover được thiết lập để xảy ra vào lúc nửa đêm hoặc trên một ngày trong tuần cụ thể. Lưu ý rằng trong các trường hợp này, giá trị ATTIME được sử dụng một cách hiệu quả để tính toán rollover ban đầu và các bài phát triển tiếp theo sẽ được tính toán thông qua tính toán khoảng thông thường.atTime parameter was added.

Nếu lỗi được chỉ định, nó được sử dụng để xác định cách xử lý lỗi mã hóa.As well as string values,

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
5 objects are also accepted for the filename argument.

Ghi chúThe errors parameter was added.

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 xảy ra rollover, và rollover 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 một khoảng thời gian của 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 phân tách bằng một phút; Nếu, trong quá trình thực hiện ứng dụng, đầu ra ghi nhật ký được tạo thường xuyên hơn một lần một phút, thì bạn có thể mong đợi để thấy các tệp nhật ký với thời gian phân tách một phút. Mặt khác, nếu tin nhắn ghi nhật ký chỉ xuất ra mỗi năm phút một lần (giả sử), thì sẽ có những khoảng trống trong thời gian tệp tương ứng với các phút không có đầu ra (và do đó không có rollover) xảy ra.()

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
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
5 cũng được chấp nhận cho đối số tên tệp.
(record)

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

Dorollover ()()

Không rollover, như mô tả ở trên.

phát ra (ghi) ¶

Xuất bản ghi vào tệp, phục vụ cho Rollover như được mô tả ở trên.

getfilestodelete () ¶logging.handlers.SocketHandler(host, port)

Trả về một danh sách các tên tệp nên 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 lâu đời nhất được viết bởi trình xử lý.

SOCKETHANDLER¶If

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
06 is specified as
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3, a Unix domain socket is created using the value in
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
08 - otherwise, a TCP socket is created.

Lớp
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
03, nằm trong mô -đun logging2, gửi đầu ra ghi nhật ký vào ổ cắm mạng. Lớp cơ sở sử dụng ổ cắm TCP.
()

classLogging.handlers.sockethandler (máy chủ, cổng) ¶

Trả về một thể hiện mới của lớp
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
03 nhằm liên lạc với một máy từ xa có địa chỉ được đưa ra bởi máy chủ và cổng.
()

Đã thay đổi trong phiên bản 3.4: Nếu

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
06 được chỉ định là
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3, ổ cắm miền UNIX được tạo bằng giá trị trong
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
08 - nếu không, ổ cắm TCP được tạo.

xử lý HERROR () ¶()

Xử lý một lỗi đã xảy ra trong

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
4. Nguyên nhân rất có thể là một kết nối bị mất. Đóng ổ cắm để chúng ta có thể thử lại trong sự kiện tiếp theo.

workocket () ¶()

Đây là phương pháp nhà máy cho phép các lớp con xác định loại ổ cắm chính xác mà họ muốn. Việc triển khai mặc định tạo ra một ổ cắm TCP (

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
12).

makepickle (ghi) ¶(record)

Pickles Từ điển thuộc tính của bản ghi ở định dạng nhị phân với tiền tố chiều dài và trả về nó sẵn sàng để truyền qua ổ cắm. Các chi tiết của hoạt động này 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 aren hoàn toàn an toàn. Nếu bạn quan tâm đến bảo mật, bạn có thể muốn ghi đè phương thức này để thực hiện một cơ chế an toàn hơn. Ví dụ: bạn có thể ký vào dưa chua bằng HMAC và sau đó xác minh chúng ở đầu nhận, hoặc thay vào đó, bạn có thể vô hiệu hóa việc giải phóng các đối tượng toàn cầu ở đầu nhận.

Gửi (gói)(packet)

Gửi một gói chuỗi byte ngâm đến ổ cắm. Định dạng của chuỗi byte được gửi được mô tả trong tài liệu cho

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
13.

Chức năng này cho phép gửi một phần, có thể xảy ra khi mạng bận.

createSocket () ¶()

Cố gắng tạo một ổ cắm; Khi thất bại, sử dụng thuật toán ngược theo cấp số nhân. Khi thất bại ban đầu, người xử lý sẽ bỏ thông điệp mà nó đang cố gắng gửi. Khi các tin nhắn tiếp theo được xử lý theo cùng một trường hợp, 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ễ đó, kết nối vẫn có thể được thực hiện, trình xử lý sẽ tăng gấp đôi độ trễ mỗi lần lên đến tối đa 30 giây.

Hành vi này được kiểm soát bởi các thuộc tính xử lý sau:

  • 2014-07-16 23:21:23,531  [140554568353] Foo
    2014-07-16 23:21:24,312  [140554568353] Bar
    
    14 (độ trễ ban đầu, mặc định đến 1,0 giây).

  • 2014-07-16 23:21:23,531  [140554568353] Foo
    2014-07-16 23:21:24,312  [140554568353] Bar
    
    15 (nhân, mặc định thành 2.0).

  • 2014-07-16 23:21:23,531  [140554568353] Foo
    2014-07-16 23:21:24,312  [140554568353] Bar
    
    16 (độ trễ tối đa, mặc định đến 30,0 giây).

Điều này có nghĩa là nếu người nghe từ xa khởi động sau khi người xử lý đã được sử dụng, bạn có thể mất tin nhắn (vì trình xử lý won thậm chí còn thử kết nối cho đến khi độ trễ đã trôi qua, nhưng chỉ âm thầm bỏ tin nhắn trong thời gian trì hoãn).

Datagramhandler¶

Lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
17, nằm trong mô -đun logging2, kế thừa từ
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
03 để hỗ trợ gửi tin nhắn ghi nhật ký qua ổ cắm UDP.

classLogging.handlers.datagramhandler (máy chủ, cổng) ¶ logging.handlers.DatagramHandler(host, port)

Trả về một thể hiện mới của lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
17 nhằm liên lạc với một máy từ xa có địa chỉ được đưa ra bởi máy chủ và cổng.

Ghi chú

Vì UDP không phải là một giao thức phát trực tuyến, không có kết nối liên tục giữa một trường hợp của trình xử lý và máy chủ này. Vì lý do này, khi sử dụng ổ cắm mạng, việc tra cứu DNS có thể phải được thực hiện mỗi khi một sự kiện được ghi lại, có thể đưa một số độ trễ vào hệ thống. Nếu điều này ảnh hưởng đến bạn, bạn có thể tự tìm kiếm và khởi tạo trình xử lý này bằ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

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
06 được chỉ định là
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3, ổ cắm miền UNIX được tạo bằng giá trị trong
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
08 - nếu không, ổ cắm UDP được tạo.If
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
06 is specified as
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3, a Unix domain socket is created using the value in
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
08 - otherwise, a UDP socket is created.

phát ra () ¶()

Pickles 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 âm thầm bỏ gói. Để giải nén bản ghi ở đầu nhận vào

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
09, hãy sử dụng hàm
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
10.

workocket () ¶()

Phương pháp nhà máy của

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
03 ở đây được ghi đè để tạo ổ cắm UDP (
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
27).

Gửi (các)(s)

Gửi một chuỗi byte ngâm đến một ổ cắm. Định dạng của chuỗi byte được gửi được mô tả trong tài liệu cho

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
28.

Sysloghandler¶

Lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
29, nằm trong mô -đun logging2, hỗ trợ gửi tin nhắn ghi nhật ký đến một hệ thống unix từ xa hoặc cục bộ.

classlogging.handlers.sysloghandler (address = ('localhost', syslog_udp_port), cơ sở = log_user, socktype = socket.sock_dgram) ¶logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)

Trả về một thể hiện mới của lớp

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
29 nhằm liên lạc với một máy Unix từ xa có địa chỉ được đưa ra theo địa chỉ dưới dạng tuple
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
32. Nếu địa chỉ không được chỉ định,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
33 được sử dụng. Địa chỉ được sử dụng để mở một ổ cắm. Một giải pháp thay thế để cung cấp một bộ
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
32 đang cung cấp một địa chỉ dưới dạng chuỗi, ví dụ: ‘/dev/log. Trong trường hợp này, một ổ cắm miền UNIX được sử dụng để gửi tin nhắn đến syslog. Nếu cơ sở không được chỉ định,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
35 được sử dụng. Loại ổ cắm được mở phụ thuộc vào đối số socktype, mặc định là
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
27 và do đó mở ổ cắm UDP. Để mở một ổ cắm TCP (để sử dụng với các bản da syslog mới hơn như RSYSLOG), chỉ định giá trị của
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
12.

Lưu ý rằng nếu máy chủ của bạn không nghe trên cổng UDP 514,

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
29 có thể không hoạt động. Trong trường hợp đó, hãy kiểm tra địa chỉ bạn nên sử dụng cho ổ cắm miền - nó phụ thuộc vào hệ thống. Ví dụ: trên Linux, nó thường ‘/dev/log, nhưng trên OS/X, nó‘/var/run/syslog. Bạn cần phải 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 kiểm tra này vào thời gian chạy nếu ứng dụng của bạn cần chạy trên một số 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 syslog của họ - nó không còn lắng nghe trên ổ cắm miền. Do đó, bạn không thể mong đợi

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
29 hoạt động 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: Socktype đã được thêm vào.socktype was added.

gần()¶()

Đóng ổ cắm vào máy chủ từ xa.

createSocket () ¶()

Cố gắng tạo một ổ cắm và, nếu nó không phải là ổ cắm datagram, hãy kết nối nó với đầu kia. Phương pháp này được gọi trong quá trình khởi tạo 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 không được coi là một lỗi nếu đầu kia Chưa nghe - phương thức sẽ được gọi lại khi phát ra một sự kiện, nếu không có ổ cắm vào thời điểm đó.

Mới trong phiên bản 3.11.

phát ra (ghi) ¶(record)

Bản ghi được định dạng, và sau đó được gửi đến máy chủ Syslog. Nếu thông tin ngoại lệ có mặt, nó 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, tin nhắn được gửi đến các bản daemon syslog luôn bị chấm dứt với một byte nul Trong đặc điểm kỹ thuật có liên quan (RFC 5424). Các phiên bản gần đây hơn của những chiếc daemon này không mong đợi byte nul nhưng loại bỏ nó nếu nó ở đó, và thậm chí các daemon gần đây hơn (tuân thủ chặt chẽ hơn RFC 5424) vượt qua Byte nul trên như một phần của thông điệp.(See: bpo-12168.) In earlier versions, the message sent to the syslog daemons was always terminated with a NUL byte, because early versions of these daemons expected a NUL terminated message - even though it’s not in the relevant specification (RFC 5424). More recent versions of these daemons don’t expect the NUL byte but strip it off if it’s there, and even more recent daemons (which adhere more closely to RFC 5424) pass the NUL byte on as part of the message.

Để cho phép xử lý dễ dàng hơn các thông điệp syslog 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 cấu hình, thông qua việc sử dụng thuộc tính cấp độ lớp,

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
40. Điều này mặc định là
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
41 (bảo tồn hành vi hiện có) nhưng có thể được đặt thành
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
42 trên một phiên bản
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
29 để trường hợp đó không nối thêm NUL Terminator.

Đã 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 một tiền tố nhận dạng của người nhận dạng hoặc thẻ thẻ để xác định nguồn tin nhắn. Đ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 thành

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
44 để bảo tồn hành vi hiện có, nhưng có thể được ghi đè lên một thể hiện
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
29 để trường hợp đó đưa nhận dạng cho mọi tin nhắn đượ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 chuẩn bị cho tin nhắn chính xác như là.(See: bpo-12419.) In earlier versions, there was no facility for an “ident” or “tag” prefix to identify the source of the message. This can now be specified using a class-level attribute, defaulting to
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
44 to preserve existing behaviour, but which can be overridden on a
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
29 instance in order for that instance to prepend the ident to every message handled. Note that the provided ident must be text, not bytes, and is prepended to the message exactly as is.

Mã hóa (cơ sở, ưu tiên)(facility, priority)

Mã hóa cơ sở và ưu tiên thành một số nguyên. Bạn có thể vượt qua chuỗi hoặc số nguyên - nếu chuỗi được truyền, từ điển ánh xạ nội bộ được sử dụng để chuyển đổi chúng thành số nguyên.

Các giá trị

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
46 tượng trưng được xác định trong
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
29 và phản ánh các giá trị được xác định trong tệp tiêu đề
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
48.

Ưu tiên

Tên (Chuỗi)

Giá trị tượng trưng

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
49

LOG_ALERT

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
50 hoặc
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
51

LOG_CRIT

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
52

LOG_DEBUG

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
53 hoặc
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
54

LOG_EMERG

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
55 hoặc
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
56

LOG_ERR

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
57

LOG_INFO

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
58

LOG_NOTICE

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
59 hoặc
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
60

LOG_WARNING

Cơ sở

Tên (Chuỗi)

Giá trị tượng trưng

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
61

LOG_AUTH

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
62

LOG_AUTHPRIV

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
63

LOG_CRON

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
64

LOG_DAEMON

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
65

LOG_FTP

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
66

LOG_KERN

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
67

LOG_LPR

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
68

LOG_MAIL

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
69

LOG_NEWS

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
70

LOG_SYSLOG

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
71

LOG_USER

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
72

LOG_UUCP

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
73

LOG_LOCAL0

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
74

LOG_LOCAL1

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
75

LOG_LOCAL2

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
76

LOG_LOCAL3

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
77

LOG_LOCAL4

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
78

LOG_LOCAL5

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
79

LOG_LOCAL6

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
80

LOG_LOCAL7

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
50 hoặc
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
51
(levelname)

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
53 hoặc
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
54

2014-07-16 23:21:23,531 [140554568353] Foo 2014-07-16 23:21:24,312 [140554568353] Bar 55 hoặc 2014-07-16 23:21:23,531 [140554568353] Foo 2014-07-16 23:21:24,312 [140554568353] Bar 56

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
59 hoặc
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
60

Cơ sởlogging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')

SAPIRIORITY (LALENAME) ¶

gần()¶()

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 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 (ghi) ¶(record)

Xác định ID tin nhắn, danh mục sự kiện và loại sự kiện, sau đó ghi nhật ký tin nhắn vào nhật ký sự kiện NT.

GetEventC Category (Record) ¶(record)

Trả về danh mục sự kiện cho hồ sơ. Ghi đè này nếu bạn muốn chỉ định các danh mục của riêng bạn. Phiên bản này trả về 0.

getEventType (hồ sơ) ¶(record)

Trả về loại sự kiện cho bản ghi. Ghi đè 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 một ánh xạ bằng cách sử dụng thuộc tính Type của Handler, được thiết lập trong

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
94 thành một từ điển chứa các ánh xạ cho
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
81,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
82,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
83,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
84 và
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
85. Nếu bạn đang sử dụng các cấp độ của riêng mình, bạn sẽ cần phải ghi đè phương thức này hoặc đặt một từ điển phù hợp vào thuộc tính Type Type của Handler.

getmessageid (hồ sơ) ¶(record)

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ể làm điều này bằng cách truyền MSG cho logger là ID thay vì chuỗi định dạng. Sau đó, ở đâ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

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
00.

Smtphandler¶

Lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
01, nằm trong mô -đun logging2, hỗ trợ gửi tin nhắn đăng nhập đến địa chỉ email qua SMTP.

classLogging.handlers.smtphandler (mailhost, fromaddr, toaddrs, chủ đề, thông tin xác thực = none, an toàn = không, thời gian chờ = 1.0) ¶logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)

Trả về một thể hiện mới của lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
01. Trường hợp được khởi tạo với từ và đến địa chỉ và dòng chủ đề của email. Các con cóc nên 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 tuple (máy chủ, cổng) cho đối số MailHost. Nếu bạn sử dụng một chuỗi, cổng SMTP tiêu chuẩn đượ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ộ điều khiển (tên người dùng, mật khẩu) cho đối số thông tin đăng nhập.

Để chỉ định việc sử dụng giao thức an toàn (TLS), hãy chuyển theo một đối số an toàn. Điều này sẽ chỉ được sử dụng khi thông tin xác thực được cung cấp. Bộ tuple phải là một tuple trống hoặc một tuple một giá trị đơn với tên của một keyfile hoặc một tuple 2 giá trị với tên của tệp keyfile và chứng chỉ. (Tuple này được chuyển sang phương pháp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
04.)

Thời gian chờ có thể được chỉ định để liên lạc với máy chủ SMTP bằng đối số thời gian chờ.

Mới trong phiên bản 3.3: Đối số thời gian chờ đã được thêm vào.The timeout argument was added.

phát ra (ghi) ¶(record)

Xác định ID tin nhắn, danh mục sự kiện và loại sự kiện, sau đó ghi nhật ký tin nhắn vào nhật ký sự kiện NT.

GetEventC Category (Record) ¶(record)

Trả về danh mục sự kiện cho hồ sơ. Ghi đè này nếu bạn muốn chỉ định các danh mục của riêng bạn. Phiên bản này trả về 0.

getEventType (hồ sơ) ¶

Trả về loại sự kiện cho bản ghi. Ghi đè 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 một ánh xạ bằng cách sử dụng thuộc tính Type của Handler, được thiết lập trong

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
94 thành một từ điển chứa các ánh xạ cho
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
81,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
82,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
83,
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
84 và
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
85. Nếu bạn đang sử dụng các cấp độ của riêng mình, bạn sẽ cần phải ghi đè phương thức này hoặc đặt một từ điển phù hợp vào thuộc tính Type Type của Handler.

getmessageid (hồ sơ) ¶

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ể làm điều này bằng cách truyền MSG cho logger là ID thay vì chuỗi định dạng. Sau đó, ở đâ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
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
00.
logging.handlers.BufferingHandler(capacity)

Smtphandler¶

phát ra (ghi) ¶(record)

Lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
01, nằm trong mô -đun logging2, hỗ trợ gửi tin nhắn đăng nhập đến địa chỉ email qua SMTP.

classLogging.handlers.smtphandler (mailhost, fromaddr, toaddrs, chủ đề, thông tin xác thực = none, an toàn = không, thời gian chờ = 1.0) ¶()

Trả về một thể hiện mới của lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
01. Trường hợp được khởi tạo với từ và đến địa chỉ và dòng chủ đề của email. Các con cóc nên 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 tuple (máy chủ, cổng) cho đối số MailHost. Nếu bạn sử dụng một chuỗi, cổng SMTP tiêu chuẩn đượ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ộ điều khiển (tên người dùng, mật khẩu) cho đối số thông tin đăng nhập.

Để chỉ định việc sử dụng giao thức an toàn (TLS), hãy chuyển theo một đối số an toàn. Điều này sẽ chỉ được sử dụng khi thông tin xác thực được cung cấp. Bộ tuple phải là một tuple trống hoặc một tuple một giá trị đơn với tên của một keyfile hoặc một tuple 2 giá trị với tên của tệp keyfile và chứng chỉ. (Tuple này được chuyển sang phương pháp
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
04.)
(record)

Thời gian chờ có thể được chỉ định để liên lạc với máy chủ SMTP bằng đối số thời gian chờ.

Mới trong phiên bản 3.3: Đối số thời gian chờ đã được thêm vào.logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None, flushOnClose=True)

Định dạng hồ sơ và gửi nó đến các địa chỉ được chỉ định.

Đã thay đổi trong phiên bản 3.6: Tham số FlushOnClose đã được thêm vào.The flushOnClose parameter was added.

gần()¶()

Gọi

2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
7, đặt mục tiêu thành
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
3 và xóa bộ đệm.

tuôn ra()¶()

Đối với một

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
05, Flushing có nghĩa là chỉ gửi các bản ghi được đệm đến mục tiêu, nếu có. Bộ đệm cũng được xóa khi điều này xảy ra. Ghi đè nếu bạn muốn hành vi khác nhau.

mục tiêu (mục tiêu) ¶(target)

Đặt trình xử lý mục tiêu cho người xử lý này.

Shouldflush (ghi) ¶(record)

Kiểm tra bộ đệm đầy đủ hoặc một bản ghi ở Flushlevel hoặc cao hơn.

Httphandler¶

Lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
22, nằm trong mô -đun logging2, hỗ trợ gửi tin nhắn ghi nhật ký đến máy chủ web, sử dụng ngữ nghĩa
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
24 hoặc
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
25.

classLogging.handlers.httphandler (host, url, phương thức = 'get', an toàn = false, thông tin xác thực = none, bối cảnh = không) logging.handlers.HTTPHandler(host, url, method='GET', secure=False, credentials=None, context=None)

Trả về một thể hiện mới của lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
22. Máy chủ có thể có dạng
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
27, nếu bạn cần sử dụng một số cổng cụ thể. Nếu không có phương pháp được chỉ định,
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
24 được sử dụng. Nếu an toàn 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 thể hiện
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
29 để đị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, nó phải là 2-tuple bao gồm userID và mật khẩu, sẽ được đặt trong tiêu đề HTTP ‘ủy quyền 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 Secure = true để người dùng và mật khẩu của bạn không được truyền trong ClearText trên dây.

Thay đổi trong phiên bản 3.5: Tham số ngữ cảnh đã được thêm vào.The context parameter was added.

MapLogrecord (Record) ¶(record)

Cung cấp một từ điển, dựa trên

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
30, được mã hóa và gửi đến máy chủ web. Việc triển khai mặc định chỉ trả về
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
31. Phương thức này có thể được ghi đè nếu ví dụ: Chỉ có một tập hợp con của
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
09 được gửi đến máy chủ web hoặc nếu cần có tùy chỉnh cụ thể hơn về những gì mà gửi đến máy chủ.

phát ra (ghi) ¶(record)

Gửi hồ sơ đến máy chủ web dưới dạng từ điển được mã hóa URL. Phương pháp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
33 được sử dụng để chuyển đổi bản ghi thành từ điển sẽ được gửi.

Queuehandler¶

Mới trong phiên bản 3.2.

Lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
34, nằm trong mô -đun logging2, hỗ trợ gửi tin nhắn ghi nhật ký đến hàng đợi, chẳng hạn như các mô -đun được triển khai trong mô -đun
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
36 hoặc
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
37.

Cùng với lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
38,
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
34 có thể được sử dụng để cho phép người 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 bản ghi. Điều này rất quan trọng trong các ứng dụng web và các ứng dụng dịch vụ khác trong đó các chủ đề phục vụ khách hàng cần trả lời càng nhanh càng tốt, trong khi bất kỳ hoạt động chậm có khả năng nào (chẳng hạn như gửi email qua
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
01) được thực hiện trên một luồng riêng biệt.

classLogging.handlers.queueHandler (hàng đợi) ¶ logging.handlers.QueueHandler(queue)

Trả về một thể hiện mới của lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
34. Trường hợp đượ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 như hàng đợi; Nó được sử dụng AS-IS bằng phương pháp
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
42, cần biết cách gửi tin nhắn đến nó. Hàng đợi không bắt buộc phải có API theo dõi tác vụ, điều đó có nghĩa là bạn có thể sử dụng các phiên bản
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
43 cho hàng đợi.

phát ra (ghi) ¶(record)

Gửi hồ sơ đến máy chủ web dưới dạng từ điển được mã hóa URL. Phương pháp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
33 được sử dụng để chuyển đổi bản ghi thành từ điển sẽ được gửi.

Queuehandler¶(record)

Mới trong phiên bản 3.2.

Lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
34, nằm trong mô -đun logging2, hỗ trợ gửi tin nhắn ghi nhật ký đến hàng đợi, chẳng hạn như các mô -đun được triển khai trong mô -đun
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
36 hoặc
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
37.

Cùng với lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
38,
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
34 có thể được sử dụng để cho phép người 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 bản ghi. Điều này rất quan trọng trong các ứng dụng web và các ứng dụng dịch vụ khác trong đó các chủ đề phục vụ khách hàng cần trả lời càng nhanh càng tốt, trong khi bất kỳ hoạt động chậm có khả năng nào (chẳng hạn như gửi email qua
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
01) được thực hiện trên một luồng riêng biệt.

classLogging.handlers.queueHandler (hàng đợi) ¶

Trả về một thể hiện mới của lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
34. Trường hợp đượ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 như hàng đợi; Nó được sử dụng AS-IS bằng phương pháp
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
42, cần biết cách gửi tin nhắn đến nó. Hàng đợi không bắt buộc phải có API theo dõi tác vụ, điều đó có nghĩa là bạn có thể sử dụng các phiên bản
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
43 cho hàng đợi.

enqueue (ghi) ¶(record)

Enqueues bản ghi trên hàng đợi bằng cách sử dụng

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
70; Bạn có thể muốn ghi đè điều này nếu bạn muốn sử dụng hành vi chặn hoặc thời gian chờ hoặc triển khai hàng đợi tùy chỉnh.

Queuelistener¶

Mới trong phiên bản 3.2.

Lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
38, nằm trong mô -đun logging2, hỗ trợ nhận tin nhắn ghi nhật ký từ hàng đợi, chẳng hạn như các mô -đun được triển khai trong các mô -đun
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
36 hoặc
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
37. Các tin nhắn được nhận từ một hàng đợi trong một luồng nội bộ và được truyền, trên cùng một luồng, đến một hoặc nhiều trình xử lý để xử lý. Mặc dù
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
38 không phải là người xử lý, nhưng nó được ghi nhận ở đây vì nó hoạt động bằng tay với
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
34.

Cùng với lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
34,
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
38 có thể được sử dụng để cho phép người 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 bản ghi nhật ký. Điều này rất quan trọng trong các ứng dụng web và các ứng dụng dịch vụ khác trong đó các chủ đề phục vụ khách hàng cần trả lời càng nhanh càng tốt, trong khi bất kỳ hoạt động chậm có khả năng nào (chẳng hạn như gửi email qua
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
01) được thực hiện trên một luồng riêng biệt.

classLogging.handlers.queuelistener (hàng đợi, *người xử lý, tôn trọng_handler_level = false) ¶ logging.handlers.QueueListener(queue, *handlers, respect_handler_level=False)

Trả về một thể hiện mới của lớp

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
38. Ví dụ được khởi tạo với hàng đợi để gửi tin nhắn đến và một 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 như hàng đợi; Nó đã chuyển qua phương pháp
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
81, cần biết cách nhận tin nhắn từ nó. 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ó), điều đó có nghĩa là bạn có thể sử dụng các phiên bản
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
43 cho hàng đợi.

Nếu

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
83 là
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
41, cấp độ xử lý được tôn trọng (so với mức độ cho tin nhắn) khi quyết định có truyền tin nhắn cho trình xử lý đó hay không; Mặt khác, hành vi này như trong các phiên bản Python trước đây - để luôn chuyển từng tin nhắn cho mỗi người xử lý.

Đã thay đổi trong phiên bản 3.5: Đối số

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
83 đã được thêm vào.The
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
83 argument was added.

Dequeue (khối) ¶(block)

Dequeues một bản ghi và trả lại nó, tùy chọn chặn.

Việc triển khai cơ sở sử dụng

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
86. 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.

Chuẩn bị (ghi)(record)

Chuẩn bị một kỷ lục để xử lý.

Việc thực hiện này chỉ trả về hồ sơ thông qua. 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ỳ sự sắp xếp hoặc thao tác tùy chỉnh nào của hồ sơ trước khi chuyển nó cho người xử lý.

Xử lý (ghi)(record)

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ọ hồ sơ để xử lý. Đối tượng thực tế được chuyển cho các trình xử lý là được trả về từ

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
87.

bắt đầu()¶()

Bắt đầu người nghe.

Điều này bắt đầu một luồng nền để theo dõi hàng đợi cho logrecords để xử lý.

dừng lại()¶()

Ngừng người nghe.

Điều này yêu cầu chủ đề chấm dứt, và sau đó chờ nó làm như vậy. Lưu ý rằng nếu bạn không gọi này trước khi ứng dụng của bạn thoát ra, có thể có một số hồ sơ vẫn còn lại trên hàng đợi, trong đó đã giành được xử lý.

enqueue_sentinel () ¶()

Viết một Sentinel cho Hàng đợi để nói với người nghe từ bỏ. Việc triển khai này sử dụng

log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
70. 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.

Mới trong phiên bản 3.3.

Xem thêm

Mô -đun
2014-07-16 23:21:23,531  [140554568353] Foo
2014-07-16 23:21:24,312  [140554568353] Bar
3

Tham chiếu API cho mô -đun ghi nhật ký.

Mô -đun
log_que = queue.Queue(-1)
queue_handler = logging.handlers.QueueHandler(log_que)
log_handler = logging.StreamHandler()
queue_listener = logging.handlers.QueueListener(log_que, log_handler)
queue_listener.start()
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s  %(message)s", handlers=[queue_handler])
90

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