Sử dụng ghi nhật ký in đầu ra của bản in


101

Tôi muốn sử dụng đầu ra của pprint để hiển thị cấu trúc dữ liệu phức tạp, nhưng tôi muốn xuất nó bằng mô-đun ghi nhật ký thay vì stdout.

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT

tôi đã xem qua các tài liệu và tìm thấy pprint( {}, stream ), nhưng thấy nó khá khó xử. tôi đã nghĩ một cái gì đó giống như spprintcó thể đã đẹp hơn pformat(như trong c).
yee379

6
pprint.pformat()đã ở trên trang đó.
Gareth Latty

27
@Lattywayre - Không phải ai đặt câu hỏi như thế này đều bỏ qua tài liệu. Tôi đã đọc các tài liệu tương tự và cũng bỏ lỡ pformat. Trên stackoverflow, đôi khi bạn cũng nhận được đá quý từ trải nghiệm của người khác mà hoàn toàn không có trong tài liệu. Cảm ơn yee379 đã hỏi điều này.
Mnebuerquo

Câu trả lời:


214

Sử dụng pprint.pformatđể lấy một chuỗi, sau đó gửi nó đến khung ghi nhật ký của bạn.

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))

11
Nếu bạn không xóa mã này sau khi gỡ lỗi xong, bạn có thể nên bảo vệ nó bằng "if Logger.isEnabledFor (logging.DEBUG):" để tránh chạy pformat khi bạn không sử dụng đầu ra của nó: docs.python. org / 2 / library /…
Ed Brannin

2
@EdBrannin Có phải pformat thêm nhiều chi phí đến mức đáng gặp khó khăn khi thêm điều kiện vào tất cả các câu lệnh nhật ký GỬI KHÔNG?
undefinedvariable

2
@undefinedvariable Câu hỏi hay. Tôi-hôm nay muốn nói với Tôi-2 năm trước để tạo ra một số chỉ số hiệu suất A / B.
Ed Brannin

1
Tôi AttributeError: 'function' object has no attribute 'pformat'biết tại sao không?
JinSnow

3
Giải pháp: Tôi cần thiết from pprint import pprint,pformat sau đólogging.debug((pformat(stuff))
JinSnow

20

Giải pháp ở trên không hoàn toàn cắt được nó đối với tôi vì tôi cũng đang sử dụng trình định dạng để thêm tên và tên cấp khi ghi nhật ký. Nó trông hơi lộn xộn:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbb',
'cccccccccccccccccccc',
'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

Có thể có một giải pháp thanh lịch hơn, nhưng điều này:

for line in pprint.pformat(ds).split('\n'):
    logging.debug(line)

tạo ra một cái gì đó đẹp hơn một chút:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

14
Nicer cho người tiêu dùng. Không quá tuyệt vời nếu bạn đang vận chuyển nhật ký đến logstash hoặc các công cụ tương tự và muốn gửi một tin nhắn nhiều dòng duy nhất cũng như một tin nhắn.
Charles Duffy,

5
có cách nào để in đẹp ở cấp trình xử lý / định dạng của cấu hình trình ghi nhật ký không? Có vẻ như một trường hợp sử dụng hợp lệ để in đẹp, để giao diện điều khiển, nhưng đi chưa định dạng tập tin
jon_darkstar

@CharlesDuffy Có cách nào dễ dàng để xử lý cả hai trường hợp không?
jtlz2

1
Fwiw giải pháp của tôi là chỉ thêm một \nký tự bổ sung trong pformat. Ít nhất theo cách này, khối là với nhau.
ricekab,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.