博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Logging Handler自动上传Python程序日志到日志服务
阅读量:5996 次
发布时间:2019-06-20

本文共 3978 字,大约阅读时间需要 13 分钟。

想要日志上云,又不想修改程序代码? 或者不希望进行相对复杂的客户端部署?那么您需要使用Logging Handler,现在Python程序也支持了!

概述

使用Python SDK提供的Log Handler可以实现每一条Python程序的日志在不落盘的情况下自动上传到日志服务上。与写到文件再通过各种方式上传比起来,有如下优势:

  1. 实时性:主动直接发送,不落盘
  2. 吞吐量大,异步发送
  3. 配置简单:无需修改程序,无需知道机器位置,修改程序配置文件即可生效

配置

只需要安装即可得到aliyun.log.QueuedLogHandler

Log Handler与Python logging模块完全兼容,参考

Python logging模块允许通过编程或者文件的形式配置日志,如下我们通过文件配置logging.conf

[loggers]keys=root,sls[handlers]keys=consoleHandler, slsHandler[formatters]keys=simpleFormatter, rawFormatter[logger_root]level=DEBUGhandlers=consoleHandler[logger_sls]level=INFOhandlers=consoleHandler, slsHandlerqualname=slspropagate=0[handler_consoleHandler]class=StreamHandlerlevel=DEBUGformatter=simpleFormatterargs=(sys.stdout,)[handler_slsHandler]class=aliyun.log.QueuedLogHandlerlevel=INFOformatter=rawFormatterargs=(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 loggingimport logging.config# 配置logging.config.fileConfig('logging.conf')logger = logging.getLogger('sls')# 使用loggerlogger.info("test1")try:    1/0except ZeroDivisionError as ex:    logger.exception(ex)

之后日志即可自动上传到日志服务,如果要使用统计查询功能,最好打开索引

v1

配置日志服务logstore的索引

将接受日志的Logstore的索引打开,将特定域进行索引。推荐使用进行配置如下:

aliyunlog log update_index --project_name="project1" --logstore_name="logstore1" --index_detail="file:///Users/user1/loghandler_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 当前进程名

参考类的参数fields接受一个列表来调整想要配置的域。

进一步参考

下面例子中,我们修改之前的日志配置文件,只收集个别域如modulefunc_name等。(注意:message是一定会被收集的):

[handler_slsHandler]class=aliyun.log.QueuedLogHandlerlevel=INFOformatter=rawFormatterargs=('cn-beijing.log.aliyuncs.com', 'ak_id', 'ak_key', 'project1', "logstore1", 'mytopic', ['level', 'func_name', 'module', 'line_no']  )

使用JSON配置

如果期望更加灵活的配置, 也可以使用代码配置, 如下

#encoding: utf8import 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):
    image

转载地址:http://zjhlx.baihongyu.com/

你可能感兴趣的文章
Get a developer license for windows store app
查看>>
策略模式
查看>>
Android Studio导入第三方类库的方法
查看>>
zxing二维码
查看>>
.NET平台下的微信SDK(Rabbit.WeiXin)开源发布
查看>>
简要介绍如何集成Vitamio安卓版SDK
查看>>
BZOJ1107 : [POI2007]驾驶考试egz
查看>>
div与span区别及用法
查看>>
Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
查看>>
【转载】COM小结
查看>>
[android] AndroidManifest.xml - 【 manifest -> permission】
查看>>
20150728月度会议
查看>>
explain mysql性能优化
查看>>
NoSql---MongoDB基本操作
查看>>
【移动开发】WIFI热点通信(二)
查看>>
C#多线程编程实例 螺纹与窗口交互
查看>>
ByteBuffer用法小结
查看>>
使用linux mysql客户端建立表时遇到格式解析的问题
查看>>
find the mincost route(最小环,最短路,floyd)
查看>>
TCP 的那些事儿(上)
查看>>