logging.info không hiển thị trên bảng điều khiển nhưng cảnh báo và lỗi xảy ra


94

Khi tôi ghi nhật ký một sự kiện logging.info, nó không xuất hiện trong thiết bị đầu cuối Python.

import logging
logging.info('I am info')  # no output

Ngược lại, các sự kiện được ghi lại logging.warnsẽ xuất hiện trong thiết bị đầu cuối.

import logging
logging.warn('I am warning')  # outputs "I am warning"

Tôi có thể thay đổi mức độ môi trường để thực hiện logging.infoin ra bảng điều khiển không? Tôi muốn tránh thực hiện các thay đổi trong mỗi tệp Python.

Câu trả lời:


157

Trình ghi gốc luôn mặc định ở mức CẢNH BÁO. Thử gọi điện

logging.getLogger().setLevel(logging.INFO)

và bạn sẽ ổn.


1
Không, bạn chỉ cần gọi nó một lần. Trình ghi nhật ký được xây dựng như một hệ thống phân cấp và tất cả việc ghi nhật ký đều nằm trong một trình ghi nhật ký gốc . Bằng cách không chỉ định bất kỳ đối số nào getLogger(), nó sẽ trả về cho bạn trình ghi gốc. Miễn là bạn không sửa đổi các trình ghi khác, bạn chỉ cần sửa đổi trình ghi gốc.
Ztyx

18
Bạn có biết tại sao logging.basicConfig (level = logging.INFO) không hoạt động không? Tôi không thể thấy nó rõ ràng trên tài liệu.
Doppelganger

1
@ P1h3r1e3d13 Nếu bạn chỉ có một trình ghi gốc duy nhất thì đó có thể là phương pháp hay nhất.
Ztyx

7
Điều này không hoạt động trên Python 3.5:Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux >>> import logging >>> rootLog = logging.getLogger() >>> rootLog.setLevel(logging.INFO) >>> rootLog.info('all the kings horses') >>> rootLog.warning('all the kings men') all the kings men
Jeff K

6
@jeffk, cùng với tôi 3.6.8 không in thông báo thông tin ngay cả khi setLevel được đặt thành ghi nhật ký.INFO
Robert Lugg

28

Giống như @ztyx đã nói rằng cấp trình ghi mặc định là CẢNH BÁO. Bạn phải đặt nó ở mức thấp hơn

Bạn có thể làm điều đó bằng cách sử dụng logging.basicConfig và đặt cấp trình ghi nhật ký :

logging.basicConfig(level=logging.DEBUG)

7
Tôi tự hỏi tại sao basicConfig()không hiệu quả với tôi, mặc dù logging.getLogger().setLevel()phù hợp với công việc?
Shayan Amani

17

Các giải pháp trên không hoạt động với tôi, nhưng mã ở đây đã hoạt động:

# set up logging to file
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

(Tôi đã bỏ qua các phần của mã để dễ đọc)


1
Đây là điều duy nhất làm việc cho tôi. Tôi đã có một dòng với logging.error("Connection timed out!")và thậm chí với level=logging.DEBUGtrong basicConfig(), nó sẽ không in ra bảng điều khiển. Thêm trình xử lý đã làm, cảm ơn rất nhiều !!
BruceWayne

Hãy nhớ rằng trình xử lý bạn đang sử dụng đang đóng một vai trò. Ví dụ: nếu mã của bạn có NullHandler, sẽ không có gì được in bất kể đòn bẩy ghi nhật ký.
George

Tương tự ở đây - nếu tôi bỏ qua đối số cấp trong basicConfighoặc đặt nó trên INFO thì trình ghi bảng điều khiển sẽ không bao giờ ghi lại bất kỳ thứ gì. Nếu tôi bỏ đi basicConfigthì tôi có thể gọi setLeveltrên máy ghi nhật ký cả ngày (và tôi có thể thấy mức độ thay đổi bằng cách gọi getEffectiveLevel) nhưng nó sẽ không bao giờ ghi lại bất kỳ thứ gì dưới WARNINGmức. Tôi không thực sự chắc chắn rằng đó không phải là hành vi chính xác nhưng đó không phải là những gì tôi mong đợi.
Hạ
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.