使用Logging Handler自动上传Python程序日志到日志服务-阿里云开发者社区

开发者社区> 成喆> 正文

使用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)

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

v1

配置日志服务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接受一个列表来调整想要配置的域。
进一步参考日志域列表

下面例子中,我们修改之前的日志配置文件,只收集个别域如modulefunc_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, 参考这里.

进一步参考

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python系列直播——深入Python与日志服务,玩转大规模数据分析处理实战
Python系列直播——深入Python与日志服务,玩转大规模数据分析处理实战
4839 0
python日志模块---logging
1.将日志打印到屏幕 1 import logging 2 3 logging.debug('This is debug message---by liu-ke') 4 logging.info('This is info message---by liu-ke') 5 logging.
574 0
ACK容器服务虚拟节点使用阿里云日志服务来收集业务容器日志
按照这篇博文的介绍,可以在ACK集群上通过Helm的方式部署虚拟节点,提升集群的弹性能力。现在,通过虚拟节点部署的ECI弹性容器实例也支持将stdout输出、日志文件同步到阿里云日志服务(SLS)进行统一管理,所有日志能够被统一收集同一个日志服务project里面。
2764 0
Docker日志自动化: ElasticSearch、Logstash、Kibana以及Logspout
本文讲的是Docker日志自动化: ElasticSearch、Logstash、Kibana以及Logspout,【编者的话】本文主要介绍了如何使用ElasticSearch、Logstash、Kibana和Logspout技术栈来部署自动化的日志系统。
3013 0
SSH 文件上传错误:encountered 1 errors during the transfer终极解决方法:
以下方法简单排序,从简单到复杂: 法一:在SSH Secure File Transfer(上传文件那个),打开“Operation”菜单,打开“File Transfer Mode”子菜单,再选择“Binary”,OK! 法二:把服务器上同名文件删掉再传 法三:如果文件在桌面上,将要上传的文件复制到其它分区,再上传! 法四:到 http://winscp.
831 0
+关注
成喆
不忘初心 方得始终
101
文章
2
问答
来源圈子
更多
阿里云存储基于飞天盘古2.0分布式存储系统,产品包括对象存储OSS、块存储Block Storage、共享文件存储NAS、表格存储、日志存储与分析、归档存储及混合云存储等,充分满足用户数据存储和迁移上云需求,连续三年跻身全球云存储魔力象限四强。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载