
概述
使用Python SDK提供的Log Handler可以實作每一條Python程式的日志在不落盤的情況下自動上傳到日志服務上。與寫到檔案再通過各種方式上傳比起來,有如下優勢:
- 實時性:主動直接發送,不落盤
- 吞吐量大,異步發送
- 配置簡單:無需修改程式,無需知道機器位置,修改程式配置檔案即可生效
- 智能解析: 自動解析日志中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格式的日志