Net Core with 微服务 - Seq 日志聚合

createh52个月前 (02-04)技术教程10


日志聚合


日志是我们写程序离不开的一个东西。在我们排查问题的时候日志就是我们的救命稻草。我们的每个服务都在不停地生产日志。但是实施微服务后,如果按照传统的写本地文件的日志方案,显然会面临跟修改配置一样麻烦的境地。不同的日志分散在各个服务器、容器内,这种情况下查日志简直是生不如死。


日志聚合组件为我们解决了这个问题。所有的服务通过接口发送日志到聚合服务,再由聚合服务进行统一存储,并且提供统一的查询、分析的能力。


日志聚合组件业界有 ELK、Exceptionless、Seq 等。


Seq


Seq 是一款使用现代化技术构建的结构化日志存储,查询,分析工具。比起 ELK 这种组合要轻量级许多。只需要一个安装包就具有数据存储,查询,图表分析功能。它对 windows 友好,直接提供了安装包。当然也可以使用 docker 来部署。Seq 对于单个用户是免费的,这对于一些小团队并没有什么问题。Seq 一个比较强大的功能是提供了类似 Sql 语句的数据查询及处理能力,使得用户可以直接写 Select from 来得到自己想要的数据。



使用 docker 安装


docker run --name seq -e ACCEPT_EULA=Y -p 8900:80 -p 5341:5341 datalust/seq


使用 docker run 运行一个实例。8900 绑定容器的 80 端口,该端口是 web 管理界面的入口。5341 绑定容器的 5341 端口,该端口是日志写入时候真正的端口。


使用 docker-compose 安装


seq_server:
    image: datalust/seq
    restart: always
    container_name: seq_server
    hostname: seq_server
    environment:
      - ACCEPT_EULA=Y
    ports:
      - 8900:80
      - 5341:5341


把上面的 docker 命令改写成 docker-compose 命令。


安装好 seq 之后,我们访问一下 http://localhost:8090 如果管理后台出现说明我们安装成功了。



NLog 集成 Seq


seq 安装成功之后,我们可以开始跟 asp.net core 项目进行集成了。这里采用 Nlog 日志组件进行演示,如何跟 seq 集成。


?


点击 “API KEYS” 、“ADD API KEY” 弹出新增 API KEY 界面。


?


我们可以在这个界面为每个服务指定一个 APIKEY 当写入 Seq 的是用来区分服务。填写 title 信息,选择具有的权限,还可以自定义一些属性,这些属性会附加到每个日志记录上。比如我们这里为 member_center 这个 apikey 自定义一个 app = member_center 的属性。


Install-Package NLog.Targets.Seq


nuget 安装 Nlog 的 Seq 扩展。





  
    
  
  
  

    
    

    
      
        
        
      
    
  

  
  
    
    

    
  


在项目根目录添加一个 nlog.config 的 xml 配置文件。添加一个 seq 的 target ,在这个 target 上填写 serverUrl(seq的服务地址),apiKey。


public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.ConfigureKestrel(options =>
                    {
                        options.ListenAnyIP(6003);
                    });
                    webBuilder.UseStartup();
                })
                .UseNLog();


在 Program 文件的 CreateHostBuilder 方法最后追加 UseNLog 调用。


[ApiController]
    [Route("[controller]")]
    public class TestController : ControllerBase
    {
        private readonly ILogger _logger;

        public TestController(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger();
        }

        [HttpGet("TestLogSeq")]
        public string TestLogSeq()
        {
            _logger.LogTrace("this is a test log for trace level .");
            _logger.LogDebug("this is a test log for debug level .");
            _logger.LogInformation("this is a test log for info level .");
            _logger.LogWarning("this is a test log for warning level .");
            _logger.LogError(new Exception("this is a ex for seq log ."), "this is a test log for error level .");

            return "ok";
        }
    }


添加一个 TestController 编写一个 TestLogSeq 方法,在这里打一些日志。


?


我们访问一下这个接口,打开 seq 的站点可以看到我们的日志已经写到 seq 里面了。


查询


我们的服务每天都会产生数以万计的日志,现在把所有服务的日志都聚合在一起,那数量就更加庞大。在海量日志中查找需要的日志,显然变得很困难。


还好 Seq 带有强大的查询功能。我们可以像在数据库里查询那样,使用 Sql 语句来进行查询。


下面演示几个查询例子:


  1. like 查询


@Message like '%init%'


查询日志消息里带有 init 关键字的日志


?


2. = 查询


@Level = 'Error'


查询日志级别为 Error 的日志。


?


app = 'hotel_base'


查询所有 hotel_base 服务的日志。



3. 聚合函数


select count(1) from stream group by @Level


按日志级别分组,统计每个级别的数量。


?


以上简单的演示了几个查询方案,Seq 的查询相当的强大,具体请查看官方文档: the-seq-query-language


总结


通过以上内容,我们简单的演示了 Seq 日志聚合工具的安装、与.net core 进行集成,查询日志等功能。Seq 虽然比起 ELK 比较冷门,但是最近跟一些朋友交流下来,发现很多朋友都开始使用 Seq 来作为日志聚合工具了。这也说明 Seq 确实有一定的实力,大家不妨一试。

?

相关文章

JAVA和.NET谁更优秀?你选择谁?(java和.net哪个简单)

Java和.NET都是现代流行的编程语言,它们在许多方面都有各自的优缺点和优势。下面我们将详细分析Java和.NET谁更优秀,并给出具体理由。性能:Java和.NET在性能上没有明显的区别。它们都是基...

谁说.NET没有GC调优,只改一行代码就让程序不再占用内存

经常看到有群友调侃“为什么搞Java的总在学习JVM调优?那是因为Java烂!我们.NET就不需要搞这些!”真的是这样吗?今天我就用一个案例来分析一下。昨天,一位学生问了我一个问题:他建了一个默认的A...

net与java开发哪个好(.net和java哪个简单)

.NET和Java都是非常流行的开发平台,它们各自具有一些优点和缺点,选择哪个平台取决于项目的具体需求和开发团队的技能。下面是一些分析:.NET的优点:易于使用:.NET平台提供了一个易于使用的开发环...

java中的url 编码与解码(java urldecode解码)

在开始讨论编码解码之前,首先来明确一下问题。什么是application/x-www-form-urlencoded字符串?答:它是一种编码类型。当URL地址里包含非西欧字符的字符串时,系统会将这些字...

工作日报 2021.10.20 OkHttp3错误异常:unexpected end of stream

2021.10.20问题澄清:Plugtest IDMS对接版本准备;蓝牙手咪适配问题配合定位;Mcdata http彩信上传,接口方案DT联调;河北联创项目联调;OkHttp3错误异常: java....

从0构建我的世界生电客户端(java版)

启动器下载官方启动器 https://www.minecraft.net/zh-hans/store/minecraft-java-edition?ref=launcher(去网易就算了,点下面的留在...