在ASP Net Core API中使用NLog进行Elasticsearch日志记录失败

时间:2020-01-20 20:37:53

标签: api docker elasticsearch asp.net-core nlog

我进行了一些测试,以使用我们API中的NLog登录到Elasticsearch实例。 Elasticsearch实例在Docker内部运行,如果使用IIS Express执行API,则可以顺利登录到Elasticsearch,并且可以查看创建的“ logstash”索引,但是如果在Docker容器中运行API,则日志永远不会到达Elasticsearch,并且永远不会创建索引。

我的NLog配置:

<?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"
      throwConfigExceptions="true"
      internalLogLevel="info"
      internalLogFile="c:\temp\internal-nlog-AspNetCore3.txt">

  <extensions>
    <add assembly="NLog.Targets.ElasticSearch"/>
  </extensions>

  <targets>
    <target name="ElasticSearch" xsi:type="BufferingWrapper" flushTimeout="5000">
      <target xsi:type="ElasticSearch"/>
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="ElasticSearch" />
    <logger name="Microsoft.*" maxlevel="Info" final="true" />
  </rules>
</nlog>

在我的appsettings.json中:

"ElasticsearchUrl": "http://192.168.0.9:9200",

也许我错过了一些东西,或者我不了解容器之间的交互。

1 个答案:

答案 0 :(得分:0)

(1)您的问题没有提供有关两个容器(一个运行您的应用程序,一个运行Elasticsearch)的配置的任何详细信息。

我有一个示例日志记录到Elasticsearch,配置了Kibana以查看结果,尽管它使用其他记录器提供程序(Essential.LoggerProvider.Elasticsearch),但是它有一个docker-compose文件,显示了Elasticsearch和Kibana之间的连接,https://github.com/sgryphon/essential-logging/tree/master/examples/HelloElasticsearch

# Docker Compose file for E-K stack
# Run with:
# docker-compose up -d

version: '3.7'

services:

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.6.1
    ...
    networks:
      - elastic-network

  kibana:
    image: docker.elastic.co/kibana/kibana-oss:7.6.1
    ...
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200
    networks:
      - elastic-network

networks:
  elastic-network:
    driver: bridge

相关部分显示了在两台docker机器之间建立一个网桥,然后在它们之间建立连接。

虽然“ http://192.168.0.9:9200”可能是从外部(您的IIS)到Elasticsearch的正确连接,但您必须检查API docker是否看待Elasticsearch机器,例如上例中Kibana如何看待Elasticsearch是“ http://elasticsearch:9200

您需要使用docker配置的详细信息更新问题,例如您运行以启动它们的命令行,或docker compose文件等,以弄清它们为什么看不到彼此。

(2)您可能要检查它是否确实在IIS上正常工作,因为NLog会创建索引“ logstash-”似乎并不寻常...通常,Logstash会创建该索引,而NLog应该创建它自己的索引,例如log4net创建索引“ log-”,Essential.LoggerProvider.Elasticsearch使用“ dotnet-”等。

免责声明:我是Essential.LoggerProvider.Elasticsearch的作者