Vì vậy, ngay bây giờ chúng tôi có rất nhiều tập lệnh python và chúng tôi đang cố gắng hợp nhất chúng và sửa chữa và dự phòng. Một trong những điều chúng tôi đang cố gắng làm là đảm bảo rằng tất cả sys.stdout/sys.stderr đi vào mô-đun đăng nhập python.chuyển hướng sys.stdout sang nhật ký python
Bây giờ điều quan trọng là, chúng tôi muốn những sản phẩm sau in ra:
[<ERROR LEVEL>] | <TIME> | <WHERE> | <MSG>
Bây giờ tất cả sys.stdout/sys.stderr thông điệp khá nhiều trong tất cả các thông báo lỗi python có định dạng của [CẤP ] - MSG, tất cả đều được viết bằng sys.stdout/sys.stderr. Tôi có thể phân tích các tiền phạt, trong wrapper sys.stdout của tôi và trong wrapper sys.stderr. Sau đó, gọi mức ghi nhật ký tương ứng, tùy thuộc vào đầu vào được phân tích cú pháp.
Vì vậy, về cơ bản chúng tôi có một gói được gọi là foo và một gói con được gọi là nhật ký. Trong __init__.py
chúng ta định nghĩa như sau:
def initLogging(default_level = logging.INFO, stdout_wrapper = None, \
stderr_wrapper = None):
"""
Initialize the default logging sub system
"""
root_logger = logging.getLogger('')
strm_out = logging.StreamHandler(sys.__stdout__)
strm_out.setFormatter(logging.Formatter(DEFAULT_LOG_TIME_FORMAT, \
DEFAULT_LOG_TIME_FORMAT))
root_logger.setLevel(default_level)
root_logger.addHandler(strm_out)
console_logger = logging.getLogger(LOGGER_CONSOLE)
strm_out = logging.StreamHandler(sys.__stdout__)
#strm_out.setFormatter(logging.Formatter(DEFAULT_LOG_MSG_FORMAT, \
# DEFAULT_LOG_TIME_FORMAT))
console_logger.setLevel(logging.INFO)
console_logger.addHandler(strm_out)
if stdout_wrapper:
sys.stdout = stdout_wrapper
if stderr_wrapper:
sys.stderr = stderr_wrapper
def cleanMsg(msg, is_stderr = False):
logy = logging.getLogger('MSG')
msg = msg.rstrip('\n').lstrip('\n')
p_level = r'^(\s+)?\[(?P<LEVEL>\w+)\](\s+)?(?P<MSG>.*)$'
m = re.match(p_level, msg)
if m:
msg = m.group('MSG')
if m.group('LEVEL') in ('WARNING'):
logy.warning(msg)
return
elif m.group('LEVEL') in ('ERROR'):
logy.error(msg)
return
if is_stderr:
logy.error(msg)
else:
logy.info(msg)
class StdOutWrapper:
"""
Call wrapper for stdout
"""
def write(self, s):
cleanMsg(s, False)
class StdErrWrapper:
"""
Call wrapper for stderr
"""
def write(self, s):
cleanMsg(s, True)
Bây giờ chúng ta sẽ gọi đây là một trong các kịch bản của chúng tôi ví dụ:
import foo.log
foo.log.initLogging(20, foo.log.StdOutWrapper(), foo.log.StdErrWrapper())
sys.stdout.write('[ERROR] Foobar blew')
Trong đó sẽ được chuyển đổi thành một thông báo lỗi đăng nhập. Giống như:
[ERROR] | 20090610 083215 | __init__.py | Foobar Blew
Bây giờ vấn đề là khi chúng ta làm điều đó, Module nơi thông báo lỗi được đăng nhập bây giờ là __init__
(tương ứng với foo.log.__init__.py
tập tin) mà đánh bại toàn bộ mục đích.
Tôi đã cố gắng thực hiện sâuCopy/shallowCopy của các đối tượng stderr/stdout, nhưng điều đó không có gì, nó vẫn cho biết thông báo mô-đun đã xảy ra trong __init__.py
. Làm thế nào tôi có thể làm cho nó để điều này không xảy ra?