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

  • 自己写一个日志系统
  • 找一个现成的
  • 不记录日志了
  • 综合考虑,第三点肯定是不靠谱的,第一点成本太高,公司本来就比较忙,那就只能去找一个现成的了…

    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创建对应的仪表盘

    "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 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.运行结果

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

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

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

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

    作者:Leo_wl
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。