本文共 3978 字,大约阅读时间需要 13 分钟。
想要日志上云,又不想修改程序代码? 或者不希望进行相对复杂的客户端部署?那么您需要使用Logging Handler,现在Python程序也支持了!
使用Python SDK提供的Log Handler可以实现每一条Python程序的日志在不落盘的情况下自动上传到日志服务上。与写到文件再通过各种方式上传比起来,有如下优势:
只需要安装即可得到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)
之后日志即可自动上传到日志服务,如果要使用统计查询功能,最好打开索引。
将接受日志的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
接受一个列表来调整想要配置的域。
下面例子中,我们修改之前的日志配置文件,只收集个别域如module
、func_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'] )
如果期望更加灵活的配置, 也可以使用代码配置, 如下
#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
的初始化方式, 用的是传入命名参数的方式. 具体参数列表可以参考.
dictConfig
, 参考. 转载地址:http://zjhlx.baihongyu.com/