Python的 logging 模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如:文件、HTTP GET/POST、SMTP、Socket等,甚至可以自己实现具体的日志记录方式。logging 模块与 log4j 的机制是一样的,只是具体的实现细节不同。模块提供 logger、handler、filter、formatter。

Python日志格式

日志的格式在 formatter 中指定日志记录输出的具体格式。formatter 的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。

Python 日志格式:

import logging  
import logging.handlers  
LOG_FILE = 'tst.log'  
handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes = 1024*1024, backupCount = 5) # 实例化 handler   
fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s'  
formatter = logging.Formatter(fmt)   # 实例化 formatter  
handler.setFormatter(formatter)      # 为 handler 添加 formatter  
logger = logging.getLogger('tst')    # 获取名为 tst 的 logger  
logger.addHandler(handler)           # 为 logger 添加 handler  
logger.setLevel(logging.DEBUG)  
logger.info('first info message')  
logger.debug('first debug message')

字段含义

关于 formatter 的配置,采用的是 %(key)s 的形式,就是字典的关键字替换。提供的关键字包括:
格式 含义
%(name)s 生成日志的Logger名称。
%(levelno)s 数字形式的日志级别,包括DEBUG, INFO, WARNING, ERROR和CRITICAL。
%(levelname)s 文本形式的日志级别,包括’DEBUG’、 ‘INFO’、 ‘WARNING’、 ‘ERROR’ 和’CRITICAL’。
%(pathname)s 输出该日志的语句所在源文件的完整路径(如果可用)。
%(filename)s 文件名。
%(module)s 输出该日志的语句所在的模块名。
%(funcName)s 调用日志输出函数的函数名。
%(lineno)d 调用日志输出函数的语句所在的代码行(如果可用)。
%(created)f 日志被创建的时间,UNIX标准时间格式,表示从1970-1-1 00:00:00 UTC计算起的秒数。
%(relativeCreated)d 日志被创建时间与日志模块被加载时间的时间差,单位为毫秒。
%(asctime)s 日志创建时间。默认格式是 “2003-07-08 16:49:45,896”,逗号后为毫秒数。
%(msecs)d 毫秒级别的日志创建时间。
%(thread)d 线程ID(如果可用)。
%(threadName)s 线程名称(如果可用)。
%(process)d 进程ID(如果可用)。
%(message)s 日志信息。

日志样例

日志输出样例:

2015-03-04 23:21:59,682 - log_test.py:16 - tst - first info message   
2015-03-04 23:21:59,682 - log_test.py:17 - tst - first debug message

常见的Python日志及其正则表达式:

  • 日志样例:
    2016-02-19 11:03:13,410 - test.py:19 - tst - first debug message
    正则表达式:
    (\d+-\d+-\d+\s\S+)\s+-\s+([^:]+):(\d+)\s+-\s+(\w+)\s+-\s+(.*)
  • 日志格式:
    %(asctime)s - %(filename)s:%(lineno)s - %(levelno)s %(levelname)s %(pathname)s %(module)s %(funcName)s %(created)f %(thread)d %(threadName)s %(process)d %(name)s - %(message)s
    日志样例:
    2016-02-19 11:06:52,514 - test.py:19 - 10 DEBUG test.py test <module> 1455851212.514271 139865996687072 MainThread 20193 tst - first debug message

    正则表达式:

    (\d+-\d+-\d+\s\S+)\s-\s([^:]+):(\d+)\s+-\s+(\d+)\s+(\w+)\s+(\S+)\s+(\w+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\w+)\s+(\d+)\s+(\w+)\s+-\s+(.*)

配置Logtail收集Python日志

配置Logtail收集Python日志的详细操作步骤请参考五分钟快速入门,根据您的网络部署和实际情况选择对应配置。

  1. 创建Project和Logstore。详细步骤请参考准备流程
  2. Logstore列表页面单击数据接入向导图标,进入数据接入向导。
  3. 选择数据类型。

    选择文本文件并单击下一步

  4. 配置数据源。
    1. 填写配置名称日志路径,并选择日志收集模式为完整正则模式
    2. 开启单行模式
    3. 输入日志样例


    4. 开启提取字段
    5. 配置正则表达式
      1. 通过划选生成正则表达式。

        如果自动生成的正则表达式不匹配您的日志样例,可以通过划选的方式生成正则表达式。日志服务支持对日志样例划词自动解析,即对您在划词时选取的字段自动生成正则表达式。请在日志样例中划选日志字段内容,并单击正则正则表达式一栏中会出现划选内容的正则式。您可以通过多次划选生成日志样例的完整正则表达式。



      2. 调整正则表达式。

        鉴于实际的日志数据格式可能会有细微变动,单击手动输入正则表达式,根据实际情况对自动生成的正则表达式做出调整,使其符合收集过程中所有可能出现的日志格式。

      3. 验证正则表达式。

        正则表达式修改完成后,单击验证 。如果正则式没有错误,会出现字段提取的结果,如果有错误请再次调整正则式。

    6. 确认日志内容抽取结果

      查看日志字段的解析结果,并为日志内容抽取结果填写对应的Key。

      分别为日志字段提取结果取一个有意义的字段名称,比如时间字段的命名为time。如果不使用系统时间,您必须指定Value为时间的字段,并将其Key命名为为time。



    7. 开启使用系统时间

      如果使用系统时间,则每条日志时间为Logtail客户端解析该条日志内容的时间。

    8. (可选)配置高级选项
    9. 单击 下一步

    Logtail配置完成后,将此配置应用到机器组即可开始规范收集Python日志。