当前位置: 首页 > 知识库问答 >
问题:

从docker上的应用程序发送日志到elasticsearch

淳于嘉树
2023-03-14

我已在我的应用程序(ASP.NET Core)上使用elasticsearch将nlog配置为nlog.config,如下所示:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Trace"
      internalLogFile="\\{ipmachine}\c\Log\internal-nlog.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="Debug" writeTo="ElasticSearch" />
  </rules>
</nlog>

应用程序上的设置是:“ElasticsearchUrl”:http://localhost:9200“

当我通过dotnet-run运行应用程序时,我有一只麋鹿在这样的码头工人那里长大——https://github.com/deviantony/docker-elk

所有日志都会被保存。

但当我将我的应用程序添加到docker映像时,它就不起作用了。

尝试在docker-composs上的相同网络上配置它,我用link做了同样的事情。

...
elasticsearch:
...
    networks:
      - elk
...
myapp:
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:

  elk:
    driver: bridge

甚至在docker上检查elacticsearch的ip,并将应用设置更改为"Elasticsearch chUrl":"http://172.21.0.2:9200"

然后我在docker compose上添加了FileBeat:

  filebeat:
    image: docker.elastic.co/beats/filebeat:6.3.2
    #command: "filebeat -e -c /etc/filebeat/filebeat.yml"
    environment:
      HOSTNAME: "my-server"
      LOGSTASH_HOST: "localhost"
      LOGSTASH_PORT: "5044"
    volumes:
     - "./filebeat/config/filebeat.yml:/etc/filebeat/filebeat.yml:rw"

使用filebeat.yml-

output:
  logstash:
    enabled: true
    hosts:
      - elk:5000
    ssl:
      certificate_authorities:
        - /etc/pki/tls/certs/logstash-beats.crt
    timeout: 15

filebeat:
  prospectors:
    -
      paths:
        - /var/log/syslog
        - /var/log/auth.log
      document_type: syslog
    -
      paths:
        - "/var/log/nginx/*.log"
      document_type: nginx-access

并且日志仍然没有保存在elasticsearch中。它只在我运行应用程序时工作,而不是通过Docker。我在征求意见。

我的端口:

  • 5000-logstash
  • 5601-木瓜
  • 9200-elasticsearch
  • 9300-elasticsearch
  • 5044-filebeat

共有1个答案

云曦之
2023-03-14

应用程序上的设置是:“ElasticsearchUrl”:http://localhost:9200“

这对于容器网络是不正确的,这里的localhost将只与您的容器通信,而不是与主机通信,而不是与其他容器通信。使用用户创建的网络,在撰写文件中使用服务名称elasticsearch,您需要连接到“ElasticsearchUrl”:http://elasticsearch:9200“

然后我在docker compose上添加了FileBeat

我建议你朝这个方向走。从每个应用程序中删除日志处理,集中检索所有容器日志,并将它们从docker引擎发送到elastic。要做到这一点,只需让您的应用程序登录到stdout,而不是直接登录到elastic。在swarm模式下,我使用撰写文件的以下部分部署filebeat:

  filebeat:
    image: docker.elastic.co/beats/filebeat:${ELASTIC_VER:-6.2.4}
    deploy:
      mode: global
    configs:
    - source: filebeat_yml
      target: /usr/share/filebeat/filebeat.yml
      mode: 0444
    - source: filebeat_prospector_yml
      target: /usr/share/filebeat/prospectors.d/default.yml
      mode: 0444
    volumes:
    - '/var/run:/host/var/run:ro'
    - '/var/lib/docker:/host/var/lib/docker:ro'

我的filebeat.yml文件包含:

filebeat.config:
  prospectors:
    path: ${path.config}/prospectors.d/*.yml
    reload.enabled: false
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false

#processors:
#- add_cloud_metadata:

output.elasticsearch:
  hosts: ['elasticsearch:9200']
  username: elastic
  password: changeme

然后将explorer default.yml配置为从每个容器中提取日志:

- type: log
  paths:
  - '/host/var/lib/docker/containers/*/*.log'
  json.message_key: log
  json.keys_under_root: true

请注意,我使用的是configs,但是您可以轻松地切换它,以将这些文件作为卷装载到容器中。

 类似资料:
  • 在我的应用程序中,我希望在崩溃时将日志发送到远程服务器。我添加了try-catch块,并在catch中向服务器发送日志。我想知道我应该抓住哪些例外。我需要日志以防每次崩溃,这样我就能修复它。捕捉所有异常是一种好的做法吗? 提前感谢。

  • 问题内容: 我正在尝试在docker容器中运行用golang编写的服务器。例如: 如果我在本地计算机上运行此代码,则可以将其发送给with ,它将关闭应用程序。当我在docker容器中运行它时,我似乎无法使用杀死它。 然后,我继续使用docker向容器发送信号。 仍在运行… 仍在运行… 终于死了。 我没有在代码中捕获任何信号并忽略它们。我什至尝试增强上面的代码以捕获信号并将其打印出来(这在我的主机

  • 我有一个nodejs应用程序,它只不过是一个使用微软botbuilder框架构建的机器人。我创建了azure应用程序服务来托管此应用程序。我想找到一种方法,将所有应用程序日志和web服务器日志(如果可能的话)持久化到某个持久化存储中。就像本地web应用程序一样,我们可以在应用程序服务器上查找日志 在做了一些研究之后,我找到了微软关于这方面的官方文件,但看起来它有以下局限性。 我们不能使用应用程序服

  • 我不确定我遇到的问题是概念问题还是技术问题,因为配置错误。 目标是在应用程序容器中托管的Java EE应用程序(特别是WildFly)和独立运行的Java SE应用程序之间发送双向消息,都使用标准JMS协议和主题。我认为这应该是可能的,只要他们都使用相同的经纪人和相同的主题。 因此,我有一个外部 Artemis 实例作为消息代理运行,并在 Java EE 应用程序的单独 Bean 中成功设置了生产

  • 这类似于Docker守护程序日志在哪里?。但更多适用于Mac Docker Desktop。 在哪里可以找到Docker Desktop for Mac的守护程序日志?

  • 我知道和都在/usr/local/Spark/jars中,尽管在pom.xml中排除了这些jar,但Spark很可能引用了这些jar,因为如果删除它们,在spark-submit的运行时会给出一个ClassNotFoundException。 我的问题是:有没有一种方法可以在我的应用程序中使用Logback实现本机日志记录,同时保留Spark的内部日志记录功能。理想情况下,我希望将我的日志返回应用