4.12. 使用logging记录曰志信息

仅仅将栈信息输出到控制台是远远不够的,更为常见的是使用日志保存程序运行过程中 的相关信息。 如运行时间、描述信息以及错误或者异常发生时候的特定上下文信息。Python 中自带的logging模块提供了日志功能, 它将logger的level分为5个级别(如表所示), 可以通过LoggersetLevelOvl)来设置,其中DEBUG为最低级别,CRIT丨CAL为最高级別, 默认的级別为WARNING。

表 日志级别

Level

使用情形

DEBUG

详细的信息.在追踪问题的时候使用

INFO

正常的信息

WARNING

一些不可预见的 问题发生,或者将要发生,如磁盘空间低等,伹不影响程序的运行

ERROR

由于某些严重的问题,程序中的一些功能受到影响

C RITFCAL

严重的错误.或者程序本身不能够继续运行

logging lib包含以下4个主要对象:

4.12.1. 1)logger。

logger是程序信息输出的接口,它分散在不同的代码中,使得程序可以在 运行的时候记录相应的信息,并根据设置的日志级别或filter来决定哪些信息需要输出,并 将这些信息分发到其关联的handler。常用的方法有Logger.setLevel()、 Logger.addHarKiler()、 Logger.removeHandlcr()、 Logger.addFilter()、Logger.debug()、Logger.info()、Logger warning()、Logger.error()、etLogger()等。

4.12.2. 2)Handler 。

Handler用来处理信息的输出,可以将信息输出到控制台、文件或者网络。 可以通过 Logger.addHandler()来给 logger 对象添加 handler,常用的 handler 有 StreamHandler 和FileHandler类。StreamHandler发送错误信息到流,而FileHandler类用于向文件输出日志 信息,这两个handler定义在logging的核心模块中。其他的handler定义在logging.handles 模块中,如 HTTPHandler、SocketHandler。

4.12.3. 3) Formatter。

决定log信息的格式,格式使用类似于%(< dictionary key >)s的形式来定义,如’%(asctime)s - %(levelname)s - %(message)s’,支持的 key 可以在 Python 自带的文档 LogRecord attributes 中査看。

4.12.4. 4)Filter。

用来决定哪些信息需要输出。可以被handler和logger使用,支持层次关系, 比如,如果设置了 filter名称为A.B的logger,则该logger和其子logger的信息会被输出, 如 A.B、 A.B.C.

logging.basicConfig([**kwargs])提供对日志系统的基本配置,默认使用StreamHandler和 Formatter并添加到root logger,该方法自Python2.4开始可以接受字典参数,支持的字典参 数如表4-4所示。

表4-4字典参数格式类型

格式

描述

filename

指定Fi]eHandler的文件名,而不是默认的SireamHandkr

filemode

打开文件的模式,同open函数中的N名参数.默认为’a’

format

输出格式字符串

datefmt

日期格式

level

设置根logger的日志级别

stream

指定StrcamHandleru这个参数若与filename冲突,忽略stream

我们通过修改上一节的例子来看如何结合traceback和logging,记录程序运行过程中的异常。

>>> import traceback
>>> import sys
>>> import logging
>>>
>>> gList = ['a','b','c','d','e','f','g']
>>>
>>> logging.basicConfig(# 配置日志的输出方式及格式
>>>     level = logging.DEBUG,
>>>     filename = 'log.txt',
>>>     filemode = 'w',
>>>     format = '% (asctime)s % (filename)s[line: % (lineno)d] %(levelname)s % (message)s',
>>>
>>> )
>>>
>>> def f():
>>>     gList[5]
>>>     logging.info('[INFO] :calling method g() in f()') # 记录正常的信患
>>>     return g()
>>> def g():
>>>     logging.info('[INFO] :calling method h() in g()')
>>>     return h()
>>> def h():
>>>     logging.info('[INFO] :Delete element in gList in h()')
>>>     del gList[2]
>>>     logging.info('[INFO] :calling method i() in h()')
>>>     return i()
>>> def i():
>>>     logging.info('[INFO] :Append element i to gList in i()')
>>>     gList.append('i')
>>>     print(gList[7])
>>> if __name__=='__main__':
>>>     logging.debug('Information during calling f():')
>>>     try:
>>>         f()
>>>     except IndexError as ex:
>>>         print ("Sorry,Exception occured,you accessed an element out of range")
>>> #         traceback.print_exc()
>>>         ty,tv,tb = sys.exc_info()
>>>         logging.error("[ERROR]:Sorry,Exception occured,you accessed an element out of range") #记录异常错误信息
>>>         logging.critical('object info: %s' %ex)
>>>         logging.critical('Error Type: {0},Error Information : {1}'.format(ty,tv)) #记录异常的类型和对应的值
>>>         logging.critical(''.join(traceback.format_tb(tb)))#记录具体的trace信息
>>>         sys.exit(1)
>>>
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 32, in <module>
    logging.debug('Information during calling f():')
Message: 'Information during calling f():'
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 17, in f
    logging.info('[INFO] :calling method g() in f()') # 记录正常的信患
Message: '[INFO] :calling method g() in f()'
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 20, in g
    logging.info('[INFO] :calling method h() in g()')
Message: '[INFO] :calling method h() in g()'
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 21, in g
    return h()
  File "<ipython-input-10-7c5838082a54>", line 23, in h
    logging.info('[INFO] :Delete element in gList in h()')
Message: '[INFO] :Delete element in gList in h()'
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 21, in g
    return h()
  File "<ipython-input-10-7c5838082a54>", line 25, in h
    logging.info('[INFO] :calling method i() in h()')
Message: '[INFO] :calling method i() in h()'
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 21, in g
    return h()
  File "<ipython-input-10-7c5838082a54>", line 26, in h
    return i()
  File "<ipython-input-10-7c5838082a54>", line 28, in i
    logging.info('[INFO] :Append element i to gList in i()')
Message: '[INFO] :Append element i to gList in i()'
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 21, in g
    return h()
  File "<ipython-input-10-7c5838082a54>", line 26, in h
    return i()
  File "<ipython-input-10-7c5838082a54>", line 30, in i
    print(gList[7])
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 39, in <module>
    logging.error("[ERROR]:Sorry,Exception occured,you accessed an element out of range") #记录异常错误信息
Message: '[ERROR]:Sorry,Exception occured,you accessed an element out of range'
Arguments: ()
root        : ERROR    [ERROR]:Sorry,Exception occured,you accessed an element out of range
--- Logging error ---
Traceback (most recent call last):
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 21, in g
    return h()
  File "<ipython-input-10-7c5838082a54>", line 26, in h
    return i()
  File "<ipython-input-10-7c5838082a54>", line 30, in i
    print(gList[7])
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 40, in <module>
    logging.critical('object info: %s' %ex)
Message: 'object info: list index out of range'
Arguments: ()
root        : CRITICAL object info: list index out of range
--- Logging error ---
Traceback (most recent call last):
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 21, in g
    return h()
  File "<ipython-input-10-7c5838082a54>", line 26, in h
    return i()
  File "<ipython-input-10-7c5838082a54>", line 30, in i
    print(gList[7])
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 41, in <module>
    logging.critical('Error Type: {0},Error Information : {1}'.format(ty,tv)) #记录异常的类型和对应的值
Message: "Error Type: <class 'IndexError'>,Error Information : list index out of range"
Arguments: ()
root        : CRITICAL Error Type: <class 'IndexError'>,Error Information : list index out of range
--- Logging error ---
Traceback (most recent call last):
  File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 21, in g
    return h()
  File "<ipython-input-10-7c5838082a54>", line 26, in h
    return i()
  File "<ipython-input-10-7c5838082a54>", line 30, in i
    print(gList[7])
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
ValueError: unsupported format character '(' (0x28) at index 2
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/usr/lib/python3/dist-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/usr/lib/python3/dist-packages/ipykernel/kernelapp.py", line 497, in start
    self.io_loop.start()
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 132, in start
    self.asyncio_loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1775, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 450, in _handle_events
    self._handle_recv()
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 480, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/lib/python3/dist-packages/zmq/eventloop/zmqstream.py", line 432, in _run_callback
    callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/lib/python3/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
    user_expressions, allow_stdin)
  File "/usr/lib/python3/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/lib/python3/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2714, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2818, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-7c5838082a54>", line 42, in <module>
    logging.critical(''.join(traceback.format_tb(tb)))#记录具体的trace信息
Message: '  File "<ipython-input-10-7c5838082a54>", line 34, in <module>n    f()n  File "<ipython-input-10-7c5838082a54>", line 18, in fn    return g()n  File "<ipython-input-10-7c5838082a54>", line 21, in gn    return h()n  File "<ipython-input-10-7c5838082a54>", line 26, in hn    return i()n  File "<ipython-input-10-7c5838082a54>", line 30, in in    print(gList[7])n'
Arguments: ()
root        : CRITICAL   File "<ipython-input-10-7c5838082a54>", line 34, in <module>
    f()
  File "<ipython-input-10-7c5838082a54>", line 18, in f
    return g()
  File "<ipython-input-10-7c5838082a54>", line 21, in g
    return h()
  File "<ipython-input-10-7c5838082a54>", line 26, in h
    return i()
  File "<ipython-input-10-7c5838082a54>", line 30, in i
    print(gList[7])
Sorry,Exception occured,you accessed an element out of range
An exception has occurred, use %tb to see the full traceback.


SystemExit: 1
/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py:2886: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

修改程序后在控制台上对用户仅显示错误提示信息“Sony,Exception occured,Lyou accessed an element out of range”,而开发人员如果需要debug可以在日志文件中找到具体运行过程中的信息。

#为了节省篇幅仅显示部分曰志

2013-06-26 12:05:18,923 traceexample.py[line:41] CRITICAL object info:list index out of range

2013-06-26 12:05:18,923 traceexample.py[line:42] CRITICAL Error Type:<type ‘exceptions.IndexError’>, Error Information:list index out of range

2013-06-26 12:05:18,924 traceexample.py[line:43] CRITICAL File “traceexample.py”,

line 35, in

f()

File “traceexample.py”, line 15, in f

return g()

File “traceexample.py”, line 19, in g

return h()

File”traceexample.py”, line 2S, in h

return i()

File “traceexample.py”, line 30, in i

print(gList[7])

上面的代码中控制运行输出到console上用的是print(),但这种方法比较原始, logging模块提供了能够同时控制输出到console和文件的方法,下面的例子中通过添加 StreamHandler并设置日志级别为logging.ERROR,可以在控制台上输出错误信息。

>>> console = logging.StreamHandler()
>>> console.setLevel(logging.ERROR)
>>> formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
>>> console.setFormatter(formatter)
>>> logging.getLogger('').addHandler(console)

为了使Logging使用更为简单可控,logging支持loggin.config进行配置,支持dictConfig 和fileConftg两种形式,其中fileConfig是基于configparser()函数进行解析,必须包含的内容 为[loggers].、[handlers]和[formatters]。具体例子示意如下:

[loggers]

keys=root

[logger_root]

level=DEBUG

handlers=hand01

[handlers]

keys=hand01

[handler_hand01]

classs = StreamHandler

level=INFO

formatter=form01

arg5=(sys.stderr,)

[formatters]

keys=form01

[formatter_formO1]

format=% (asctime)s %(filename)s[line:% (lineno)d] %(levelname)s %(message)s

datefmt=%a, %d %b %Y %H:%M:%S

最后关于logging的使用,提以下几点建议:

1)尽管logging取一个名字而不是采用默认,这样当在不间的模块中使用的时候,其他模块只需要使用以下代码就可以方便地使用同一个logging,因为它本质上符合单例模式。

>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> logger=logging.getLogger(__name__)

2)为了方便地找出问题所在,logging的名字建议以模块或者class来命名。Logging名称遵循按”.”划分的继承规则,根是root logger, logger a.b的父logger对象为a。

3)Logging只是线程安全的,不支持多进程写人同一个日子文件,因此对于多个进程, 需要配置不同的日志文件。