前言

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

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

阿里云日志地址: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. postman传入cookie的三种方式

    1.直接在环境变量里面设置 2.在登录接口的tests,把返回值的cookie设置为全局变量 3.直接在cookie里面传入

  2. 给HTML5 Video 设置多语言字幕文件

    现在各种支持HTML5的浏览器都能够播放html5视频了,但是对于字幕的支持却很少,我们期待像DVD那样强大的字幕. 往往我们还不得不通过js来做,着实是一件痛苦的事情. 现在IE10率先对HTML5 ...

  3. hdu2155 小黑的镇魂曲(dp)

    题意:                             小黑的镇魂曲 Problem Description 这个事情发生在某一天,当小黑和SSJ正在约会的时候,邪恶的Guner抓走了SSJ, ...

  4. XML / HTML / XHTML 的区别

    目录 HTML XML XHTML HTML HTML(HyperText Markup Language):超文本标记语言,是一种用于创建网页的标准标记语言,是用来格式化并显示数据的 用HTML语法 ...

  5. 神经网络与机器学习 笔记—Rosenblatt感知器收敛算法C++实现

    Rosenblatt感知器收敛算法C++实现 算法概述 自己用C++实现了下,测试的例子和模式用的都是双月分类模型,关于双月分类相关看之前的那个笔记: https://blog.csdn.net/u0 ...

  6. Android开机时间分析

    http://blog.csdn.net/huangyabin001/article/details/42777703

  7. js--吐血总结最近遇到的变态表单校验---element+原生+jq+easyUI(前端职业生涯见过的最烦的校验)

    最近写了无数各种形式的表单,记录下奇奇怪怪的校验规则~ 一:首先是element自带的rules校验规则: element作为常用框架,自带rules属性简单易懂,官方文档一目了然,不再赘述,应付常用 ...

  8. HEVC学习(一) —— HM的使用

    http://blog.csdn.net/hevc_cjl/article/details/8169182 首先自然是先把这个测试模型下载下来,链接地址如下:https://hevc.hhi.frau ...

  9. 进程Queue和线程Queue区别

    进程Queue from multiprocessing import Queue q=Queue() 线程Queue import queue q=queue.Queue()

  10. MySQL之数据定义语言(DDL)

    写在前面 本文中 [ 内容 ] 代表啊可选项,即可写可不写. SQL语言的基本功能介绍 SQL是一种结构化查询语言,主要有如下几个功能: 数据定义语言(DDL):全称Data Definition L ...