Serilog日志组件--.NET下使用 Seq结构化日志系统

作者:神秘网友 发布时间:2021-02-23 17:20:19

Serilog日志组件--.NET下使用 Seq结构化日志系统

前言

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

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

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

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

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

Seq简介

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

Log.Information("Hello, {Name}!", Environment.UserName);

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

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

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

Seq主要功能:

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

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

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

添加警报-当检测到警报情况时,可以通过邮件将情况通知到相关人员。单击仪表板图表上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命令运行查看。

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

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

2.添加Nuget程序包:

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

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

{
  "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()。

services.AddLogging(loggingBuilder =
            {
                //loggingBuilder.AddSeq();
                loggingBuilder.AddSeq(Configuration.GetSection("Seq"));
            });

5.配置依赖注入

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实例注入到控制器中,并写入日志

private ILoggerValuesController _logger;

        public ValuesController(ILoggerValuesController logger)
        {
            _logger = logger;
        }

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

7.运行结果

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

总结

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

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

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

Serilog日志组件--.NET下使用 Seq结构化日志系统 相关文章

  1. keep-alive

    keep-alive可以在组件切换时,保存其包裹的组件的状态,使其不被销毁,防止多次渲染。其拥有两个独立的生命周期钩子函数 activated和 deactivated,使用keep-alive包裹的组件在切换时不会被销毁,而是缓存到内存中并执行 deactivated钩子函数,命中缓存渲染后

  2. springboot 如何使用自定义注解+aop实现全局日志持久化操作

    1.自定一个注解 package com.hc.manager.common.aop.annotation; import java.lang.annotation.*; /** * LogAnnotation * * @author summer.chou * @version V1.0 * @date 2020年3月18日 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME

  3. adb logcat 查看Android APP日志

    Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件: 客户端

  4. linux shell相关 定时清除日志脚本

    Shell 教程 变量 定义变量时,变量名不加美元符号 变量名和等号之间不能有空格 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号。 使用一个定义过的变量,只要在变量名前面加美元符

  5. 企业级日志收集系统——ELKstack

    1 ELKstack简介 2 使用ELKstack对运维工作的好处: 3 ELK实验架构图 4 Elasticsearch集群安装配置 5 补充:ES2节点配置 6 配置集群管理插件(head) 7 Logstash部署 8 Logstash收集系统日志 9 Redis消息队列配置 10 Kibana部署 11 Nginx反向代理kibana使请求

  6. zabbix 监控交换机日志

    需求 我们需要监控交换机warn以上级别的日志,只要有warn及以上级别的日志输入,就需要发送报警给运维,我们使用的监控平台是zabbix,所以监控就需要使用zabbix来实现,下面是配置方法,供各位参考。 交换机配置 交换机启动日志收集,配置日志信息发送到日志

  7. logstash 收集日志到hdfs

    前言 通常情况下,我们将日志数据通过logstash收集到es,然后用kibana进行实时查询,可视化分析,这就是我们常用的elk架构。但是基于elk的日志分析,通常比较常用的是实时分析,日志存储一段时间就会删掉。那么在一些情况下,我需要将日志数据也存储一份到hd

  8. Asp.Net Core学习笔记:(二)视图、模型、持久化、文件、错误处理、日志

    TagHelper 入门 优点:根据参数自动生成,不需要手写超链接,类似Django模板里面的url命令。 在ViewImport中添加TagHelper @addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers 比如,链接TagHelper使用 a class="btn btn-outline-primary" asp-controller

  9. Redis 日志篇:系统高可用的杀手锏

    特立独行是对的,融入圈子也是对的,重点是要想清楚自己向往怎样的生活,为此愿意付出怎样的代价。 我们通常将 Redis 作为缓存使用,提高读取响应性能,一旦 Redis 宕机,内存中的数据全部丢失,假如现在直接访问数据库大量流量打到 MySQL 可能会带来更加严

  10. 【react + antd + table组件】上下移动光标

    div tabIndex={1} onKeyDown={this.handleOnKeydown} style={{outline: 'none'}} className="ordTempDateil" Modal key='3' width='800px' visible={OrdDaShow} closable={false} title={false} centered={true} pagination={false} footer={null} onCancel=

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词