In den letzten drei Tagen habe ich versucht, alle Protokolle aus den Containern in meinem Docker zu sammeln und sie an Logstash zu senden. Ich habe mit dem ELK-Stack (Elasticsearch, Logstash und Kibana) gearbeitet und verwende Logspout als Router für diese Logs.Wie schicke ich Apache-Logs von einem Container zu einem Logstash in einem anderen Container?
Alle drei Instanzen des ELK-Stacks laufen in einem anderen Container. Ich habe this setup gefolgt.
Meine aktuelle Logstash Konfigurationsdatei sieht wie folgt aus:
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 }
}
Mein aktuelles Problem ist, dass ich so ziemlich jedes Ereignis notwendig, außer für die Fehler und Zugriffsprotokolle von meinem apache2 Container laravel2 genannt anzumelden. Es protokolliert einige Ereignisse aus dem Container, aber nicht alles. Wenn ich einen Fehler durch Ändern der index.php-Datei erzeuge, wird es in elasticsearch nicht richtig protokolliert.
Welche Art von Konfiguration sollte ich haben, um diese Apache-Protokolle (sowohl Zugriff als auch Fehler) zu bekommen? Ich habe einige Lösungen gesehen, aber sie haben als Eingabe eine Datei, die ich nicht ausführen kann, da ich die Dinge in verschiedenen Containern abspiele.
EDIT:
Meine neue logstash.sample.conf Datei:
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 }
}
Und meine filebeat.full.yml Datei:
#----------------------------- Logstash output ---------------------------------
#output.logstash:
# Boolean flag to enable or disable the output module.
enabled: true
# The Logstash hosts
hosts: ["localhost:5044"]
Und das abzurunden, mein filebeat .yml-Datei:
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
Muss ich ein neues Docker-Image für Apache erstellen, um das Volume zu teilen? –
Nicht für die Freigabe des Volumes, aber abhängig davon, wie Sie das tun möchten, müssen Sie möglicherweise ein benutzerdefiniertes Image erstellen, um Apaches Konfigurationsdateien anzupassen. – whites11
Ich bin immer noch ein bisschen grün in Docker, ich bin nicht sicher, wie es geht, aber ich werde es versuchen, danke. –