天天看點

使用Logging Handler自動上傳Python程式日志到日志服務

使用Logging Handler自動上傳Python程式日志到日志服務

想要日志上雲,又不想修改程式代碼? 或者不希望進行相對複雜的用戶端部署?那麼您需要使用Logging Handler,現在Python程式也支援了!

概述

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

  1. 實時性:主動直接發送,不落盤
  2. 吞吐量大,異步發送
  3. 配置簡單:無需修改程式,無需知道機器位置,修改程式配置檔案即可生效

配置

隻需要安裝

阿裡雲日志服務SDK

即可得到

aliyun.log.QueuedLogHandler

Log Handler與Python logging子產品完全相容,參考

Python Logging

Python 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)           

之後日志即可自動上傳到日志服務,如果要使用統計查詢功能,最好打開索引。

使用Logging Handler自動上傳Python程式日志到日志服務

配置日志服務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的名字,上面例子是

sls

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程式日志到日志服務

繼續閱讀