【愚公系列】2022年12月 .NET CORE工具案例-PLG轻量级日志可视化服务

news2024/11/25 2:31:24

文章目录

  • 前言
    • 1.Serilog简介
    • 2.Grafana简介
    • 3.Loki是什么
  • 一、Serilog对接Grafana轻量级日志可视化服务
    • 1.Grafana部署
    • 2.Loki部署
    • 3.promtail部署
    • 4.测试.NET Core写入日志效果
    • 5.测试查询日志
  • 总结


前言

日志功能是几乎所有程序或系统都必备的一个功能。该文章通过使用Loki+Grafana来实现日志记录与可视化查询。

1.Serilog简介

Serilog 是 ASP.NET Core 的一个插件,能够简化日志记录。Serilog 有各类可用的接收器,例如,有纯文本、SQL 和 ElasticSearch 接收器等等。

2.Grafana简介

Grafana 是一个开源的监控数据分析和可视化套件。最常用于对基础设施和应用数据分析的时间序列数据进行可视化分析,也可以用于其他需要数据可视化分析的领域。Grafana 可以帮助你查询、可视化、告警、分析你所在意的指标和数据。可以与整个团队共享,有助于培养团队的数据驱动文化。

3.Loki是什么

Loki日志系统是受Prometheus启发由Grafana Labs团队开源的水平可扩展,高度可用的多租户日志聚合系统。它被设计得非常轻量高效且易于操作,使用标签来作为索引,而不是对全文进行检索,即通过这些标签既可以查询日志的内容也可以查询到监控的数据签,极大地降低了日志索引的存储。

一、Serilog对接Grafana轻量级日志可视化服务

ELK和PLG的比较

  • Elasticsearch中的数据作为非结构化JSON对象存储在磁盘上,Loki以二进制的形式存储。
  • Elasticsearch采用全文索引,倒排索引的切分和共享的成本较高。Loki仅索引元数据,比如标签。
  • 和Prometheus无缝集成。

ELK和PLG对应关系

ELK组件PLG组件功能
ElasticSearchLoki主服务器,负责存储日志和处理查询
Logstashpromtail代理,负责收集日志并将其发送给主服务器
KibanaGrafana用于查询和显示日志

本文只是简单介绍使用,具体复杂用法参考官网

官网配置参考:https://grafana.com/docs/loki/latest/configuration/

在这里插入图片描述

1.Grafana部署

1、下载Grafana安装包
Grafana官网:https://grafana.com/grafana/download?platform=windows
在这里插入图片描述

2、安装grafana
解压之后打开bin文件夹运行 grafana-server.exe后打开http://localhost:3000 即可跳转到登陆页面。初始用户名和密码都是admin
在这里插入图片描述
网页页面如下

在这里插入图片描述

登陆以后,就可以看到grafana的主页面了
在这里插入图片描述

2.Loki部署

1、下载Loki
Loki官网:https://github.com/grafana/loki/releases
在这里插入图片描述

2、安装Loki
进入到解压后的Loki文件夹下,可以看到Loki的运行程序,此处我们在该目录下,新加一个配置文件config.yaml

auth_enabled: false

server:
  http_listen_port: 3100

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
  max_transfer_retries: 0

schema_config:
  configs:
    - from: 2022-12-06
      store: boltdb
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 168h

storage_config:
  boltdb:
    directory: /tmp/loki/index

  filesystem:
    directory: /tmp/loki/chunks

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h

chunk_store_config:
  max_look_back_period: 0s

table_manager:
  retention_deletes_enabled: false
  retention_period: 0s

在这里插入图片描述

启动Loki服务

.\loki-windows-amd64.exe --config.file=config.yaml

在这里插入图片描述

3.promtail部署

1、下载promtail
Loki官网:https://github.com/grafana/loki/releases
在这里插入图片描述

2、安装promtail
进入到解压后的promtail文件夹下,可以看到promtail的运行程序,此处我们在该目录下,新加一个配置文件config.yaml

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: mylogs
      __path__: C:\Users\Happy\devTools\Loki\LokiDemo\logs\*.log"

在这里插入图片描述

启动promtail服务

.\promtail-windows-amd64.exe --config.file=config.yaml

在这里插入图片描述

4.测试.NET Core写入日志效果

引用serilog包,有关引用的包详情
在这里插入图片描述

appsettings.json配置文件

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Serilog": {
    "Using": [
      "Serilog.Sinks.Console",
      "Serilog.Sinks.Grafana.Loki"
    ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [
      "WithThreadId"
    ],
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "{NewLine}Date:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}LogLevel:{Level}{NewLine}Class:{SourceContext}{NewLine}Message:{Message}{NewLine}{Exception}"
        }
      },
      {
        "Name": "GrafanaLoki",
        "Args": {
          "uri": "http://localhost:3100",
          "labels": [
            {
              "key": "wesky",
              "value": "WeskyLog"
            }
          ],
          "propertiesAsLabels": [
            "app"
          ]
        }
      }
    ]
  }
}

在这里插入图片描述

Program.cs

using Serilog;
using Serilog.Sinks.Grafana.Loki;
using System;

namespace LokiDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Host
                .ConfigureLogging((_, loggingBuilder) => loggingBuilder.ClearProviders())
                .UseSerilog((ctx, cfg) => cfg.ReadFrom.Configuration(ctx.Configuration));

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

在这里插入图片描述
新增一个控制器,用来做日志写入测试。构造函数注入日志服务,并进行输出四个不同类型的日志

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace LokiDemo.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        ILogger<TestController> _logger;
        public TestController(ILogger<TestController> logger)
        {
            _logger = logger;
        }

        [HttpPost]
        public IActionResult TestLokiLog(string par)
        {
            _logger.LogInformation($"这是一条基本信息。接收到接口参数:{par}");
            _logger.LogError("这是一条异常测试信息……");
            _logger.LogDebug("这是Debug日志信息……");
            return Ok(par);
        }

    }
}

在这里插入图片描述
运行程序,在swagger内调用一下。访问成功以后,可以看到控制台已有日志输出。
在这里插入图片描述

5.测试查询日志

打开grafana,左下角选择 数据源(Data sources)
在这里插入图片描述
在这里插入图片描述
选择Loki数据源,并输入Loki部署的地址(此处是本地地址,如果需要修改部署地址和端口,可以Loki配置文件内修改)。
在这里插入图片描述
配置地址完毕以后,选择保持和测试,提示成功即可。
在这里插入图片描述
然后转到Explore菜单栏,可以对查询功能进行预设。
在这里插入图片描述
在搜索栏里面,选择标签信息
在这里插入图片描述
也可以通过Json形式进行查看
在这里插入图片描述
也可以做关键字查询
在这里插入图片描述

总结

源码的地址:https://download.csdn.net/download/aa2528877987/87320133
在这里插入图片描述

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

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

相关文章

算法题:N个元素之和

做题思路&#xff1a; 1&#xff09;首先对数组进行排序 2&#xff09;创建一个for循环&#xff1a; 第一个元素指向for循环 3&#xff09;然后创建一个while循环&#xff1b;第二个元素指向for循环的下一个元素&#xff0c;第三个元素指向最后一个元素 4&#xff09;如果三个元…

Java基础之《netty(15)—HTTP服务》

一、使用netty开发一个简单的http服务 1、netty服务器在6668端口监听&#xff0c;浏览器发出请求http://localhost:6668/ 在写netty的http server的例子过程中&#xff0c;发现浏览器使用端口号6668一直无法连接&#xff0c;报错ERR_UNSAFE_PORT。改成7000就可以了。 2、服务器…

2018年高职组——信息评估与管理赛题(解析)

这篇文章为2018年赛题第一阶段DCRS解析 都是自己的想法(仅供参考)不对请指正评论 先来张拓扑养养眼: 2018年拓扑 接下来是IP地址规划表: IP地址的配置就不用我再多赘述了吧,接下来是DCRS的题目 23、DCRS 为接入交换机,为终端产生防止 MAC 地址防洪攻击,请配置端口安全,…

【嵌入式Linux】开发环境搭建

一、概述 在进行某一个芯片平台开发前&#xff0c;一般都需要在电脑上安装一系列软件&#xff0c;然后在这些软件上阅读、编写、编译和调试在该平台上运行的代码&#xff0c;最后将编写好的代码通过某种方式烧录到该芯片的对应地址运行。在电脑上安装的这一系列软件的过程&…

知行之桥2022版本升级之页面变化以及监控邮件答疑

近期有些客户将知行EDI系统升级到了我们最新知行之桥2022版本&#xff0c;升级过程或者升级后对于新版本的使用会有些疑问&#xff0c;根据近期协助大家进行知行EDI系统升级遇到的问题&#xff0c;我们的运维团队整理了一些Q&A&#xff0c;将分为上下两篇分享给大家&#x…

深度学习入门(六十二)循环神经网络——双向循环神经网络

深度学习入门&#xff08;六十二&#xff09;循环神经网络——双向循环神经网络前言循环神经网络——双向循环神经网络课件未来很重要双向RNN推理总结教材1 隐马尔可夫模型中的动态规划2 双向模型2.1 定义2.2 模型的计算代价及其应用3 双向循环神经网络的错误应用4 小结前言 核…

排序算法之直接选择排序(图文详解)

文章目录一、选择排序思想二、排序过程详解2.1 排序的次数2.2 排序演示三、代码范例3.1 SelectSort函数3.2 整体代码实现3.3 结果展示四、选择排序分析4.1 稳定性4.2 复杂度4.3适用场景五、选泽排序优化总结一、选择排序思想 选择排序&#xff08;Selection sort&#xff09;是…

ABBYY15免费版直接编辑PDF格式文件

日常生活中&#xff0c;我们常常使用PDF格式的文件。其优点就是PDF的文本内容不会随着软件版本、电脑字体的变化而变化&#xff0c;保证了其完整性。但也正因为这一点&#xff0c;如果没有源文件&#xff0c;我们就很难对PDF文档的内容进行编辑了。今天&#xff0c;我就向大家展…

前端一面必会vue面试题(边面边更)

为什么要使用异步组件 节省打包出的结果&#xff0c;异步组件分开打包&#xff0c;采用jsonp的方式进行加载&#xff0c;有效解决文件过大的问题。核心就是包组件定义变成一个函数&#xff0c;依赖import() 语法&#xff0c;可以实现文件的分割加载。 components:{ AddCustom…

关于GitHub的.gitignore无法忽略 “default-2021.dwlt“ 文件的问题

问题描述 我在使用sourcetree往github提交工程时&#xff0c;UserSettings/Layouts/default-2021.dwlt文件无缘无故每次都被暂存。 尽管我在.gitignore文件中反复修改忽略路径&#xff0c;该文件始终无法被屏蔽。如下图 解决办法 在网上找了很多资料&#xff0c;最终找到了…

Qt扫盲-QListWidget理论总结

QListWidget理论总结1. 概念2. 添加列表项3. 列表其他属性4. 常用信号5. 槽函数6. QListWidgetItem 简述1. 概念 QListWidget 是一个继承自 QListView 的类&#xff0c;其实就是 QListView 的一个很经典的 列表 交互控件&#xff0c;在QListWidget 里面提供了非常方便的基于 每…

银树开花精美甘特图:VARCHART_XGantt_5.2_167_ActiveX

增强您的计划用户体验 使用交互式甘特图提供惊人的视觉调度体验 与时间和资源相关的计划数据&#xff08;例如工作、任务、订单、活动和能力&#xff09;最好显示在甘特图中。 在智能甘特图中&#xff0c;计划人员可以随手采取纠正措施。 加快您的开发并 创建引人入胜、易于使用…

爬虫学习-深入了解爬虫

爬虫深入 使用场景分类 通用爬虫&#xff1a;抓取系统的重要组成部分&#xff0c;抓取的是一整张页面数据聚焦爬虫&#xff1a;建立在通用爬虫的基础之上&#xff0c;抓取的是页面中特定的局部内容增量式爬虫&#xff1a;检测网站中数据更新的情况&#xff0c;只会抓取网站中最…

一起学习用Verilog在FPGA上实现CNN----(三)激活层设计

1 激活层设计 LeNet-5网络的激活函数是双曲正切函数(TanH)&#xff0c;项目中tanh函数模块由完整的层UsingTheTanh构成&#xff0c;该层由较小的处理单元HyperBolicTangent组成 1.1 HyperBolicTangent 处理单元HyperBolicTangent&#xff0c;对每个输入执行Tanh操作&#xf…

jsp+ssm计算机毕业设计动物救助平台【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

实训任务4:Hadoop综合操作

文章目录1. 启动Hadoop服务2. 创建文本文件3. 上传文本文件4. 显示文件内容5. 完成排序任务6. 计算最大利润和平均利润1. 启动Hadoop服务 在master虚拟机上执行命令&#xff1a;start-all.sh 2. 创建文本文件 在master虚拟机上创建本地文件students.txt 李晓文 女 20 张晓航 男…

【Redis集群专题】「集群技术三部曲」分析一下相关的Redis集群模式下的脑裂问题(问题篇)

技术格言 世界上并没有完美的程序&#xff0c;但是我们并不因此而沮丧&#xff0c;因为写程序就是一个不断追求完美的过程。 什么是脑裂 字面含义 首先&#xff0c;脑裂从字面上理解就是脑袋裂开了&#xff0c;就是思想分家了&#xff0c;就是有了两个山头&#xff0c;就是有…

电脑调用 iPhone 摄像头全过程(iVCam)

最近不是停课不停学吗&#xff0c;令人“深恶痛绝”的钉钉又进入了我们学生的生活。但是初中的网课相比小学的又增加了一个要求&#xff1a;全程摄像头拍摄。但是&#xff0c;我这笔记本没有摄像头啊&#xff01;突然想起来好像手机的摄像头可以给电脑调用。话不多说&#xff0…

3D数学基础 学习笔记

左手坐标系&#xff1a;DX、3DMax 右手坐标系&#xff1a;OpenGL 世界坐标系、物体坐标系、摄像机坐标系 向量和点在数学上是等价的&#xff0c;向量是有大小和方向的有向线段&#xff0c;向量没有位置&#xff0c;只有大小和方向 向量运算&#xff1a; 零向量&#xff1a;…

【看源码】@Cacheable和@CacheEvict的原理, 批量key过期失效的原因分析

Cacheable和CacheEvict的坑, 批量key过期失效的原因分析前言测试代码源码put缓存时最终key的产生看不同情况下, 是否能匹配Evict过期缓存1. 没有入参没有指定key的情况2. 有入参的情况3. 配置了allEntries的情况总结补充前言 最近发现自己搭的一个项目返回的数据不太准确, 第一…