Fork me on Gitee

【Docker】.Net Core 结合Nlog集成ELK框架(Elasticsearch , Logstash, Kibana) (五)

之前有项目有用过ELK做过日志架构,不过是非docker形式安装的,今天来探究一下ELK的容器化技术

 

Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash 是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用。

kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

NLog 一个普普通通的.Net日志记录框架,类似log4net的作用。

 

一、Docker 安装 Elasticsearch

# 下载镜像 
docker pull elasticsearch:7.1.1

# 创建容器
docker run -d --name elasticsearch -v "/home/es":/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 elasticsearch:7.1.1

容器启动以后验证一下,发现容器启动失败,错误Exited(137)

 于是查看一下此docker的log日志,排查问题

提示是JDK版本不够高,但是经过网上搜索答案后,发现真实原因其实是服务器内存不够,导致没有创建成功

如果用的不是docker,直接打开/usr/local/es_cluster/node03/config/jvm.options 修改配置文件中的 -Xms 内存大小

docker可以使用 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 参数

# 创建容器
docker run -d -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" --name elasticsearch -v "/home/es":/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 elasticsearch:7.10.1

查看是否正在运行

 最后发现此es容器运行半分钟后就自动关闭了,查看各种原因,发现es开启之后,服务器的CPU使用率一直在100%,

 此服务器是1核2G,最后借用了公司的服务器继续完成以上步骤。

 

二、Docker 安装 Kibana 

安装镜像

docker pull kibana:7.10.1

创建容器

docker run -d --name kibana -e ELASTICSEARCH_URL=http://localhost:9200 -p 5601:5601 kibana:7.10.1

查看容器运行状态

访问http://120.24.145.210:5601/ 出现以下图示,表示运行成功

 

 

 

 

三、Docker 安装 :Logstash 

安装镜像

docker pull logstash:7.10.1

将文件挂载在宿主机/home/logstash下,创建相关文件夹

/home/logstash 目录下创建配置文件:logstash.yml 

path.config: /homne/logstash/conf.d/*.conf
path.logs: /var/log/logstash

/home/logstash/conf.d 目录下创建启动文件:test.conf

input {
    tcp {
        port => 4560
        mode => "server"
        tags => ["tags"]
        codec => json_lines
    }
}
output {
    elasticsearch {
        hosts => "{服务器地址}:9200"
        index => "boot-demo-%{+YYYY.MM.dd}"
    }
}

启动Logstash,挂载目录

docker run -it -d --name=logstash -p 9600:9600 -p 4560:4560 \
-v /home/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /home/logstash/conf.d/conf.d/:/usr/share/logstash/conf.d/ logstash:7.10.1

查看容器,正常启动。

 

四、.Net Core项目中引用Nlog 

添加Nuget 包 NLog.Web.AspNetCore和NLog.Targets.ElasticSearch

 新增nlog.config配置文件,并设置属性生成操作为内容,复制到输出目录为始终复制,内容如下。

<?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"
      internalLogToConsole="true">
  <extensions>
    <add assembly="NLog.Targets.ElasticSearch"/>
  </extensions>

  <targets>
    <!--ElasticSearch保存日志信息-->
    <target name="ElasticSearch" xsi:type="ElasticSearch" ConnectionStringName="ElasticSearchServerAddress"  
            index="userapi-${date:format=yyyy.MM.dd}" documentType="doc" includeAllProperties="true"
                 layout="[${date:format=yyyy-MM-dd HH\:mm\:ss}][${level}] ${logger} ${message} ${exception:format=toString}">
      <field name="MachineName" layout="${machinename}" />
      <field name="Time" layout="${longdate}" />
      <field name="level" layout="${level:uppercase=true}" />
      <field name="logger" layout=" ${logger}" />
      <field name="message" layout=" ${message}" />
      <field name="exception" layout=" ${exception:format=toString}" />
      <field name="processid" layout=" ${processid}" />
      <field name="threadname" layout=" ${threadname}" />
      <field name="stacktrace" layout=" ${stacktrace}" />
      <field name="Properties" layout="${machinename} ${longdate} ${level:uppercase=true} ${logger} ${message} ${exception}|${processid}|${stacktrace}|${threadname}" />
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="INFO" writeTo="ElasticSearch" />
  </rules>
</nlog>

   修改appsettings.json

"ConnectionStrings": {
    "ElasticSearchServerAddress": "http://{服务器地址}:9200"
}

修改Program.cs文件

public class Program
    {
        public static void Main(string[] args)
        {
            NLogBuilder.ConfigureNLog("nlog.config");
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>().UseUrls("http://*:8001;").UseNLog();
                });
    }

修改Startup.cs文件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
   loggerFactory.AddNLog();
}

 注入nlog对象进行测试

 去kinaba里查看结果

 

posted @ 2021-03-29 14:48  Roushan_IT  阅读(620)  评论(0编辑  收藏  举报