前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET下使用 Seq结构化日志系统

.NET下使用 Seq结构化日志系统

作者头像
喝茶去
发布2019-04-16 16:32:50
1.6K0
发布2019-04-16 16:32:50
举报
文章被收录于专栏:知识累积知识累积

前言

     我们公司在日志管理方面一直没有统一,主要痛点有:

  1. 每个开发人员都是各用各的,存储日志的形式也是五花八门,如:本地文件,数据库,Redis,MongoDB
  2. 由于公司访问服务器要通过堡垒机,所以本机无法直连测试或生产环境。如果测试日志是写入本地文件,就需要开发人员只能登录服务器上查看日志,查看非常不方便。

     综合以上所述有三种选择:

  1. 自己写一个日志系统
  2. 找一个现成的
  3. 不记录日志了

    综合考虑,第三点肯定是不靠谱的,第一点成本太高,公司本来就比较忙,那就只能去找一个现成的了…

Seq简介

Seq是运行在一台机器上的日志服务器。您的应用程序通过像Serilog这样的框架发送结构化事件:

代码语言:javascript
复制
Log.Information("Hello, {Name}!", Environment.UserName);

结构化日志记录保留了自定义的属性值以及与每个事件关联的文本。

这些信息通过网络发送到Seq,Seq显示它们并使其可搜索:

目前支持三种语言:.NET与NET Core,Java,Node.js,以及Python。

     Seq主要功能:

丰富的事件数据 -以结构化形式记录上文信息与应用程序事件,支持消息模板将文本数据与结构话数据无缝连接。下图中所有属性都是由使用者自定义的。

image
image

多种查询方式 -支持以SQL表达式查询,以及C#中的,==,!=,<,<=,内置StartsWith(),EndsWith()IndexOf()Contains(),并支持文本全文检索。

视图选择器是表示表格,时间序列,条形图和饼图视图的一排图标。
视图选择器是表示表格,时间序列,条形图和饼图视图的一排图标。

仪表盘 - 搜索框添加查询语句也可以是SQL查询,匹配到相应的数据后,使用右侧的Add to dashboard创建对应的仪表盘

image
image
image
image

添加警报 -当检测到警报情况时,可以通过邮件将情况通知到相关人员。单击仪表板图表上ALERTS选项卡下的+按钮:

      Seq缺点:

  1. 内存消耗较高,属于那种有多少就吃多少,如果吃撑了,就又吐出来一部分返回给系统,真的是有点不要脸。
  2. 收费,非开源系统,所以免费版本功能会有阉割。

     详细介绍可查看官网文档:https://docs.getseq.net/docs

.NET Core实践

1.下载并安装Seq服务器 2.打开安装程序启动安装向导,一路下一步,完成后浏览器输入http://localhost:5341/#/events,5341是Seq的默认端口。Seq是托管在Windows服务中,通过win+r输入services.msc命令运行查看。

image
image
image
image

   环境搭建完成后,下面我们看下如何在项目中应用:

   1.新建一个项目,ASP.NET Core 或 MVC都可以

   2.添加Nuget程序包:

  • Seq.Extensions.Logging
  • Autofac
  • Autofac.Extensions.DependencyInjection

   3.在appsettings.json添加一个"Seq"属性:

代码语言:javascript
复制
{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Seq": {
      "ServerUrl": "http://localhost:5341/", //Seq本地环境地址.
      "ApiKey": "fCT0LNqspu3kituQMb", //在Seq系统创建的项目名称KEY值。可通过此KEY值检索出项目下的所有日志信息
      "MinimumLevel": "Trace",
      "LevelOverride": {
        "Microsoft": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  }
}

  4.   在你的Startup类的ConfigureServices()方法,调用AddSeq()上loggingBuilder提供AddLogging()。

代码语言:javascript
复制
services.AddLogging(loggingBuilder =>
            {
                //loggingBuilder.AddSeq();
                loggingBuilder.AddSeq(Configuration.GetSection("Seq"));
            });

5.配置依赖注入

代码语言:javascript
复制
public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddLogging(loggingBuilder =>
            {
                /*此方法默认使用本地地址: 5341端口*/
                //loggingBuilder.AddSeq();
                /*加载Seq配置*/
                loggingBuilder.AddSeq(Configuration.GetSection("Seq"));
            });
            services.AddMvc();

            /*这里使用Autofac作为依赖注入*/
            var containerBuilder = new ContainerBuilder();
            /*注入Seq记录日志对象*/
            containerBuilder.RegisterGeneric(typeof(Logger<>)).As(typeof(ILogger<>)).InstancePerMatchingLifetimeScope();
            /*因为更改了默认的依赖注入框架,所以需要将其原来的对象填充值新的依赖框架中*/
            containerBuilder.Populate(services);
            var container = containerBuilder.Build();
            return new AutofacServiceProvider(container);
        }

6.将ILogger实例注入到控制器中,并写入日志

代码语言:javascript
复制
private ILogger<ValuesController> _logger;

        public ValuesController(ILogger<ValuesController> logger)
        {
            _logger = logger;
        }

        // GET api/values
        [HttpGet]
        public IEnumerable<string> Get()
        {
            _logger.LogInformation("{Projece}&{ModuleName} Get  Test", "SeqExample", "Values");
            return new string[] { "value1", "value2" };
        }

7.运行结果

image
image

可以看到,我们通过消息模板,自定义了两个属性,Project和ModuleName。在实际使用中我们可以根据公司业务来建立统一的消息模板,对项目日志分类管理并查看。

总结

   由于现在我使用的是免费版的,在很多方面有限制,如:不能将本地改为公网地址(可通过反向代理解决),不支持邮件预警。

   类似这种限制还有,但都不影响使用,作为日志系统,免费版本的基础功能已经足够使用,并且查询性能并不弱。谁让.NET开源框架少了,比起自己写一个这样的系统,我已经很知足了!

   Seq目前在国内用的公司很少,所以此文只是抛砖引玉,便于大家在选择日志框架方面可以多一个选择,仅此而已。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Seq简介
  • .NET Core实践
  • 总结
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档