完成日志触发器创建后,您可以开始写入函数代码。本文介绍如何使用函数计算控制台编写函数,实现日志服务收集增量日志时触发该函数,函数计算获取对应日志,然后打印收集的日志。

前提条件

创建触发器

编写函数代码(Python)

  1. 登录函数计算控制台
  2. 在顶部菜单栏,选择地域。
  3. 在左侧导航栏,单击服务-函数
  4. 找到目标服务下的目标函数,单击函数名称。
  5. 单击代码执行页签,在代码编辑器中编写代码。
    本文以 Python 函数代码为例。以下示例代码可以作为提取大部分逻辑日志的模板。其中 accessKeyIdaccessKey 可以填写在代码内,也可以从 contextcreds 中获取。
    # -*- coding: utf-8 -*-
    import logging
    import json
    from aliyun.log import LogClient
    from time import time
    
    def logClient(endpoint, creds):
      logger = logging.getLogger()
      logger.info('creds info')
      logger.info(creds.access_key_id)
      logger.info(creds.access_key_secret)
      logger.info(creds.security_token)
      accessKeyId = 'your accessKeyId'
      accessKey = 'your accessKeyId scr'
      client = LogClient(endpoint, accessKeyId, accessKey)
      return client
    
    def handler(event, context):
      logger = logging.getLogger()
      logger.info('start deal SLS data')
      logger.info(event.decode().encode())
      info_arr = json.loads(event.decode())
      fetchdata(info_arr['source'],context)
      return 'hello world'
    
     def fetchdata(event,context):
      logger = logging.getLogger()
      endpoint = event['endpoint']
      creds = context.credentials
      client = logClient(endpoint, creds)
      if client == None :
          logger.info("client creat failed")
          return False
      project = event['projectName']
      logstore = event['logstoreName']
      start_cursor = event['beginCursor']
      end_cursor = event['endCursor']
      loggroup_count = 10
      shard_id = event['shardId']
      while True:
          res = client.pull_logs(project, logstore, shard_id, start_cursor, loggroup_count, end_cursor)
          res.log_print()
          next_cursor = res.get_next_cursor()
          if next_cursor == start_cursor :
              break
          start_cursor = next_cursor
    
        #log_data =  res.get_loggroup_json_list()
      return True                        

event 格式说明

event 是函数计算的入口参数。具体格式为如下。

{
    "parameter": {},
    "source": {
        "endpoint": "http://cn-shanghai-intranet.log.aliyuncs.com",
        "projectName": "log-com",
        "logstoreName": "log-en",
        "shardId": 0,
        "beginCursor": "MTUyOTQ4MDIwOTY1NTk3ODQ2Mw==",
        "endCursor": "MTUyOTQ4MDIwOTY1NTk3ODQ2NA=="
    },
    "jobName": "1f7043ced683de1a4e3d8d70b5a412843d817a39",
    "taskId": "c2691505-38da-4d1b-998a-f1d4bb8c9994",
    "cursorTime": 1529486425
}                       
参数 描述
parameter 您配置触发器时填写的函数配置。
source 设置函数读取的日志块信息。
  • endpoint:日志服务 Project 所属的阿里云地域。
  • projectName:日志服务 Project 名称。
  • logstoreName:Logstore 名称。
  • shardId:Logstore 中一个确定的 Shard。
  • beginCursor:从 Shard Cursor 的位置开始消费数据。
  • endCursor:从 Shard Cursor 的位置停止消费数据。
jobName 日志服务 ETL Job 名字,函数配置的日志服务触发器对应一个日志服务的 ETL Job。
taskId 对于 ETL Job 而言,taskId 是一个确定性的函数调用标识。
cursorTime 本次函数调用包括的数据中,最后一条日志到达日志服务端的 unix_timestamp。

后续步骤

调试函数