2017-08-25 3 views
0

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 

Antwort

0

P Robable, Ihr Apache2-Container Logging-Zugriff und Fehler zu Stdout nur.

Eine Option, die Sie haben, ist eine weitere Container hinzuzufügen, die filebeat läuft konfiguriert, um Daten zu drücken, um logstash (Sie werden logstash Config einstellen müssen, auch), stellen ein gemeinsames Volumen zwischen Ihrem Apache-Container und dem neuen Behälter schließlich Mach Apache schreibe Logs in das Sared Volume.

Werfen Sie einen Blick auf this Link wie filebeat laufen auf Docker

einen Blick auf this Link nehmen, wie filebeat zu konfigurieren, um Daten zu senden

schließlich logstash, schauen here logstash zu ermöglichen, zu erhalten Daten von filebeat

Zunächst einmal müssen Sie einen freigegebenen Datenträger erstellen:

docker volume create --name apache-logs 
dass

Nach können Ihre Ihre Docker-Container wie folgt ausführen:

docker run -v apache-logs:/var/log/apache2 ... apache:version 
docker run -v apache-logs:/var/log/apache2 ... filebeat:version 

diese Weise wird der Behälter 2 ein gemeinsames Verzeichnis haben. Sie müssen den Apache anpassen, um seine Logs in/var/log/apache2 zu schreiben und den Dateibeat einzurichten, um Daten von/var/log/apache2 an logstash weiterzuleiten.

+0

Muss ich ein neues Docker-Image für Apache erstellen, um das Volume zu teilen? –

+0

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

+0

Ich bin immer noch ein bisschen grün in Docker, ich bin nicht sicher, wie es geht, aber ich werde es versuchen, danke. –

Verwandte Themen