如何在ASP.Net Web API中提取大量日志

时间:2019-02-12 04:42:07

标签: c# .net rest asp.net-web-api asp.net-web-api2

我是API开发的新手,我想创建一个Web API端点,它将接收大量的日志数据。我想通过 Amazon Kinesis交付流将数据发送到 Amazon s3存储桶。以下是一个可以正常运行的示例应用程序,但我不知道如何获取大量数据,我的API应该以哪种格式接收数据?我的API端点应该是什么样子。

 [HttpPost]
 public async void Post() // HOW to allow it to receive large chunk of data?
 {
        await WriteToStream();
 }

    private async Task WriteToStream()
    {
        const string myStreamName = "test";
        Console.Error.WriteLine("Putting records in stream : " + myStreamName);
        // Write 10 UTF-8 encoded records to the stream.
        for (int j = 0; j < 10000; ++j)
        {
        // I AM HARDCODING DATA HERE FROM THE LOOP COUNTER!!! 
            byte[] dataAsBytes = Encoding.UTF8.GetBytes("testdata-" + j);
            using (MemoryStream memoryStream = new MemoryStream(dataAsBytes))
            {
                    PutRecordRequest putRecord = new PutRecordRequest();
                    putRecord.DeliveryStreamName = myStreamName;
                    Record record = new Record();
                    record.Data = memoryStream;
                    putRecord.Record = record;
                    await kinesisClient.PutRecordAsync(putRecord);
            }
        }
    }

P.S:在现实应用中,我不会使用for循环。我希望我的API吸收大数据,我的API的定义应该是什么?我是否需要使用称为 multiform / data file 的东西?请引导我。

2 个答案:

答案 0 :(得分:0)

这是我的思考过程。在公开用于记录的API时,您的输入应包含以下属性

  • 日志级别(信息,调试,警告,致命)
  • 日志消息(字符串)
  • 应用程序ID
  • 应用程序实例ID
  • 应用程序IP
  • 主机(记录错误的计算机)
  • 用户ID(发生错误的用户)
  • 以Utc为单位的时间戳记(发生错误的时间)
  • 其他数据(可自定义为xml / json)

我建议通过网关API将API公开为AWS lambda,因为它将有助于随着负载的增加而扩展。

要获取有关如何构建API和使用模型绑定的示例,请参考https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

答案 1 :(得分:0)

我没有太多上下文,因此基本上会尝试从我的看法中提供答案。

首先,不是将数据发送到webapi,而是将数据直接发送到S3。在蔚蓝中,存在共享访问令牌,因此您向api发送请求以向您提供url上载文件的位置(有很多选项,但您可以限制时间,可以限制可以上传IP的IP)。因此,要上传文件1.进行调用以获取上传网址,2.放入该网址。在亚马逊上看起来像Signed Policy

该写lambda函数将在S3上传时触发,此函数将发送事件(同样,我不知道它在AWS中如何运行,但天蓝色时,我将发送Blob Queue消息)此事件将包含指向文件的url并启动位置。

编写第二个Lambda来监听事件并进行实际处理,因此在我的应用中有时我知道处理N个项目需要10秒,因此由于自然原因,我通常选择N为不超过10-20秒的时间部署。在处理了N行并且尚未完成之后,发送相同的事件,但是现在开始位置=乞求时的开始位置+N。More info如何读取范围

通过这种方式设计,您可以处理大文件,甚至可以变得更聪明,因为您可以发送多个事件,在其中可以说出“开始行”,“结束行”,这样便可以在多个实例中处理文件。

PS。为什么我不建议您将文件上传到WebApi,因为这些文件将存储在内存中,所以可以说您有1GB的文件从多个来源发送,这种情况下您将在几分钟之内杀死服务器。

PS2。文件格式取决于,因为它是读取这些文件的最简单方法,所以它可能是json,但请记住,如果您有大文件,则将整个文件读取到内存中会很昂贵。这是example how to read them properly。因此,其他选项可能只是平面文件,因此易于阅读,因为这样您就可以读取范围并进行处理

PS3。天蓝色,我会使用Azure Batch Jobs