TomatoLog-1.1.0实现ILoggerFactory

TomatoLog

TomatoLog 是一个基于 .NETCore 平台的产品。

The TomatoLog 是一个中间件,包含客户端、服务端,非常容易使用和部署。

客户端实现了ILoggerFactory,使用服务注入成功后即可使用,对业务入侵非常小,也支持通过客户端调用写入日志流。

TomatoLog 的客户端和服务端目前都是基于 .NETCore 版本,客户端提供了三种日志流传输方式,目前实现了 Redis/RabbitMQ/Kafka 流。如果希望使用非 .NETCore 平台的客户端,你可以自己开放其它第三方语言的客户端,通过实现 TomatoLog 传输协议,将数据传送到管道(Redis/RabbitMQ/Kafka)中即可。

TomatoLog 服务端还提供了三种存储日志的方式,分别是 File、MongoDB、Elasticsearch,存储方式可以通过配置文件指定。在 TomatoLog 服务端,我们还提供了一个Web 控制台,通过该控制台,可以对日志进行查询、搜索,对服务过滤器进行配置,警报配置、通知发送等等,其中,可使用的警报通知方式有:SMS 和 Email 两种方式,但是,SMS 其本质是一个 Http 请求,通过 SMS 的配置,可以实现向所有提供了 Http 接口的网关发送通知。

TomatoLog 系统架构

640?wx_fmt=png

Get Started

使用客户端

选择安装以下客户端中的任意一项

Install-Package TomatoLog.Client.Redis	
Install-Package TomatoLog.Client.RabbitMQ	
Install-Package TomatoLog.Client.Kafka

TomatoLog客户端配置文件 appsetting.json

{	"TomatoLog": {	"LogLevel": "Information",	"ProjectLabel": "Example",	"ProjectName": "Example",	"SysOptions": {	"EventId": true,	"IP": true,	"IPList": true,	"MachineName": true,	"ProcessId": true,	"ProcessName": true,	"ThreadId": true,	"Timestamp": true,	"UserName": true	},	"Tags": null,	"Version": "1.0.0",	"Exchange": "TomatoLog-Exchange",	"ExchangeType": "direct",	"Host": "127.0.0.1",	"Password": "123456",	"Port": 5672,	"QueueName": "TomatoLog-Queue",	"RouteKey": "All",	"UserName": "lgx",	"vHost": "TomatoLog"	}	
}

服务注入

public void ConfigureServices(IServiceCollection services)	
{	services.AddSingleton<ITomatoLogClient>(factory =>	{	var options = this.Configuration.GetSection("TomatoLog").Get<EventRabbitMQOptions>();	var client = new TomatoLogClientRabbitMQ(options);	return client;	});	...	
}

配置启用

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory, ITomatoLogClient logClient)	
{	factory.UseTomatoLogger(logClient);	...	
}

使用 TomatoLogClient

[Route("api/[controller]")]	
[ApiController]	
public class HomeController : ControllerBase	
{	private readonly ITomatoLogClient logClient;	private readonly ILogger logger;	public HomeController(ILogger<HomeController> logger, ITomatoLogClient logClient)	{	this.logger = logger;	this.logClient = logClient;	}	[HttpGet]	public async Task<ActionResult<IEnumerable<string>>> Get()	{	// Used by ILogger	this.logger.LogError("测试出错了");	// Used By ITomatoLogClient	try	{	await this.logClient.WriteLogAsync(1029, LogLevel.Warning, "Warning Infomation", "Warning Content", new { LastTime = DateTime.Now, Tips = "Warning" });	throw new NotSupportedException("NotSupported Media Type");	}	catch (Exception ex)	{	await ex.AddTomatoLogAsync();	}	return new string[] { "value1", "value2" };	}	
}

部署服务端

首先,下载服务端压缩包文件 版本预览 ,该压缩包仅包含项目运行必需文件,托管该服务端的服务器上必须按照 DotNET Core SDK 2.2+

接下来,解压文件,修改 appsetting.Environment.json 文件将服务器进行配置,将配置好的服务端部署到你的服务器上,可以为 TomatoLog 选择 IIS 或者其它托管方式,服务端默认运行端口为:20272.

编辑服务端配置文件

{	"Logging": {	"IncludeScopes": false,	"LogLevel": {	"Default": "Debug",	"System": "Information",	"Microsoft": "Information"	}	},	"TomatoLog": {	"Cache-Redis": null, // 过滤器会使用该分布式缓存进行策略考量,如果有配置	"Config": {	"SysConfig": "Config/SysConfig.json" // 系统配置文件,可通过Web控制台进行配置	},	"Storage": {	"Type": "ToFile", //ToFile/ToES/ToMongoDB 可以选择的存储方式	"File": "D:\\TomatoLog\\Storage", // 如果Type选择了 ToFile ,则这里必须指定绝对路径	"ES": "http://127.0.0.1:9200/", // 如果Type选择了ToES,这里必须配置 Elasticsearch 服务地址	"MongoDB": "mongodb://root:root@127.0.0.1:27017/admin" //如果Type选择了ToMongoDB,这里必须配置 ToMongoDB 数据库链接	},	"Flow": {	"Type": "RabbitMQ", // Redis/RabbitMQ/Kafaka 这里指定客户端和服务器的传输管道类型,两端配置必须一致	"Redis": {	"Connection": null,	"Channel": "TomatoLogChannel"	},	"RabbitMQ": { // 如果使用了 RabbitMQ,则必须配置该节点	"Host": "127.0.0.1",	"Port": 5672,	"UserName": "root",	"Password": "123456",	"vHost": "TomatoLog",	"Exchange": "TomatoLog-Exchange",	"ExchangeType": "direct",	"QueueName": "TomatoLog-Queue",	"RouteKey": "All",	"Channels": 1 // 运行的消息队列实例数量	},	"Kafka": {	"Group": "TomatoLogServer",	"BootstrapServers": "127.0.0.1:9092",	"Topic": "TomatoLog"	}	}	}	
}

番茄日志服务端控制台长什么样

在浏览器中打开地址:http://localhost:20272/

首页看日志列表

640?wx_fmt=png

日志详情、弹出查看详情、日志搜索、支持ES/MongoDB/File搜索

640?wx_fmt=png

全局日志处理、警报配置

640?wx_fmt=png

针对单个项目的详细日志处理、警报配置

640?wx_fmt=png

一次打包,到处运行

不管是从项目结构还是解决方案,我都强调简单就是最美的根本要求,解决方案的内容虽然看起来很多,但是你也只需要按需引用其中一个客户端就可以了,服务端更是如此,全站都打包在一个 .NETCore 的应用程序中,程序的警报配置都是存储在配置文件中的,无需数据库支持。

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU 4609 3-idiots(FFT)

3-idiots 思路 多项式卷积的经典应用了: 看样例一: 4 1 3 3 4我们用多项式系数表示得到一个与aia_iai​有关的多项式:010210\ 1\ 0\ 2\ 10 1 0 2 1, 也就说明原序列有0个1,1个1,0个2,2个3,…

P5488 差分与前缀和(多项式/生成函数)

P5488 差分与前缀和 对于这道题需要我们快速对一个数列求解前缀和和差分,那么我们利用生成函数的知识,就可以知道实际上等价于乘一个多项式,然后我们就有了一个ln和exp的方法,然后比较简短的方法就是将其利用广义二项式定理展开&…

2019-02-23-算法-进化

题目描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。示例 2: 输入: "cbbd" 输…

Docker(二)-在Docker中部署Nginx实现负载均衡(视频)

一、前言在前面的文章中我们已经介绍了如何在Centos7系统中安装Docker以及利用Docker进行Asp.Net Core应用的部署。在本文中,我们将继续介绍利用Docker部署Nginx服务实现负载均衡,我们通过视频方式向大家进行演示。注:查看公众号历史文章&…

P4389 付公主的背包(生成函数/多项式)

P4389 付公主的背包 https://www.luogu.com.cn/problem/solution/P4389 经典生成函数问题 求解无限背包问题,我们可以将每个物品看作一个多项式,那么最后的结果就是这些多项式的卷积的系数,然后我们实际上就可以考虑分治NTT了,但…

HDU 6265 Master of Phi

Master of Phi 推式子 ∑d∣nϕ(nd)d给出了n的唯一分解形式我们先对上面式子进行化简通过组合枚举d,d的取值分别可以通过∏i1m∑j0qipij,一个多项式组合得到那么上述的式子有没有可能也通过这种新式得到呢,好像是可以的∑d∣nϕ(nd)d∏i1m∑…

Docker系列之镜像瘦身(五)

本节我们来讲讲在我们在构建镜像过程中不出问题,同时使得最后所构建的镜像文件大小尽可能最小。缓存(cache)Docker的优势之一在于提供了缓存,加速镜像迭代构建,我们知道构建镜像使用docker build命令,也就是说通过docker build的缓…

2019-02-24-算法-进化

题目描述 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下: L C I R E T O E S I I G E D H N之后,你的输出需要从左往右逐行读…

P5641 【CSGRound2】开拓者的卓识(多项式)

P5641 【CSGRound2】开拓者的卓识 https://www.luogu.com.cn/problem/solution/P5641 经典的讨论贡献的题目,如果一层一层展开就太暴力了,我们直接考虑每个数被计算了多少次,那么应该是它的左边放k-1个左括号,右边放k-1个右括号的…

2019-02-25-算法-进化

题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例1: 输入: 123 输出: 321示例2: 输入: -123 输出: -321示例3: 输入: 120 输出: 21我的解法: public int reverse(…

一张图了解.Net Core和.NetFx和.Net Standard和Xamarin关系

一张图了解.Net Core和.Net Framework和.Net Standard和Xamarin关系总结.NET Standard是一项API规范,每一个特定的版本,都定义了必须实现的基类库。.NET Core是一个托管框架,针对构建控制台、云、ASP.NET Core和UWP应用程序进行了优化。每一种…

Java修炼之路——基础篇——String

String 1:字符串的不可变性 什么是不可变对象?不可变对象是指创建后无法变更的对象 String为什么是不可变的?String类为final,并且内部字符数组也为final。所以String对象是不可变对象。 String类为什么要设计为不可变&#xff1…

P3338 [ZJOI2014]力(FFT)

P3338 [ZJOI2014]力 Fj∑i1j−1qiqj(i−j)2−∑ij1nqiqj(i−j)2Ej∑i1j−1qi(i−j)2−∑ij1nqi(i−j)2f(i)qi,g(i)1i2,f(0)0,g(0)0Ej∑i0jf(i)g(j−i)−∑ijnf(i)g(i−j)F_j \sum_{i 1} ^{j - 1} \frac{q_i \times q_j}{(i - j) ^ 2} - \sum_{i j 1} ^{n} \frac{q_i \times…

CF755G PolandBall and Many Other Balls(多项式/倍增fft)

CF755G PolandBall and Many Other Balls 倍增fft模版题 这种问题关键在于两个状态转移,一个是单点加1,还有一个是乘2,这样我们就相当于拥有了二进制下的左移操作和加1操作,那么可以在O(logn)的时间内表示出任何一个数。 然后对…

VS, VS Code, VS Online, VS xxx, 你都分清了吗?

首先说说部分童鞋容易混淆的 Visual Studio 和 Visual Studio Code 吧。其实,它们俩的关系,就相当于 Java 和 JavaScript,没啥关系。再说说 Visual Studio Online。这就复杂了。历史上,出现过两个 Visual Studio Online&#xff0…

Java修炼之路——基础篇——Java关键字

1:transient 当对象被序列化时,transient阻止其修饰的对象进行序列化;当反序列化时,此对象的值不会被恢复。 2:instanceof 判断引用指向的对象,是不是某个类及其子类的实例对象; class Person …

.NetCore从零开始使用Skywalking分布式追踪系统

将本文从0开始搭建两个webapi项目,使用Skywalking来追踪他们之间的调用关系及响应时间。开发环境为VisualStudio20191:安装Skywalking,可参考:https://www.cnblogs.com/sunyuliang/p/11422576.html,本列中搭建好后的Skywalking服务…

P3723 [AH2017/HNOI2017]礼物(FFT)

P3723 [AH2017/HNOI2017]礼物 式子化简 ∑i1n(xi−yj)2\sum_{i 1} ^{n} (x_i- y_j) ^2\\ i1∑n​(xi​−yj​)2 我们对第一个手环ccc,相当于(xic−yi)2(x_i c - y_i) ^ 2(xi​c−yi​)2,对第二个手环ccc相当于(xi−yi−c)2(x_i - y_i - c) ^2(xi​−…

CF623E Transforming Sequence(多项式/倍增fft/动态规划)

CF623E Transforming Sequence 经典的倍增NTT题目,但是由于万恶的模数导致这道题变成了倍增MTT 要求n个数前缀或严格递增的序列个数,一共有k位。 然后我们考虑进行dp,然后我的思路就是fi,jf_{i,j}fi,j​表示前i位在k位中有j位的方案数&…

2019-02-26-算法-进化(字符串转换成整数)

题目描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后…