Apache Tomcat Loglarını Filebeat ile Elastic’e Gönderme

enes karagoz
Turk Telekom Bulut Teknolojileri
5 min readMay 18, 2023

Apache Tomcat, Java tabanlı bir web uygulama sunucusudur. Tomcat, Java Servlet, JavaServer Pages (JSP) ve JavaServer Faces (JSF) gibi Java teknolojilerini destekler ve bu teknolojilerle geliştirilen web uygulamalarını çalıştırır. Web siteleri ve web tabanlı uygulamaların yayınlanması, yönetilmesi ve dağıtılması için kullanılan popüler bir sunucu yazılımıdır.

Tomcat’in dağıtım sürecinde önemli bir rol oynamasıyla birlikte, uygulamalarını sürdüren ekiplerin Tomcat günlüklerine erişim sağlaması gerektiği bir sır değildir. Bu tür günlükler, çökmeler, askıda kalma durumları, kaynak tüketimi, erişim girişimleri ve daha fazlası hakkında birçok bilgi sağlayarak ekiplerin sorun giderme yapmalarını ve olaylara yanıt vermelerini sağlar. Ancak, log dosyaları olarak ham hallerinde günlükler, genel dağıtımın anlaşılmasında sınırlı bir ilerleme kaydetmektedir. Örneğin, sunucunuza istek gönderen tüm IP adreslerini sıralamak isterseniz, bunu bir log dosyasını kullanarak yapmak karmaşık bir süreç olacaktır. Altyapı ekiplerinin birden fazla sunucuyu yönettiği durumlarda, sorun daha da karmaşık hale gelir. Bu nedenle, günlüklerinizi sadece bir araya getirmenizi değil, aynı zamanda görselleştirmenizi, aramanızı ve analiz etmenizi sağlayan bir araca sahip olmak faydalı olacaktır. Elasticsearch ve Kibana’nın devreye girdiği yer burasıdır.

Elasticsearch, açık kaynaklı bir dağıtık arama ve analiz motorudur. Büyük miktardaki verileri hızlı ve gerçek zamanlı olarak indeksleyebilir, arama yapabilir ve analiz edebilir. Ölçeklenebilirliği, yüksek performansı ve esnek veri modeliyle, çeşitli uygulamalarda arama ve veri analitiği ihtiyaçlarını karşılamak için kullanılır.

Kibana, Elasticsearch üzerindeki verileri görselleştirmek, keşfetmek ve analiz etmek için kullanılan bir açık kaynaklı veri görselleştirme aracıdır. Kullanıcılar, Kibana aracılığıyla interaktif ve özelleştirilebilir görsel panolar oluşturabilir, veri analizlerini gerçekleştirebilir ve Elasticsearch veri depolama çözümünden elde edilen bilgilere kolayca erişebilir.

Başka bir deyişle, Tomcat loglarınızı Elasticsearch’e gönderirseniz, Elasticsearch’ün analitik yeteneklerinden yararlanabilir ve Kibana ile hepsini görselleştirebilirsiniz. Bu size dağıtımlarınız hakkında benzeri görülmemiş bir içgörü sağlayabilir ve destek ekibinizin log dosyalarının satırlarını ve satırlarını gözden geçirmek zorunda kalmadan önemli ölçümlere kolayca erişmesine yardımcı olabilir.

Bu makalede, logları Tomcat dağıtımlarınızdan Elasticsearch uç noktanıza nasıl göndereceğinizi ele alacağım. Filebeat, logları toplamak, ayrıştırmak ve göndermek için kullanacağımız hafif bir aracıdır.

Bölüm 1: Temizlik

Ortam Ayrıntıları:
İşletim Sistemi: Ubuntu 20.04.1 LTS
Uygulama: Apache Tomcat 9
Filebeat: 7.9.3

Bu makale, Tomcat, Filebeat, Elasticsearch ve Kibana’nın kurulu olduğunu varsaymaktadır. Değilse, talimatlar için aşağıdaki bağlantılara başvurabilirsiniz:

Tomcat ve Filebeat kurulduktan sonra, Tomcat Loglarını toplamak, ayrıştırmak ve bir Elasticsearch uç noktasına göndermek için Filebeat’i kullanacağımız Bölüm 2'ye geçebilirsiniz.

Bölüm 2:Filebeat’i Tomcat Loglarını Gönderecek Şekilde Ayarlama

Varsayılan olarak Tomcat 9 loglarını, /var/log/Tomcat9/ içinde üç farklı log dosyası türü altında depolar:

  • catalina.<Tarih>.log
  • localhost.<Tarih>.log
  • localhost_access_log.<Tarih>.txt

Erişim logları için Filebeat Apache modülünü kullanacağız. Bu, temel olarak bize minimum manuel yapılandırma gerektiren bir “ tak ve çalıştır “ sağlar .

Catalina ve localhost logları için, tokenizers olarak bilinen güçlü bir Filebeat yapısını kullanarak kendi ayrıştırıcılarımızı yazacağız .

Loglar ayrıştırıldıktan sonra, onları ilgili ES endekslerine göndereceğiz. Tasarımın akış diyagramı aşağıda verilmiştir.

Filebeat’i yapılandırmak için sunucunuzda /etc/filebeat/ konumuna gidin ve aşağıdaki komutu kullanarak filebeat.yml’yi filebeat.yml.defaults olarak yeniden adlandırın:
sudo mv filebeat.yml filebeat.yml.defaults

Bu, gelecekte işler ters giderse varsayılan yapılandırmaya hızlı bir şekilde erişmemizi sağlayacaktır. Ardından, aşağıdaki içeriklerle yeni bir filebeat.yml dosyası oluşturun:

filebeat.inputs:

## Catalina logs
- type: log
enabled: true
paths:
- /var/log/tomcat9/catalina.*.log
fields:
codec: plain
type: catalina_log
##The dissect processor parses the catalina logs by means of a tokenizer
processors:
- dissect:
tokenizer: '%{date} %{time} %{catalina.warnLevel} [%{catalina.method}] %{catalina.class} %{catalina.logMessage}'
field: "message"
##Filebeat processes each log file line-by-line
##However it is possible that a singular Tomcat log entry might contain multiple lines in the form of a Java stack trace
##To preserve the integrity of logs, we define a multiline pattern to process multiline stack traces as a single entry.
multiline.type: pattern
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
multiline.negate: false
multiline.match: after

##Localhost Logs
- type: log
enabled: false
paths:
- /var/log/tomcat9/localhost.*.log
tags: ["localhost_logs"]
fields:
codec: plain
type: localhost_log
##The dissect processor parses the catalina logs by means of a tokenizer
processors:
- dissect:
tokenizer: '%{date} %{time} %{tomcatLocalhost.warnLevel} [%{tomcatLocalhost.method}] %{tomcatLocalhost.class} %{tomcatLocalhost.ListenerType}: %{ListenerLog}'
field: "message"

##Filebeat processes each log file line-by-line
##However it is possible that a singular Tomcat log entry might contain multiple lines in the form of a Java stack trace
##To preserve the integrity of logs, we define a multiline pattern to process multiline stack traces as a single entry.

multiline.type: pattern
multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after

filebeat.config.modules.path: ${path.config}/modules.d/*.yml

##Defining an elasticsearch output.
##For more options on ES output, refer to the documentation at
##https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html
output.elasticsearch:
hosts: [<ES-Host>:<ES-Port>]
username: <ES-UserName>
password: <ES-Password>

##By default, filebeat will send everything to the filebeat-7.9.2-<YYYY.MM.DD>-000001
##Because we are shipping three different types of logs, it makes more sense to send them to different indices.
##We will be splitting our indices based on the field type we set while processing the logs
indices:
- index: "tomcat9-catalina-logs-%{+yyyy.MM.dd}"
when.equals:
fields.type: "catalina_log"
- index: "tomcat9-localhost-logs-%{+yyyy.MM.dd}"
when.equals:
fields.type: "localhost_log"
- index: "tomcat9-access-logs-%{+yyyy.MM.dd}"
when.equals:
fields.type: "access_log"

##The following lines are needed in order to set up different indices
setup.ilm.enabled: false

setup.template.name: "tomcat9"
setup.template.pattern: "tomcat9-*"

filebeat.yml dosyasını kaydedin ve kapatın

Ardından, Filebeat Apache modülünü etkinleştirmek için terminale aşağıdaki komutu yazın:

sudo filebeat modules enable apache

/etc/filebeat/modules.d/apache.yml dosyasını açın ve aşağıdaki yapılandırmayı kullanın:

# Module: apache
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.9/filebeat-module-apache.html

- module: apache
# Access logs
access:
enabled: true
var.paths: ["/var/log/tomcat9/localhost_access_log.*.txt"]
##The type:access_log will help us point these logs to the right direction
input:
processors:
- add_fields:
target: fields
fields:
codec: plain
type: access_log

apache.yml dosyasını kaydedin ve kapatın

Filebeat’i çalıştırın:

sudo systemctl start filebeat

Aşağıdaki komutu kullanarak Filebeat’in çalışıp çalışmadığını kontrol edebilirsiniz:

sudo systemctl status filebeat

Kibana konsolunuza gidin ve tomcat9-*dizin şablonunu ayarlayın. Dizin şablonu ayarlama yönergeleri için bu yönergeleri izleyin.

Tomcat’i yeniden başlatın:

sudo systemctl restart tomcat9

Kibana’daki Keşfet sayfasına gidin. Yakında endekslerin altına gelen olayları görmelisiniz tomcat9-* .

Ayrıştırmanın işe yaradığını doğrulamak için, altındaki herhangi bir olayı açın tomcat9-catalina-logs-<YYYY.MM.DD>ve olay gövdesinde "inceleme" JSON nesnesi bulunmalıdır. Aşağıdaki şekil, Catalina loglarının logMessage ve warnLevel gibi alanlara bölündüğü bir nesne örneğini göstermektedir.

Benzer şekilde, yerel sunucu logları için ayrıştırıcı, ilgili anahtar-değer çiftlerini “dissect” nesnesi altında oluşturdu.

Ve son olarak, Apache modülünün erişim loglarını doğru şekilde ayrıştırdığını doğrulayabiliriz. Bunun için tomcat9-access-logs-<YYYY.MM.DD> altında herhangi bir olaya bakabiliriz. Aşağıdaki şekilde, istek yöntemi ve yanıt durum kodunun kendi JSON nesnelerinde yansıtıldığı böyle bir olaydan bir örnek göstermektedir.

Sonuç

Filebeat’in Tomcat loglarını toplamak, ayrıştırmak ve doğrudan Elasticsearch’e göndermek için nasıl kullanıldığını gördük. Modüller ve tokenizerslerin bir kombinasyonunu kullanarak, Logstash gibi kaynak (ve dolayısıyla sermaye) yoğun işlemcilerin sürdürülmesi ihtiyacını ortadan kaldırabilirsiniz.

ELK yığınının görselleştirme yetenekleri, Tomcat sunucularınızla ilgili eyleme geçilebilir görüşler elde etmenizi sağlar. Bu görüşleri, operasyonları optimize etmek, olay yanıtını geliştirmek ve kaynakları verimli bir şekilde tahsis etmek için kullanabilirsiniz.

--

--