天天看點

使用Python Log Handler自動上傳并解析JSON格式的日志

使用Python Log Handler自動上傳并解析JSON格式的日志

概述

使用Python SDK提供的Log Handler可以實作每一條Python程式的日志在不落盤的情況下自動上傳到日志服務上。與寫到檔案再通過各種方式上傳比起來,有如下優勢:

  1. 實時性:主動直接發送,不落盤
  2. 吞吐量大,異步發送
  3. 配置簡單:無需修改程式,無需知道機器位置,修改程式配置檔案即可生效
  4. 智能解析: 自動解析日志中JSON和KV格式資訊

本篇主要如何打開自動解析

JSON格式

的功能, 關于如何配置并使用的基本資訊, 請參考

使用Log Handler自動上傳Python日志

解決的問題

在程式中, 有時我們需要将特定資料輸出到日志中以便跟蹤, 例如:

data = {'name':u"小明", 'score': 100.0}           

一般情況下, 我們可以直接輸出資料, 如下:

response_data = {'name':u'小明', 'score': 100.0}
logger.info(response_data)           

這樣會輸出的消息為:

{'name':u'小明', 'score': 100.0}           

因為Python格式化的原因, 資料的字元串形式并不是真正的JSON格式. 并且我們期望在上傳到日志服務時可以自動解析出域

name

score

字段. 使用Python Handler的簡單配置即可做到. 如下.

通過Logging的配置檔案

參考

Logging Handler的詳細配置

, 将其中參數清單修改為:

args=(os.environ.get('ALIYUN_LOG_SAMPLE_ENDPOINT', ''), os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSID', ''), os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSKEY', ''), os.environ.get('ALIYUN_LOG_SAMPLE_TMP_PROJECT', ''), "logstore", None, None, None, None, None, None, None, None, True)

最後一個參數對應了Logging Handler的

詳細參數

extract_json

參數.

注意, 受限于

Python Logging

的限制, 這裡隻能用無名參數, 依次傳入. 對于不改的參數, 用

None

占位.

通過代碼以JSON形式配置

如果期望更加靈活的配置, 也可以使用代碼配置, 如下将參數

extract_json

設定為

True

即可.

#encoding: utf8
import logging, logging.config, os

# 配置
conf = {'version': 1,
        'formatters': {'rawformatter': {'class': 'logging.Formatter',
                                        'format': '%(message)s'}
                       },
        'handlers': {'sls_handler': {'()':
                                     'aliyun.log.QueuedLogHandler',
                                     'level': 'INFO',
                                     'formatter': 'rawformatter',

                                     # custom args:
                                     'end_point': os.environ.get('ALIYUN_LOG_SAMPLE_ENDPOINT', ''),
                                     'access_key_id': os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSID', ''),
                                     'access_key': os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSKEY', ''),
                                     'project': 'project1',
                                     'log_store': "logstore1",
                                     'extract_json': True
                                     }
                     },
        'loggers': {'sls': {'handlers': ['sls_handler', ],
                                   'level': 'INFO',
                                   'propagate': False}
                    }
        }
logging.config.dictConfig(conf)

# 使用
logger = logging.getLogger('sls')


response_data = {'name':u'小明', 'score': 100.0}
logger.info(response_data)
           

域名沖突

當關鍵字和

内置日志域

沖突時, 需要做一些調整, 例如:

c1 = 'student="xiao ming" level=3'           

這裡的

level

和日志域的内建表示日志級别沖突了, 可以通過參數

buildin_fields_prefix

/

buildin_fields_suffix

給系統日志域添加字首字尾;

或者通過參數

extract_json_prefix

extract_json_suffix

給抽取的域添加字首字尾來解決.

其他定制參數

自動抽取KV也支援更多其他相關參數如下:

參數 作用 預設值
extract_json 是否自動解析KV False
extract_json_drop_message 比對KV後是否丢棄掉預設的message域
extract_json_prefix 給解析的域添加字首 空串
extract_json_suffix 給解析的域添加字尾
buildin_fields_prefix 給系統域添加字首
buildin_fields_suffix 給系統域添加字尾

進一步參考

  • 掃碼加入官方釘釘群 (11775223):
    使用Python Log Handler自動上傳并解析JSON格式的日志