为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Web API ASP.Net 引入大量日志

如何在 Web API ASP.Net 引入大量日志

C#
皈依舞 2022-09-04 17:04:17
我是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:在现实世界中,我不会有那个循环。我希望我的 API 引入大数据,我的 API 的定义应该是什么?我需要使用称为多格式/数据的文件吗?请指导我。
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

我没有太多的背景,所以基本上会尝试从我如何看待它来提供答案。

首先,我不会将数据发送到 webapi,而是将数据直接发送到 S3。在 Azure 中有共享访问令牌,因此你可以向你的 api 发送请求,以提供上传文件的 url(有很多选项,但你可以通过时间限制,按 IP 限制谁可以上传)。所以上传文件1。做电话获取上传网址, 2.放到该网址。看起来在亚马逊上它被称为签名政策

在写入将在S3上传时触发的lambda函数之后,此函数将发送事件(再次,我不知道它在AWS中如何,但在azure中,我将发送Blob队列消息),此事件将包含文件和起始位置的URL。

编写第二个Lambda来侦听事件并进行实际处理,因此在我的应用程序中,有时我知道要处理N个项目需要10秒,因此由于部署的性质,我通常选择N不超过10-20秒。处理了 N 行并且尚未完成后,发送相同的事件,但现在开始位置 = 乞求上的开始位置 + N。

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

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

PS2.文件格式取决于 json,因为它是读取这些文件的最简单方法,但请记住,如果您有大文件,将整个文件读取到内存将很昂贵。以下是如何正确阅读它们的示例。所以其他选项可能只是平面文件,然后很容易阅读它,因为这样你可以读取范围并处理它

PS3.在 azure 中,我会使用 Azure Batch Jobs


查看完整回答
反对 回复 2022-09-04
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

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

  • 日志级别(信息、调试、警告、致命)

  • 日志消息(字符串)

  • 应用程序标识

  • 应用程序实例标识

  • 应用程序 IP

  • 主机(记录错误的计算机)

  • 用户 ID(发生错误的用户)

  • UTC 格式的时间戳(错误发生的时间)

  • 其他数据(可自定义为 xml / json)

我建议通过 Gateway 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


查看完整回答
反对 回复 2022-09-04
  • 2 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号