前言

好久没有出来夸白了,今天教大家简单的使用阿里云分布式日志,来存储日志,没有阿里云账号的,可以免费注册一个

开通阿里云分布式日志(有一定的免费额度,个人测试学习完全没问题的,香)

阿里云日志地址:https://sls.console.aliyun.com/lognext/profile

  1. 先开通阿里云日志,这个比较简单授权就可以了

  2. 选择接入数据,我们这里选 .NET

  3. 选择项目名称,没有项目的可以去创建一个,项目名称后面会用到,如果你有购买阿里云ECS,项目区域最好选择跟ECS同一个区域(每个区域的地址不一样,同一个区域可以选择内网通讯,速度更快),如果没有,就随便选个区域,我这里选择的是杭州

  4. 选择日志库,没有就创建一个

  5. 数据源配置,这个先不用管,后面有教程

  6. 设置分析配置,例如我这里设置了两个,可以根据业务需求来,没有特殊要求不用设置

  7. 开通完成,可以正常看到仪盘表

  8. 设置密钥

通过SDK 写入日志

    LogServiceClientBuilders.HttpBuilder
.Endpoint("<endpoint>", "<projectName>")
.Credential("<accessKeyId>", "<accessKey>")
.Build();
  • 阿里云提供的依赖注入代码(autofac),很遗憾按照这个方式,并没有获取到对象
using Aliyun.Api.LogService;
using Autofac; namespace Examples.DependencyInjection
{
public static class AutofacExample
{
public static void Register(ContainerBuilder containerBuilder)
{
containerBuilder
.Register(context => LogServiceClientBuilders.HttpBuilder
// 服务入口<endpoint>及项目名<projectName>
.Endpoint("<endpoint>", "<projectName>")
// 访问密钥信息
.Credential("<accessKeyId>", "<accessKey>")
.Build())
// `ILogServiceClient`所有成员是线程安全的,建议使用Singleton模式。
.SingleInstance();
}
}
}
  • 中间个有小插曲,由于公司使用阿里云日志比较早,也非常稳定,替换成我申请的阿里云日志的配置,发送日志一直报错,找了半天没找到原因,提了工单,原来阿里云使用了新的SDK



重新封装阿里云日志SDK(Aliyun.Log.Core) https://github.com/wmowm/Aliyun.Log.Core

  • 问了下群友,刚好有大佬重写过向阿里云提交日志这块,一番py交易,代码块到手,主要是数据组装,加密,发送,发送部分的代码基于http的protobuf服务实现,这里直接从阿里云开源的SDK里拷贝过来,开始重新封装,主要实现以下功能
  1. 实现 .net core DI
  2. 加入队列,让日志先入列,再提交到阿里云,提高系统吞吐量
  3. 对日志模型进行封装,满足基础业务需求

代码如下

  1. 添加ServiceCollection 拓展,定义一个阿里云日志的配置信息委托,然后将需要注入的服务注册进去即可
  public static AliyunLogBuilder AddAliyunLog(this IServiceCollection services, Action<AliyunSLSOptions> setupAction)
{
if (setupAction == null)
{
throw new ArgumentNullException(nameof(setupAction));
}
//var options = new AliyunSLSOptions();
//setupAction(options);
services.Configure(setupAction);
services.AddHttpClient();
services.AddSingleton<AliyunSLSClient>();
services.AddSingleton<AliyunLogClient>();
services.AddHostedService<HostedService>(); return new AliyunLogBuilder(services);
}
  1. 加入队列比较简单,定义一个队列,使用HostedService 消费队列
  /// <summary>
/// 写日志
/// </summary>
/// <param name="log"></param>
/// <returns></returns>
public async Task Log(LogModel log)
{
AliyunLogBuilder.logQueue.Enqueue(log);
}
  /// <summary>
/// 消费队列
/// </summary>
Task.Run(async () =>
{
using (var serviceScope = _provider.GetService<IServiceScopeFactory>().CreateScope())
{
var _options = serviceScope.ServiceProvider.GetRequiredService<IOptions<AliyunSLSOptions>>();
var _client = serviceScope.ServiceProvider.GetRequiredService<AliyunSLSClient>();
while (true)
{
try
{
if (AliyunLogBuilder.logQueue.Count>0)
{
var log = AliyunLogBuilder.logQueue.Dequeue();
var logInfo = new LogInfo
{
Contents =
{
{"Topic", log.Topic.ToString()},
{"OrderNo", log.OrderNo},
{"ClassName", log.ClassName},
{ "Desc",log.Desc},
{ "Html",log.Html},
{ "PostDate",log.PostDate},
},
Time = DateTime.Parse(log.PostDate)
};
List<LogInfo> list = new List<LogInfo>() { logInfo };
var logGroupInfo = new LogGroupInfo
{
Topic = log.Topic.ToString(),
Source = "localhost",
Logs = list
};
await _client.PostLogs(new PostLogsRequest(_options.Value.LogStoreName, logGroupInfo));
}
else
{
await Task.Delay(1000);
} }
catch (Exception ex)
{
await Task.Delay(1000);
}
}
}
});
  1. 定义日志模型,可以根据业务情况拓展
  public class LogModel
{
/// <summary>
/// 所在类
/// </summary>
public string ClassName { get; set; } /// <summary>
/// 订单号
/// </summary>
public string OrderNo { get; set; } /// <summary>
/// 提交时间
/// </summary>
public string PostDate { get; set; } /// <summary>
/// 描述
/// </summary>
public string Desc { get; set; } /// <summary>
/// 长字段描述
/// </summary>
public string Html { get; set; } /// <summary>
/// 日志主题
/// </summary>
public string Topic { get; set; } = "3"; }

使用Aliyun.Log.Core

  1. 获取Aliyun.Log.Core包

方案A. install-package Aliyun.Log.Core

方案B. nuget包管理工具搜索 Aliyun.Log.Core

  1. 添加中间件
services.AddAliyunLog(m =>
{
m.AccessKey = sls.GetValue<string>("AccessKey");
m.AccessKeyId = sls.GetValue<string>("AccessKeyId");
m.Endpoint = sls.GetValue<string>("Host");
m.Project = sls.GetValue<string>("Project");
m.LogStoreName = sls.GetValue<string>("LogstoreName");
});
  1. 写入日志
//获取对象
private readonly IOptions<SlsOptions> _options;
private readonly AliyunLogClient _aliyunLogClient;
public HomeController(IOptions<SlsOptions> options, AliyunLogClient aliyunLogClient)
{
_options = options;
_aliyunLogClient = aliyunLogClient;
} [HttpGet("/api/sendlog")]
public async Task<JsonResult> SendLog(string topic="1")
{
//日志模型
LogModel logModel = new LogModel()
{
ClassName = "Aliyun.log",
Desc = "6666666666xxxxxx",
Html = "99999999999xxxxx",
Topic = topic,
OrderNo = Guid.NewGuid().ToString("N"),
PostDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
};
await _aliyunLogClient.Log(logModel);
return Json("0");
}

简单的查询日志

.net core 使用阿里云分布式日志的更多相关文章

  1. 重磅发布: 阿里云WAF日志实时分析上线 (含视频)

    摘要: 阿里云WAF与日志服务打通,对外开发Web访问与攻击日志.提供近实时的网站具体的日志自动采集存储.并提供基于日志服务的查询分析.报表报警.下游计算对接与投递的能力. 背景 Web攻击形势 互联 ...

  2. .net core 使用阿里云短信发送SMS

    阿里云官方的skd(aliyun-net-sdk-core,aliyun-net-sdk-dysmsapi)在dnc中发送短信会出错,nuget上的包貌似也一样不管用.直接改下sdk当然也可以,但就发 ...

  3. 阿里云分布式缓存OCS与DB之间的数据一致性

    [分布式系统的数据一致性问题]   OCS概要介绍 据AlertSite网络分析公司表示,Facebook的响应时间在2010年平均为1秒钟,到2011年中期已提高到了0.73秒.对比来看,响应时间占 ...

  4. 在.NET Core中使用Exceptionless分布式日志收集框架

    一.Exceptionless简介 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF, ...

  5. asp.net core mcroservices 架构之 分布式日志(三):集成kafka

    一 kafka介绍 kafka是基于zookeeper的一个分布式流平台,既然是流,那么大家都能猜到它的存储结构基本上就是线性的了.硬盘大家都知道读写非常的慢,那是因为在随机情况下,线性下,硬盘的读写 ...

  6. asp.net core mcroservices 架构之 分布式日志(一)

    一 简介 无论是微服务还是其他任何分布式系统,都需要一个统一处理日志的系统,这个系统 必须有收集,索引,分析查询的功能.asp .net core自己的日志是同步方式的,正如文档所言: 所以必须自己提 ...

  7. asp.net core mcroservices 架构之 分布式日志(二)之自定义日志开发

    netcore日志原理 netcore的日志是作为一个扩展库存在的,每个组件都有它的入口,那么作为研究这个组件的入口是最好的,首先看两种方式: 这个是源码例子提供的. var loggingConfi ...

  8. 阿里云分布式关系数据库DRDS笔记

    1.Join左边的表查询数据越少,性能越好 2.广播表作为Join的驱动表 3.SQL的Limit优化 SELECT * FROM t_order o WHERE o.id IN ( SELECT i ...

  9. 阿里云k8s应用最新日志采集不到的问题

    问题描述: 阿里云k8s应用日志之前一直都是可以正常的采集, 先出现一问题, 通过kibana 和阿里云的日志服务都没法展示最新的k8s应用的日志, 部分应用的最新日志有被采集到,但大部分应用日志没有 ...

随机推荐

  1. mysql is null 和 =null 区别

    数据库中 null 表示 不可知,不确定所以 判断都用 字段 is null的方式进行判断而 = null .<> null 的判断结果,仍然是不可知,不确定,所以 不会返回任何结果.或者 ...

  2. 1017. Convert to Base -2

    Given a number N, return a string consisting of "0"s and "1"s that represents it ...

  3. 【vue环境】vue : 无法加载文件 C:\Users\1111111\AppData\Roaming\npm\vue.ps1,因为在此系统禁止运行脚本

    在用脚手架搭建vue项目时,提示:无法加载文件 C:\Users\1111111\AppData\Roaming\npm\vue.ps1,因为在此系统禁止运行脚本 这是你笔记本禁止运行脚本,解决办法 ...

  4. tp5 composer phpexcel使用方法

    1.compser 安装phpexcel.在windows命令行下输入:进入网站根目录,compser phpoffice/phpexcel 2.页面引入两个类: use PHPExcel_IOFac ...

  5. PHP + JQuery 实现多图上传并预览

    简述 PHP + JQuery实现 前台:将图片进行base64编码,使用ajax实现上传 后台:将base64进行解码,存储至文件夹,将文件名称入库 效果图 功能实现 html <!DOCTY ...

  6. IDEA 新建 Java 项目 (图文讲解, 良心教程)

    IDEA 新建 Java 项目 (图文讲解, 良心教程) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载 ...

  7. 关于Java处理串口二进制数据的问题 byte的范围 一个字节8bits

    前置知识点 byte的范围[-128~127] 内存里表现为 0x00~0xFF 刚好是一个8bits的字节 问题 byte[] hexData = new byte[] {0x01, 0x03, 0 ...

  8. .NET 在信创常用软件适配清单之中?

    2020年8月份写了一篇文章<.NET Core也是国产化信息系统开发的重要选项>, 这又过去了大半年了,在信创领域发生了很大的变化,今天写这篇文章主要是想从信创常用软件适配清单 看一看. ...

  9. 从系统的角度分析影响程序执行性能的因素——SA20225205 黄兴宇

    实验总结分析报告:从系统的角度分析影响程序执行性能的因素 1.请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的.自洽 ...

  10. jekyll-admin的搭建和使用

    通过jekyll搭建好了自己的博客.写博客成为了日常,经过一段时间的摸索,发现jekyll-admin是个好东西,它是博客的后台管理系统,可以方便的管理和编写自己的博客 安装 运行命令gem inst ...