Tôi không thể tìm ra cách đăng nhập thông báo mức thông tin thành giá trị chuẩn, nhưng mọi thứ khác thành stderr. Tôi đã đọc số này http://docs.python.org/library/logging.html. Bất kì lời đề nghị nào?Ghi nhật ký, StreamHandler và các luồng tiêu chuẩn
Trả lời
Các kịch bản sau đây, log1.py
:
import logging, sys
class SingleLevelFilter(logging.Filter):
def __init__(self, passlevel, reject):
self.passlevel = passlevel
self.reject = reject
def filter(self, record):
if self.reject:
return (record.levelno != self.passlevel)
else:
return (record.levelno == self.passlevel)
h1 = logging.StreamHandler(sys.stdout)
f1 = SingleLevelFilter(logging.INFO, False)
h1.addFilter(f1)
rootLogger = logging.getLogger()
rootLogger.addHandler(h1)
h2 = logging.StreamHandler(sys.stderr)
f2 = SingleLevelFilter(logging.INFO, True)
h2.addFilter(f2)
rootLogger.addHandler(h2)
logger = logging.getLogger("my.logger")
logger.setLevel(logging.DEBUG)
logger.debug("A DEBUG message")
logger.info("An INFO message")
logger.warning("A WARNING message")
logger.error("An ERROR message")
logger.critical("A CRITICAL message")
khi chạy, tạo ra kết quả như sau.
C:\temp>log1.py A DEBUG message An INFO message A WARNING message An ERROR message A CRITICAL message
Như bạn mong muốn, vì trên một thiết bị đầu cuối sys.stdout
và sys.stderr
đều giống nhau. Bây giờ, chúng ta hãy chuyển hướng stdout vào một tập tin, tmp
:
C:\temp>log1.py >tmp A DEBUG message A WARNING message An ERROR message A CRITICAL message
Vì vậy, thông điệp INFO chưa được in vào thiết bị đầu cuối - nhưng những thông điệp hướng đến sys.stderr
đã được in. Hãy xem những gì trong số tmp
:
C:\temp>type tmp An INFO message
Cách tiếp cận đó dường như làm những gì bạn muốn.
Nói chung, tôi nghĩ rằng nó làm cho tinh thần để chuyển hướng thông điệp thấp hơn WARNING
để stdout, thay vì chỉ INFO
điệp.
Dựa trên câu trả lời tuyệt vời Vinay Sajip 's, tôi đến với điều này:
class MaxLevelFilter(Filter):
'''Filters (lets through) all messages with level < LEVEL'''
def __init__(self, level):
self.level = level
def filter(self, record):
return record.levelno < self.level # "<" instead of "<=": since logger.setLevel is inclusive, this should be exclusive
MIN_LEVEL= DEBUG
#...
stdout_hdlr = StreamHandler(sys.stdout)
stderr_hdlr = StreamHandler(sys.stderr)
lower_than_warning= MaxLevelFilter(WARNING)
stdout_hdlr.addFilter(lower_than_warning) #messages lower than WARNING go to stdout
stdout_hdlr.setLevel(MIN_LEVEL)
stderr_hdlr.setLevel(max(MIN_LEVEL, WARNING)) #messages >= WARNING (and >= STDOUT_LOG_LEVEL) go to stderr
#...
Kể từ khi chỉnh sửa của tôi đã bị từ chối, đây là câu trả lời của tôi. @ goncalopp của câu trả lời là tốt nhưng không đứng một mình hoặc làm việc ra khỏi hộp. Đây là phiên bản cải tiến của tôi:
import sys, logging
class LogFilter(logging.Filter):
"""Filters (lets through) all messages with level < LEVEL"""
# http://stackoverflow.com/a/24956305/408556
def __init__(self, level):
self.level = level
def filter(self, record):
# "<" instead of "<=": since logger.setLevel is inclusive, this should
# be exclusive
return record.levelno < self.level
MIN_LEVEL = logging.DEBUG
stdout_hdlr = logging.StreamHandler(sys.stdout)
stderr_hdlr = logging.StreamHandler(sys.stderr)
log_filter = LogFilter(logging.WARNING)
stdout_hdlr.addFilter(log_filter)
stdout_hdlr.setLevel(MIN_LEVEL)
stderr_hdlr.setLevel(max(MIN_LEVEL, logging.WARNING))
# messages lower than WARNING go to stdout
# messages >= WARNING (and >= STDOUT_LOG_LEVEL) go to stderr
rootLogger = logging.getLogger()
rootLogger.addHandler(stdout_hdlr)
rootLogger.addHandler(stderr_hdlr)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Example Usage
>>> logger.debug("A DEBUG message")
>>> logger.info("An INFO message")
>>> logger.warning("A WARNING message")
>>> logger.error("An ERROR message")
>>> logger.critical("A CRITICAL message")
- 1. Ghi nhật ký an toàn đa luồng
- 2. Ghi nhật ký an toàn
- 3. tạo động và hủy các ứng dụng ghi nhật ký
- 4. In và ghi nhật ký mong muốn
- 5. Ghi nhật ký Python.DEBUG không ghi nhật ký
- 6. Ghi nhật ký các câu lệnh sql chuẩn bị trong trình điều khiển jdbc của postgres
- 7. Tôi có thể tắt tiêu đề nhật ký cho trình ghi nhật ký ruby không?
- 8. Cơ sở ghi nhật ký và Qt
- 9. Mức ghi nhật ký khác nhau giữa ghi nhật ký SFL4J và JDK
- 10. Ghi nhật ký và quay các tập tin bằng Python
- 11. Chuyển hướng đầu ra tiêu chuẩn và lỗi gắn vào cùng một tệp nhật ký
- 12. Ghi nhật ký NSNotifications
- 13. Ghi nhật ký xoắn
- 14. Thuật toán ghi nhật ký
- 15. Ghi nhật ký Java vs Log4J
- 16. Ngăn Ghostscript ghi các lỗi vào đầu ra tiêu chuẩn
- 17. Lỗi ghi nhật ký có lập trình Với Elmah: Ghi nhật ký thông tin cụ thể
- 18. Ghi nhật ký PSGI (Perl)
- 19. Phông chữ web tiêu chuẩn Nhật Bản
- 20. Ghi nhật ký với Vala
- 21. Ghi nhật ký giữa các lớp trong python
- 22. Các luồng đầu ra tiêu chuẩn trong C++ thread-safe (cout, cerr, clog)?
- 23. Tắt ghi nhật ký Hibernate
- 24. ghi nhật ký log4net không tạo tệp nhật ký
- 25. Trục ghi nhật ký SOAP2
- 26. Ghi nhật ký Python: thông báo tin nhắn cấp dưới mức nhật ký hiện tại
- 27. Mức ghi nhật ký Android
- 28. Ghi nhật ký Java - cách chuyển hướng đầu ra sang tệp nhật ký tùy chỉnh cho trình ghi nhật ký?
- 29. Chiến lược ghi nhật ký kiểm tra
- 30. Ghi nhật ký Tomcat của Azure Java
Nếu bạn thích câu trả lời, cách trả lời bình thường là chấp nhận :-) –