【问题标题】:Errno::EADDRNOTAVAIL - LogStashLogger not connecting to Logstash - Ruby on RailsErrno::EADDRNOTAVAIL - LogStashLogger 未连接到 Logstash - Ruby on Rails
【发布时间】:2018-03-30 23:13:35
【问题描述】:

我一直在努力让日志在使用 ELK(Elasticsearch Logstash Kibana)堆栈(也是 Dockerized)的 Dockerized Rails 5.1.5 应用程序上工作。我一直在设置它时遇到问题。我无法从 Rails 向 logstash 发送单个日志。

目前的问题是:

错误 -- : [LogStashLogger::Device::TCP] Errno::EADDRNOTAVAIL - 不能 分配请求的地址 - connect(2) 用于“localhost”端口 5228

起初,我以为我当前的 ELK 配置有问题。经过几天的努力,我终于通过使用 Ubuntu for Win10 的 nc 命令发送一个虚拟的 .log 文件来发现 ELK 工作正常,它工作了???????????????? !!!

现在我知道问题出在 Rails 上,我一直在尝试一组不同的组合,但我仍然没有让它发挥作用:

  1. 我检查了来自 Logstash 的配置是否正确接受 TCP,并且是正确的端口。
  2. 在 Logstash 和 Rails 中更改为不同的端口。
  3. 我目前正在使用 Docker-Compose V3。我先初始化了 ELK,然后是 Rails(但问题仍然存在)
  4. 在 UDP 和 TCP 之间切换。
  5. 未在 logstash.conf 中指定编解码器。
  6. 在 logstash.conf 中指定了 json_lines 编解码器
  7. 我尝试在 docker-compose.yml 中的 logstash 和 rails 之间指定 link(尽管 docker-compose v3 已弃用它)
  8. 我尝试通过networkin docker-compose 将它们组合在一起。
  9. 我尝试在 docker-compose 的 rails 应用程序中指定 depends_onlogstash。

我的想法不多了:

这是日志配置(现在它在 development.rb 中):

  config.log_level = :debug
  config.lograge.enabled = true
  config.lograge.formatter = Lograge::Formatters::Logstash.new
  config.logger = LogStashLogger.new(type: :tcp, host: 'localhost', port: 5228)

logstash 配置:

input {
 tcp {
    port => 5228
    codec => json_lines
  }
}

## Add your filters / logstash plugins configuration here

output {
    elasticsearch {
        hosts => ["elasticsearch:9200"]
    }
}

最后但同样重要的是,这里是 Docker-compose:

version: '3'
services:
  db:
    # This specifies a MySQL image that will be created with root privileges 
    # Note that MYSQL_ROOT_PASSWORD is Mandatory!
    # We specify the 5.7.21'th version of MySQL from the docker repository.
    # We are using mariadb because there's an apparent problem with permissions. 
    # See: https://github.com/docker-library/mysql/issues/69
    image: mariadb:10.3.5
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "rootPassword"
      MYSQL_USER: "ruby"
      MYSQL_PASSWORD: "userPassword"
      MYSQL_DATABASE: "dev"
    ports:
    - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql/data
      - ./db/rails_.sql:/docker-entrypoint-initdb.d/rails_.sql
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.2.3
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - elasticsearch:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elk
  logstash:
    container_name: logstash
    image: docker.elastic.co/logstash/logstash:6.2.3
    volumes:
      - ./elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
      - ./elk/logstash/pipeline/logstash.conf:/etc/logstash/conf.d/logstash.conf
    command: logstash -f /etc/logstash/conf.d/logstash.conf
    ports:
      - "5050:5050"
      - "5228:5228"
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    networks:
      - elk
    depends_on:
      - elasticsearch
  kibana:
    image: docker.elastic.co/kibana/kibana:6.2.3
    volumes:
      - ./elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch
  app:
    depends_on:
      - db
    environment:
      RAILS_ENV: development
      LOGSTASH_HOST: localhost
      SECRET_MYSQL_HOST: 'db'
      SECRET_MYSQL_DATABASE: 'dev'
      SECRET_MYSQL_USERNAME: 'ruby'
      SECRET_MYSQL_PASSWORD: 'userPassword'
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'"
    stdin_open: true
    tty: true
    links:
      - db
      - logstash
    volumes:
      - "./:/var/www/rails"
    ports:
      - "3001:3001"
    expose:
      - "3001"
    networks:
      - elk
  db-data:
    driver: local
  elasticsearch:
    driver: local

networks:
    elk:
      driver: bridge

非常感谢任何帮助????

【问题讨论】:

    标签: ruby-on-rails ruby docker docker-compose logstash


    【解决方案1】:

    默认情况下,Compose 会为您的应用设置一个网络。每个 服务的容器加入默认网络,并且两者都是 该网络上的其他容器可以访问,并且可以被该网络上的其他容器发现 它们的主机名与容器名称相同。

    根据docker-compose.yaml 文件,logstash 容器可以在logstash:5228 上从其他容器访问,因此app 容器上的日志配置应更改为:

    config.log_level = :debug
      config.lograge.enabled = true
      config.lograge.formatter = Lograge::Formatters::Logstash.new
      config.logger = LogStashLogger.new(type: :tcp, host: 'logstash', port: 5228, formatter: :json_lines, sync: true))
    

    检查 logstash.conf 是这样的:

    input {
     tcp {
        port => 5228
        codec => json_lines
      }
    }
    
    ## Add your filters / logstash plugins configuration here
    
    output {
        elasticsearch {
            hosts => ["elasticsearch:9200"]
        }
    }
    

    【讨论】:

    • 天啊!那是... 问题的一部分!!!谢谢!幸运的是我发现了这张图片:hub.docker.com/r/dezmodue/ruby-logger。令人惊讶的是,它使用的是您提供给我的相同凭据。我深入研究了图像,发现 LogStashLogger 有 formatter 参数!添加它加上主机作为'logstash'就可以了!很抱歉借此机会编辑您的答案以添加这些花絮,因为我想给您“正确的”
    • 还有一件事,对于看到这一点的任何人,如果您使用 docker-compose,它会在 Elasticsearch 和 Logstash 映像开始启动时在开始时抛出错误。等待他们建立连接,LogstashLogger 将启动并运行。
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多