
想要日志上雲,又不想修改程式代碼? 或者不希望進行相對複雜的用戶端部署?那麼您需要使用Logging Handler,現在Python程式也支援了!
概述
使用Python SDK提供的Log Handler可以實作每一條Python程式的日志在不落盤的情況下自動上傳到日志服務上。與寫到檔案再通過各種方式上傳比起來,有如下優勢:
- 實時性:主動直接發送,不落盤
- 吞吐量大,異步發送
- 配置簡單:無需修改程式,無需知道機器位置,修改程式配置檔案即可生效
配置
隻需要安裝
阿裡雲日志服務SDK即可得到
aliyun.log.QueuedLogHandler
。
Log Handler與Python logging子產品完全相容,參考
Python LoggingPython logging子產品允許通過程式設計或者檔案的形式配置日志,如下我們通過檔案配置
logging.conf
:
[loggers] keys=root,sls [handlers] keys=consoleHandler, slsHandler [formatters] keys=simpleFormatter, rawFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_sls] level=INFO handlers=consoleHandler, slsHandler qualname=sls propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [handler_slsHandler] class=aliyun.log.QueuedLogHandler level=INFO formatter=rawFormatter 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") [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s [formatter_rawFormatter] format=%(message)s
這裡我們配置了一個
root
和一個
sls
的Log Handler, 其中
sls
是執行個體化類
aliyun.log.QueuedLogHandler
,并傳入參數(
詳細參數清單)如下:
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")
注意:這裡使用了
os.environ
來從環境變量中擷取相關配置。這裡也可以直接填寫實際的值。
上傳日志
使用logging配置檔案并輸出日志即可,日志會自動上傳。
import logging import logging.config # 配置 logging.config.fileConfig('logging.conf') logger = logging.getLogger('sls') # 使用logger logger.info("test1") try: 1/0 except ZeroDivisionError as ex: logger.exception(ex)
之後日志即可自動上傳到日志服務,如果要使用統計查詢功能,最好打開索引。
配置日志服務logstore的索引
将接受日志的Logstore的索引打開,将特定域進行索引。推薦使用
CLI進行配置如下:
aliyunlog log update_index --project_name="project1" --logstore_name="logstore1" --index_detail="file:///Users/user1/loghandler_index.json"
參考:配置檔案
python_logging_handler_index.json調整收集日志域
目前支援如下的日志資訊,預設會收集所有相關域:
域 | 說明 |
---|---|
message | 消息内容 |
record_name | logging handler的名字,上面例子是 |
level | 級别,INFO、ERROR等 |
file_path | 代碼檔案全路徑 |
func_name | 所在函數名 |
line_no | 行号 |
module | 所在子產品 |
thread_id | 目前線程Id |
thread_name | 目前線程名 |
process_id | 目前程序Id |
process_name | 目前程序名 |
參考類
QueuedLogHandler的參數
fields
接受一個清單來調整想要配置的域。
進一步參考
日志域清單下面例子中,我們修改之前的日志配置檔案,隻收集個别域如
module
、
func_name
等。(注意:
message
是一定會被收集的):
[handler_slsHandler] class=aliyun.log.QueuedLogHandler level=INFO formatter=rawFormatter args=('cn-beijing.log.aliyuncs.com', 'ak_id', 'ak_key', 'project1', "logstore1", 'mytopic', ['level', 'func_name', 'module', 'line_no'] )
使用JSON配置
如果期望更加靈活的配置, 也可以使用代碼配置, 如下
#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': 'my_project1', 'log_store': "my_logstore1" } }, 'loggers': {'sls': {'handlers': ['sls_handler', ], 'level': 'INFO', 'propagate': False} } } logging.config.dictConfig(conf) # 使用 logger = logging.getLogger('sls') logger.info("Hello world")
需要注意裡面
QueuedLogHandler
的初始化方式, 用的是傳入命名參數的方式. 具體參數清單可以參考
這裡.
更多關于Python的
dictConfig
, 參考
- 阿裡雲日志服務
- (Github開源)
- 掃碼加入官方釘釘群 (11775223):
使用Logging Handler自動上傳Python程式日志到日志服務