将日志从Docker上的应用程序发送到Elasticsearch

时间:2018-08-02 09:06:08

标签: docker elasticsearch nlog filebeat

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

<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>

在appsetting上是:"ElasticsearchUrl": "http://localhost:9200"

当我通过dotnet-run运行应用程序时,我在类似docker的码头上举起了麋鹿-https://github.com/deviantony/docker-elk

所有日志均已保存。

但是当我将我的应用程序添加到docker image时,它不起作用。

试图在docker-compose的相同网络上对其进行配置,我对链接也是如此。

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

networks:

  elk:
    driver: bridge

即使在docker上检查elacticsearch的IP,并将appsetting更改为"ElasticsearchUrl": "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-kibana
  • 9200-elasticsearch
  • 9300-elasticsearch
  • 5044-文件拍子

1 个答案:

答案 0 :(得分:1)

  

在appsetting上是:"ElasticsearchUrl": "http://localhost:9200"

这对于容器网络是不正确的,此处的本地主机将仅与您的容器通信,而不与主机通信,而不与其他容器通信。使用用户创建的网络,并且撰写文件中的服务名称为elasticsearch时,您需要连接到"ElasticsearchUrl": "http://elasticsearch:9200"


  

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

我建议朝这个方向前进。从每个应用程序中删除日志处理,并集中所有容器日志的检索,将它们从docker引擎发送到Elastic。为此,只需让您的应用程序登录到stdout,而不是直接登录到Elastic。在群模式下,我在撰写文件的这一部分部署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

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

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

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