zoukankan      html  css  js  c++  java
  • Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统

    Elasticsearch - 简介

    Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据。它使用 Java 编写,基于 Apache Lucene,尽管这些细节隐藏在 API 中。通过被索引的字段,可以用许多不同的聚合方式找到任何被存储(索引)的文档。但是,ElasticSearch不仅仅只提供对这些被索引文档的强大搜索功能。快速、分布式、水平扩展,支持实时文档存储和分析,支持数百台服务器和 PB 级索引数据。同时作为 Elastic stack (aka ELK) 的核心,提供了诸如 LogStash、Kibana 和更多的强大应用。

    Kibana 是 Elasticsearch 中专门提供强有力的可视化查询Web应用程序。使用Kibana,能非常简单地为 Elasticsearch 中索引的数据创建查询、图表和仪表盘。
    Elasticsearch开放了一个 REST API,你会发现许多文档示例是 HTTP 调用,你可以尝试使用 curl 或 postman 等工具。当然,这个 API 的客户端已经用许多不同的语言编写,包括.Net、Java、Python、Ruby和JavaScript等。

    Logstash是一个具备实时处理能力的开源的数据收集引擎。可以动态地从不同的来源收集数据,将数据处理(过滤、变形)过之后统一输出到某个特定地址,为将来更多样化的数据分析做准备。

    如果你想阅读更多,Elasticsearch 官方网站 可能是最好的地方。

    注意:文章可能比较长,如果对Elasticsearch安装以及了解的,可以直接略过,看ASP.NET Core和Nlog部分,本文所有linux命令均在root用户下操作

    Java环境安装

    懒人一键安装

    yum install java*

    查看JDK版本信息

    java -version

    Elasticsearch文档

    安装

      官方网站有很多安装方式,我这里采用的rpm安装,大家可以按照自己习惯的方式进行安装即可,下载地址

    //进入local目录
    cd /usr/local
    //创建elasticsearch文件夹
    mkdir elasticsearch
    //进入elasticsearch文件夹
    cd elasticsearch
    //开始下载
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.rpm
    //开始安装
    rpm -ivh elasticsearch-5.5.0.rpm 
    

    配置

    //查找安装目录
    whereis elasticsearch
    //进入安装目录
    cd /etc/elasticsearch
    //编辑配置文件
    vi elasticsearch.yml
    

    主要配置Network.host(本机ip)和http.port(默认9200)(目前单节点模式,其他参数请参考官方文档)

     

    启动服务

    //开启端口9200
    firewall-cmd --add-port=9200/tcp --permanent
    //重新加载配置
    firewall-cmd --reload
    
    //设置服务开机启动
    systemctl enable elasticsearch
    //启动服务
    systemctl start elasticsearch
    

     在浏览器打开http://192.168.30.128:9200,如下图所示表示启动成功了

    Kibana文档

    安装

    官方下载地址官方安装教程

    //进入elasticsearch目录
    cd /usr/local/elasticsearch
    //下载Kibana rpm 64位包
    wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.0-x86_64.rpm
    //安装Kibana
    rmp -ivh kibana-5.5.0-x86_64.rpm

    配置

    //进入安装目录
    cd /etc/kibana
    //编辑配置文件
    vi kibana.yml
    

     设置端口号:5601,Host地址:"192.168.30.128" ,elasticsearch服务地址为:"http://192.168.30.128:9200"

    启动服务

    //开启端口5601
    firewall-cmd --add-port=5601/tcp --permanent
    //重新加载配置
    firewall-cmd --reload
    
    //设置服务开机启动
    systemctl enable kibana
    //启动服务
    systemctl start kibana
    

    在浏览器打开http://192.168.30.128:5601,将进入到Kibana管理界面

    LogStash文档

    安装

    官方下载地址 官方安装教程

    //进入elasticsearch目录
    cd /usr/local/elasticsearch
    //下载logstash rpm包
    wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.0.rpm
    //安装rpm包
    rpm -ivh logstash-5.5.0.rpm

    配置

    //进入安装目录
    cd /etc/logstash
    //进入conf.d目录
    cd conf.d
    //新增配置信息
    vi nlog.conf
    

     input:采用TCP监控本机8001端口的消息

     filter:使用grok 插件,自定义消息格式,推荐使用grokdebug在线进行调试

     output:使用elasticsearch作为数据存储

     注意:官方有非常丰富的插件进行消息处理,具体可以查看官方文档。

    启动服务

    //开启端口8001
    firewall-cmd --add-port=8001/tcp --permanent
    //重载配置
    firewall-cmd --reload
    
    //设置开机启动
    systemctl enable logstash
    //启动logstash
    systemctl start logstash
    

    ASP.ENT Core结合Nlog进行日志记录

     下面是本文介绍的重点内容了,通过Nlog记录日志,将消息发送到logstash,logstash将转换后的消息存储到elasticsearch,并供在kibana中查询使用。

    创建ASP.NET Core项目

    本文通过VS2017创建的.NETCore 1.1 项目 Elasticsearch.QuickStart

    通过Nuget安装Nlog依赖包

    NLog.Web.AspNetCore

     

     Nlog.Extensions.Logging (pre版本)

     

    在Startup.cs添加Nlog服务

    新增Nlog配置(Web根目录)

    <?xml version="1.0" encoding="utf-8" ?>
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          autoReload="true"
          internalLogLevel="Warn"
          internalLogFile="internal-nlog.txt">
    
      <extensions>
        <!--enable NLog.Web for ASP.NET Core-->
        <add assembly="NLog.Web.AspNetCore"/>
      </extensions>
    
      <!-- define various log targets -->
      <!--定义日志文件目录-->
      <variable name="logDirectory" value="${basedir}/logs/${shortdate}"/>
      <variable name="nodeName" value="node1"/>
    
      <targets async="true">
        <!-- 全部日志target -->
        <target xsi:type="File"
                name="allfile"
                fileName="${logDirectory}/nlog-all/${shortdate}.log"
                layout="#node1#${longdate}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#"
                keepFileOpen="false"
                />
    
        <!-- 本地文件日志target -->
        <target xsi:type="File"
                name="ownLog-file"
                fileName="${logDirectory}/nlog-${level}/${shortdate}.log"
                layout="#${longdate}#${nodeName}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#"
                keepFileOpen="false"
                />
    
        <!-- Tcp日志target -->
        <target xsi:type="Network"
                name="ownLog-tcp"
                keepConnection="false"
                address ="tcp://192.168.30.128:8001"
                layout="#${longdate}#${nodeName}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#"
                />
        <!--grok 规则-->
        <!--%#{DATA:request_time}#%{DATA:node_name}#%{DATA:class_name}#%{DATA:log_level}#%{DATA:call_site}#%{DATA:line_number}#%{DATA:request_url}#%{DATA:request_method}#%{DATA:container_name}#%{DATA:action_name}#%{DATA:log_info}#%{DATA:exception_msg}#-->
        <!--空白-->
        <target xsi:type="Null" name="blackhole" />
      </targets>
    
      <!--日志级别 Trace -》Debug-》 Info -》Warn-》 Error-》 Fatal-->
      <!--日志规则-->
      <rules>
        <!--全部日志, 包括Microsoft日志-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />
    
        <!--自定义日志,排除Microsoft日志-->
        <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
        <logger name="*" minlevel="Debug" writeTo="ownLog-file" />
        <logger name="*" minlevel="Info" writeTo="ownLog-tcp" />
      </rules>
    </nlog>
    

     注意:Tcp target中的address指向在logstash中监听的地址,在注释中也给出来了grok的模板信息。

    测试Nlog日志记录

    在Kibana中查看最终效果

    总结

    本文只是一个示例教程,希望能起到一个抛砖引玉的作用,详细功能需要大家参考官方文档。Elasticsearch,Kibana,logstash功能非常强大,我也是刚刚接触到,如果有不对的地方,还望大家多多包涵和指正。如果这篇文档对大家有帮助,请点一个赞,谢谢了。

    参考

    1:LogStash+ElasticSearch简单使用(CentOS)

    2:使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据

    3:Elastic Stack and Product Documentation

    4:Elasticsearch在Centos 7上的安装与配置

    5:Nlog 官方文档

    6:从零开始搭建一个ELKB日志收集系统

  • 相关阅读:
    【转】编写高质量代码改善C#程序的157个建议——建议20:使用泛型集合代替非泛型集合
    【转】编写高质量代码改善C#程序的157个建议——建议19:使用更有效的对象和集合初始化
    【转】编写高质量代码改善C#程序的157个建议——建议18:foreach不能代替for
    【转】编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历
    java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包
    Springboot集成dubbo时候出现异常
    Python小练习(持续更新....)
    2.PyCharm安装和使用之HelloWorld
    1.Python学习---helloworld
    关于编码问题
  • 原文地址:https://www.cnblogs.com/piscesLoveCc/p/7230426.html
Copyright © 2011-2022 走看看