【发布时间】: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 上,我一直在尝试一组不同的组合,但我仍然没有让它发挥作用:
- 我检查了来自 Logstash 的配置是否正确接受 TCP,并且是正确的端口。
- 在 Logstash 和 Rails 中更改为不同的端口。
- 我目前正在使用 Docker-Compose V3。我先初始化了 ELK,然后是 Rails(但问题仍然存在)
- 在 UDP 和 TCP 之间切换。
- 未在 logstash.conf 中指定编解码器。
- 在 logstash.conf 中指定了 json_lines 编解码器
- 我尝试在 docker-compose.yml 中的 logstash 和 rails 之间指定
link(尽管 docker-compose v3 已弃用它) - 我尝试通过
networkin docker-compose 将它们组合在一起。 - 我尝试在 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