Au cours des trois derniers jours, j'ai essayé de rassembler tous les journaux des conteneurs que j'ai dans mon Docker et de les envoyer à Logstash. J'ai travaillé avec ELK Stack (Elasticsearch, Logstash et Kibana) et j'utilise Logspout comme routeur pour ces logs.Comment envoyer des journaux apache d'un conteneur à un logstash dans un autre conteneur?
Les trois instances de la pile ELK s'exécutent dans des conteneurs différents. J'ai suivi this setup.
Mon fichier en cours de configuration Logstash ressemble à ceci:
input {
tcp {
port => 5000
type => syslog
}
udp {
port => 5000
type => syslog
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOG5424PRI}%{NONNEGINT:ver} +(?:%{TIMESTAMP_ISO8601:ts}|-) +(?:%{HOSTNAME:containerid}|-) +(?:%{NOTSPACE:containername}|-) +(?:%{NOTSPACE:proc}|-) +(?:%{WORD:msgid}|-) +(?:%{SYSLOG5424SD:sd}|-|) +%{GREEDYDATA:msg}" }
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
if !("_grokparsefailure" in [tags]) {
mutate {
replace => [ "@source_host", "%{syslog_hostname}" ]
replace => [ "@message", "%{syslog_message}" ]
}
}
mutate {
remove_field => [ "syslog_hostname", "syslog_message", "syslog_timestamp" ]
}
}
}
output {
elasticsearch { host => "elasticsearch" }
stdout { codec => rubydebug }
}
Mon problème actuel est que je vous connecter à peu près tous les cas nécessaire, sauf pour les erreurs et les journaux d'accès de mon conteneur apache2 appelé laravel2. Il enregistre certains événements du conteneur mais pas tout. Si je produis une erreur en changeant le fichier index.php, il ne se connectera pas correctement dans elasticsearch.
De quel type de configuration devrais-je disposer pour obtenir ces journaux Apache (à la fois accès et erreurs)? J'ai vu quelques solutions autour mais ils ont comme entrée un fichier que je ne suis pas capable de faire puisque je cours des choses dans différents conteneurs.
EDIT:
Mon nouveau fichier logstash.sample.conf:
input {
tcp {
port => 5000
type => syslog
}
udp {
port => 5000
type => syslog
}
beats {
# The port to listen on for filebeat connections.
port => 5044
# The IP address to listen for filebeat connections.
host => "0.0.0.0"
type => apachelog
}
}
filter {
if [type] == "apachelog" {
grok {
match => { "message" => ["%{IPORHOST:[apache2][access][remote_ip]} - %{DATA:[apache2][access][user_name]} \[%{HTTPDATE:[apache2][access][time]}\] \"%{WORD:[apache2][access][method]} %{DATA:[apache2][access][url]} HTTP/%{NUMBER:[apache2][access][http_version]}\" %{NUMBER:[apache2][access][response_code]} %{NUMBER:[apache2][access][body_sent][bytes]}(\"%{DATA:[apache2][access][referrer]}\")?(\"%{DATA:[apache2][access][agent]}\")?",
"%{IPORHOST:[apache2][access][remote_ip]} - %{DATA:[apache2][access][user_name]} \\[%{HTTPDATE:[apache2][access][time]}\\] \"-\" %{NUMBER:[apache2][access][response_code]} -" ] }
remove_field => "message"
}
mutate {
add_field => { "read_timestamp" => "%{@timestamp}" }
}
date {
match => [ "[apache2][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
remove_field => "[apache2][access][time]"
}
useragent {
source => "[apache2][access][agent]"
target => "[apache2][access][user_agent]"
remove_field => "[apache2][access][agent]"
}
geoip {
source => "[apache2][access][remote_ip]"
target => "[apache2][access][geoip]"
}
}
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOG5424PRI}%{NONNEGINT:ver} +(?:%{TIMESTAMP_ISO8601:ts}|-) +(?:%{HOSTNAME:containerid}|-) +(?:%{NOTSPACE:containername}|-) +(?:%{NOTSPACE:proc}|-) +(?:%{WORD:msgid}|-) +(?:%{SYSLOG5424SD:sd}|-|) +%{GREEDYDATA:msg}" }
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
if !("_grokparsefailure" in [tags]) {
mutate {
replace => [ "@source_host", "%{syslog_hostname}" ]
replace => [ "@message", "%{syslog_message}" ]
}
}
mutate {
remove_field => [ "syslog_hostname", "syslog_message", "syslog_timestamp" ]
}
}
}
output {
elasticsearch {
host => "elasticsearch"
}
stdout { codec => rubydebug }
}
Et mon fichier filebeat.full.yml:
#----------------------------- Logstash output ---------------------------------
#output.logstash:
# Boolean flag to enable or disable the output module.
enabled: true
# The Logstash hosts
hosts: ["localhost:5044"]
Et pour ce tour de table, mon filebeat fichier .yml:
filebeat.prospectors:
- input_type: log
paths:
- /var/log/apache2/access.log*
- /var/log/apache2/other_vhosts_access.log*
exclude_files: [".gz$"]
output.logstash:
hosts: ["localhost:5044"]
processors:
- add_cloud_metadata:
output.elasticsearch:
hosts: ['elasticsearch:9200']
username: elastic
password: changeme
Dois-je créer une nouvelle image docker pour apache afin de partager le volume? –
Pas pour partager le volume, mais selon la façon dont vous voulez le faire, vous devrez peut-être créer une image personnalisée pour ajuster les fichiers de configuration d'Apache – whites11
Je suis encore un peu vert dans Docker, je ne sais pas comment le faire, mais je vais essayer, merci. –