2017-08-25 3 views
0

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 

Répondre

0

P Robacious, votre conteneur apache2 enregistre les accès et les erreurs sur stdout uniquement. Une option que vous avez est d'ajouter un autre conteneur qui exécute filebeat configuré pour pousser les données vers logstash (vous devrez aussi ajuster la configuration de logstash), faire un volume partagé entre votre conteneur apache et ce nouveau conteneur, enfin, Faites en sorte qu'apache écrive des journaux dans le volume sared.

Jetez un oeil à this lien pour savoir comment exécuter filebeat sur docker

Jetez un oeil à this lien pour savoir comment configurer filebeat pour envoyer des données à logstash

Enfin, regardez here pour permettre logstash de recevoir les données de filebeat

tout d'abord, vous devez créer un volume commun:

docker volume create --name apache-logs 

Après cela, votre peut exécuter vos conteneurs docker comme ceci:

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

De cette façon, le 2 containeur un répertoire partagé. Vous devrez ajuster apache pour écrire ses logs dans/var/log/apache2 et setup filebeat afin de transférer les données de/var/log/apache2 vers logstash.

+0

Dois-je créer une nouvelle image docker pour apache afin de partager le volume? –

+0

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

+0

Je suis encore un peu vert dans Docker, je ne sais pas comment le faire, mais je vais essayer, merci. –