.net core 使用阿里云分布式日志
前言
好久没有出来夸白了,今天教大家简单的使用阿里云分布式日志,来存储日志,没有阿里云账号的,可以免费注册一个
开通阿里云分布式日志(有一定的免费额度,个人测试学习完全没问题的,香)
先开通阿里云日志,这个比较简单授权就可以了
选择接入数据,我们这里选 .NET
选择项目名称,没有项目的可以去创建一个,项目名称后面会用到,如果你有购买阿里云ECS,项目区域最好选择跟ECS同一个区域(每个区域的地址不一样,同一个区域可以选择内网通讯,速度更快),如果没有,就随便选个区域,我这里选择的是杭州
选择日志库,没有就创建一个
数据源配置,这个先不用管,后面有教程
设置分析配置,例如我这里设置了两个,可以根据业务需求来,没有特殊要求不用设置
开通完成,可以正常看到仪盘表
设置密钥
通过SDK 写入日志
阿里云有提供对应的SDK(阿里云 .NET SDK的质量大家都懂),它主要是通过构造一个静态对象来提供访问的,地址: https://github.com/aliyun/aliyun-log-dotnetcore-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里拷贝过来,开始重新封装,主要实现以下功能
- 实现 .net core DI
- 加入队列,让日志先入列,再提交到阿里云,提高系统吞吐量
- 对日志模型进行封装,满足基础业务需求
代码如下
- 添加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);
}
- 加入队列比较简单,定义一个队列,使用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);
}
}
}
});
- 定义日志模型,可以根据业务情况拓展
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
- 获取Aliyun.Log.Core包
方案A. install-package Aliyun.Log.Core
方案B. nuget包管理工具搜索 Aliyun.Log.Core
- 添加中间件
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");
});
- 写入日志
//获取对象
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又抄了一遍,一并开源在github,地址: https://github.com/wmowm/Aliyun.Log.Core/tree/main/Aliyun.Log.Core.Client
- 推荐我自己写的一个Redis消息队列中间件InitQ,操作简单可以下载的玩玩
https://github.com/wmowm/initq
.net core 使用阿里云分布式日志的更多相关文章
- 重磅发布: 阿里云WAF日志实时分析上线 (含视频)
摘要: 阿里云WAF与日志服务打通,对外开发Web访问与攻击日志.提供近实时的网站具体的日志自动采集存储.并提供基于日志服务的查询分析.报表报警.下游计算对接与投递的能力. 背景 Web攻击形势 互联 ...
- .net core 使用阿里云短信发送SMS
阿里云官方的skd(aliyun-net-sdk-core,aliyun-net-sdk-dysmsapi)在dnc中发送短信会出错,nuget上的包貌似也一样不管用.直接改下sdk当然也可以,但就发 ...
- 阿里云分布式缓存OCS与DB之间的数据一致性
[分布式系统的数据一致性问题] OCS概要介绍 据AlertSite网络分析公司表示,Facebook的响应时间在2010年平均为1秒钟,到2011年中期已提高到了0.73秒.对比来看,响应时间占 ...
- 在.NET Core中使用Exceptionless分布式日志收集框架
一.Exceptionless简介 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF, ...
- asp.net core mcroservices 架构之 分布式日志(三):集成kafka
一 kafka介绍 kafka是基于zookeeper的一个分布式流平台,既然是流,那么大家都能猜到它的存储结构基本上就是线性的了.硬盘大家都知道读写非常的慢,那是因为在随机情况下,线性下,硬盘的读写 ...
- asp.net core mcroservices 架构之 分布式日志(一)
一 简介 无论是微服务还是其他任何分布式系统,都需要一个统一处理日志的系统,这个系统 必须有收集,索引,分析查询的功能.asp .net core自己的日志是同步方式的,正如文档所言: 所以必须自己提 ...
- asp.net core mcroservices 架构之 分布式日志(二)之自定义日志开发
netcore日志原理 netcore的日志是作为一个扩展库存在的,每个组件都有它的入口,那么作为研究这个组件的入口是最好的,首先看两种方式: 这个是源码例子提供的. var loggingConfi ...
- 阿里云分布式关系数据库DRDS笔记
1.Join左边的表查询数据越少,性能越好 2.广播表作为Join的驱动表 3.SQL的Limit优化 SELECT * FROM t_order o WHERE o.id IN ( SELECT i ...
- 阿里云k8s应用最新日志采集不到的问题
问题描述: 阿里云k8s应用日志之前一直都是可以正常的采集, 先出现一问题, 通过kibana 和阿里云的日志服务都没法展示最新的k8s应用的日志, 部分应用的最新日志有被采集到,但大部分应用日志没有 ...
随机推荐
- Ionic5路由跳转传值复用
1. 路由技术 ( 详细记录 ) 是笔记不是博文,觉得写的不够详细的可以使用Ctrl + W组合键 路由跳转页面 1. HTML 中使用 routerLink 属性路由进行跳转,传值时使用 query ...
- Word Reversal(string)
For each list of words, output a line with each word reversed without changing the order of the word ...
- Laravel5.6教程之——安装
1.安装 方式1:全局安装 通过composer安装 laravel 安装器 composer global require "laravel/installer" 1 确保将 c ...
- OD调试程序常用断点大全
常用断点 拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新 ...
- Android最新敲诈者病毒分析及解锁(11月版)
一.样本信息 文件名称:久秒名片赞,(无需积分s)(2)(1)(1).apk 文件大小:1497829字节 文件类型:application/jar 病毒类型:Android.CtLocker 样本包 ...
- Python中math和cmath模块的使用
目录 Math模块 Cmath模块 Math模块 pi 数字常量,圆周率 e 表示一个常量 sqrt(x) 求x的平方根 ...
- 『动善时』JMeter基础 — 7、jmeter.properties文件常用配置
目录 1.默认语言设置 2.配置默认编码格式 3.GUI图标放大比例设置 4.功能区工具栏图标大小设置 5.视图区目录树图标大小设置 6.内容区编辑字体设置 7.添加JMeter元素快捷键设置 8.捕 ...
- Linux安装Redis报错`cc:命令未找到`
缺少gcc和gcc-c++的编译环境,安装即可. 可以联网情况下使用命令 yum install gcc yum install gcc-c++ 然后清理原来的残余文件 make distclean ...
- CDH安装步骤
Six Steps to CDH Installation There are many options and potential paths that make each CDH cluster ...
- 【BUAA 软工个人项目作业】玩转平面几何
BUAA 软件工程个人项目作业 项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:BUAA软件工程个人项目作业 作业要求 课程目标 学习大规模软件开发的技巧与方法 ...