本文介绍如何通过Logtail采集Python日志。

背景信息

Python的logging模块提供通用的日志系统,可供第三方模块或者应用使用。logging模块定义了不同的日志级别和记录日志的方式。logging模块包括logger、handler、filter、formatter四个组件。

在formatter中定义日志输出格式,采用%(key)s形式。
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 - %(levelno)s %(levelname)s %(pathname)s %(module)s %(funcName)s %(created)f %(thread)d %(threadName)s %(process)d %(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')
具体字段说明如下所示。
字段 说明
%(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 日志创建时间与logging模块被加载时间的时间差,单位为毫秒。
%(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

操作步骤

  1. 登录日志服务控制台
  2. 接入数据区域,选择正则-文本日志
  3. 选择日志空间页签中,选择目标Project和Logstore,单击下一步
    您也可以单击立即创建,重新创建Project和Logstore,详情请参见步骤1:创建Project和Logstore
  4. 创建机器组页签中,创建机器组。
  5. 机器组配置页签中,应用机器组。
    选择一个机器组,将该机器组从源机器组移动到应用机器组
  6. Logtail配置页签中,创建Logtail配置。
    参数 说明
    配置名称 Logtail配置的名称,设置后不可修改。

    您也可以单击导入其他配置,导入其他Project中已创建的Logtail配置。

    日志路径 指定日志的目录和文件名。
    日志文件名支持完整文件名和通配符两种模式,文件名规则请参见Wildcard matching。日志文件查找模式为多层目录匹配,即指定目录(包含所有层级的目录)下所有符合条件的文件都会被查找到。例如:
    • /apsara/nuwa/ … /*.log表示/apsara/nuwa目录(包含该目录的递归子目录)中后缀名为.log的文件。
    • /var/logs/app_* … /*.log*表示/var/logs目录下所有符合app_*模式的目录(包含该目录的递归子目录)中包含.log的文件。
    说明
    • 一个文件只能被一个Logtail配置采集。
    • 目录通配符只支持星号(*) 和问号(?) 。
    设置采集黑名单 开启该功能后,可设置黑名单配置。黑名单配置可在采集时忽略指定的目录或文件,目录和文件名支持完整匹配,也支持通配符模式匹配。例如:
    • 选择按目录路径,路径为/tmp/mydir,则在采集时过滤掉该目录下的所有文件。
    • 选择按文件路径,路径为/tmp/mydir/file,则在采集时过滤掉该文件。
    是否为Docker文件 如果是Docker文件,可以直接配置内部路径与容器Tag,Logtail会自动监测容器创建和销毁,并根据Tag进行过滤采集指定容器的日志。关于容器文本日志采集请参见通过DaemonSet-控制台方式采集Kubernetes文件
    模式 配置为完整正则模式
    单行模式 开启单行模式,即每行为一条日志。
    日志样例 输入如下日志样例。
    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
    提取字段 开启提取字段,通过正则表达式将日志内容提取为Key-Value对。
    正则表达式 本示例中,配置为(\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+(.*),在实际场景中,根据以下方式配置正则表达式。
    • 自动生成正则表达式

      日志样例框中,选中需要提取的字段,单击生成正则,自动生成正则表达式。

    • 手动输入正则表达式。

      单击手动输入正则表达式,手动配置。配置完成后,单击验证即可验证您输入的正则表达式是否可以解析、提取日志样例,详情请参见如何调试正则表达式

    日志抽取内容 开启提取字段后,需要设置。

    通过正则表达式将日志内容提取为Value后,您需要为每个Value设置对应的Key。

    使用系统时间 开启提取字段后,需要设置。
    • 开启使用系统时间,则日志时间为采集日志时,Logtail所在主机的系统时间。
    • 关闭使用系统时间,则需要在日志抽取内容中指定某一个Value为时间字段,并命名为time。选取时间字段后,您可以单击时间转换格式中的自动生成生成解析该时间字段的方式。关于日志时间格式的更多信息请参见时间格式
    丢弃解析失败日志
    • 开启丢弃解析失败日志,解析失败的日志不上传到日志服务。
    • 关闭丢弃解析失败日志,日志解析失败时上传原始日志。
    最大监控目录深度 设置日志目录被监控的最大深度。最大深度范围:0~1000,0代表只监控本层目录。
    请根据您的需求选择高级配置。如没有特殊需求,建议保持默认配置。
    参数 详情
    启用插件处理 请选择是否启用Logtail处理。开启该功能后,使用Logtail插件处理日志,具体配置请参见处理数据
    上传原始日志 开启该功能后,原始日志内容作为__raw__字段与解析过的日志一起上传到日志服务。
    Topic生成方式
    • 空-不生成Topic:默认选项,表示设置Topic为空字符串,在查询日志时不需要输入Topic即可查询。
    • 机器组Topic属性:设置为机器组Topic属性,用于明确区分不同服务器产生的日志数据。
    • 文件路径正则:设置为文件路径正则,则需要配置自定义正则,用正则表达式从路径里提取一部分内容作为Topic。用于区分不同用户或实例产生的日志数据。
    日志文件编码
    • utf8:指定使用UTF-8编码。
    • gbk:指定使用GBK编码。
    时区属性 设置采集日志时,日志时间的时区属性。
    • 机器时区:默认为机器所在时区。
    • 自定义时区:手动选择时区。
    超时属性 如果一个日志文件在指定时间内没有任何更新,则认为该文件已超时。
    • 永不超时:持续监控所有日志文件,永不超时。
    • 30分钟超时:如果日志文件在30分钟内没有更新,则认为已超时,并不再监控该文件。

      选择30分钟超时时,还需配置最大超时目录深度,范围为1~3。

    过滤器配置 只采集完全符合过滤器中的条件的日志。 例如:
    • 满足条件即采集:配置Key:level Regex:WARNING|ERROR,表示只采集level为WARNING或ERROR类型的日志。
    • 过滤不符合条件的数据
      • 配置为Key:level Regex:^(?!.*(INFO|DEBUG)).*,表示不收集level为INFO或DEBUG类型的日志。
      • 配置为Key:url Regex:.*^(?!.*(healthcheck)).*,表示不采集URL中带有healthcheck的日志,例如key为url,value为/inner/healthcheck/jiankong.html的日志将不会被采集。

    更多示例请参见regex-exclude-wordregex-exclude-pattern

    Logtail配置完成后,日志服务开始采集Python日志。

  7. 查询分析配置页签中,设置索引。
    默认已设置索引,您也可以根据业务需求,重新设置索引,具体请参见开启并配置索引
    说明
    • 全文索引和字段索引属性必须至少启用一种。同时启用时,以字段索引属性为准。
    • 索引类型为long、double时,大小写敏感和分词符属性无效。