2013-04-24 13 views
5

Tôi hiện có:Làm cách nào để nhập các biến trong trình định dạng logger?

FORMAT = '%(asctime)s - %(levelname)s - %(message)s' 
logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S', filename=LOGFILE, level=getattr(logging, options.loglevel.upper())) 

... mà hoạt động tuyệt vời, tuy nhiên tôi đang cố gắng để làm:

FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 

và rằng chỉ cần ném keyerrors mặc dù myVar được định nghĩa.

Có cách giải quyết khác không? MYVAR là một hằng số, do đó, nó sẽ là một sự xấu hổ của việc phải vượt qua nó tất cả mọi thứ tôi gọi logger.

Cảm ơn bạn!

+2

Nếu 'MYVAR' sẽ luôn có cùng giá trị, không phải là' FORMAT = '{}% (asctime) s -% (tên cấp) s -% (message) s'.format (MYVAR) 'a có thể thay thế? –

Trả lời

10

Bạn có thể sử dụng một custom filter:

import logging 

MYVAR = 'Jabberwocky' 


class ContextFilter(logging.Filter): 
    """ 
    This is a filter which injects contextual information into the log. 
    """ 
    def filter(self, record): 
     record.MYVAR = MYVAR 
     return True 

FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 
logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S') 

logger = logging.getLogger(__name__) 
logger.addFilter(ContextFilter()) 

logger.warning("'Twas brillig, and the slithy toves") 

sản lượng

Jabberwocky 24/04/2013 20:57:31 - WARNING - 'Twas brillig, and the slithy toves 
+0

Cảm ơn bạn rất nhiều - đó thực sự là cách chính xác để tiến hành! –

+0

Không hoạt động hình thành tôi trong python 2.7. Giải pháp là thêm 'ContextFilter()' vào trình xử lý thay thế. – mmoya

0
locals() 
FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 

người dân địa phương() phải trả lại từ điển của tất cả các biến cục bộ, sau đó là lỗi. Nếu bạn không nhìn thấy nó trong đó, sau đó nó không có sẵn tại địa phương. Điều này sẽ chứng minh nó không được xác định đúng. Chúng tôi sẽ cần thêm mã để xem nó có được xác định không đúng cách hay không. Hoặc bạn có thể thử "globals()" để kiểm tra những cái toàn cầu .... nhưng có lẽ bạn arent đặt "myVar toàn cầu" trong định nghĩa rằng kết quả đầu ra FORMAT

+0

Tôi đã cố gắng in người dân địa phương và tôi có thể thấy var của tôi như là một phần của đầu ra: 'MYVAR': 'blahblah' –

5

bạn có thể sử dụng một tùy chỉnh Filter, như unutbu nói, hoặc bạn có thể sử dụng một LoggerAdapter:

import logging 

logger = logging.LoggerAdapter(logging.getLogger(__name__), {'MYVAR': 'Jabberwocky'}) 

FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 
logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S') 

logger.warning("'Twas brillig, and the slithy toves") 

mang đến cho

Jabberwocky 25/04/2013 07:39:52 - CẢNH BÁO - 'TWAS brillig, và slithy toves

Ngoài ra, chỉ cần vượt qua các thông tin với mọi cuộc gọi:

import logging 

logger = logging.getLogger(__name__) 

FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 
logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S') 

logger.warning("'Twas brillig, and the slithy toves", extra={'MYVAR': 'Jabberwocky'}) 

mang lại kết quả tương tự.

Vì MYVAR thực tế không đổi, cách tiếp cận LoggerAdapter yêu cầu ít mã hơn cách tiếp cận Filter trong trường hợp của bạn.

+0

Liệu '' logging.basicConfig (format = FORMAT) '' có thay đổi định dạng cho tất cả các logger không? Làm thế nào để thay đổi nó chỉ cho bộ chuyển đổi logger mới này? Cảm ơn – Michael

Các vấn đề liên quan