Ubuntu’da Apache Tomcat Loglarını Kurcalamak

Ubuntu (14.04 LTS) işletim sisteminde Apache Tomcat 7 logları şu dizinde bulunur: /var/log/tomcat7/

Üç çeşit log dosyası mevcut:

  • localhost_access_log.*.txt
    Bu log dosyalarının içerisinde web sunucusuna yapılan isteklerin logları tutulur.
    İsteğin zamanı (12/Feb/2015:06:34:27), HTTP metodunun tipi (GET), isteğin hangi URL’e yapıldığı (/), cevaben dönen HTTP Statusü (500) gibi önemli bilgiler içerir:

    127.0.0.1 - - [12/Feb/2015:06:34:27 -0500] "GET / HTTP/1.1" 500 4670
  • catalina.out
    Sunucu ayağa kalkana kadar ki işletilen adımların logları tutulur.
    Önceki günlere ait loglar “catalina.*.log.gz” gibi adlandırılmış sıkıştırılmış dosyalarda yer alır.
  • localhost.*.log
    Sunucu çalışırken ki loglar tutulur. Örneğin kullanıcının giriş yaparken aldığı bir Exception’ın logu bu dosyalarda bulunur.
    Önceki günlere ait loglar “localhost.*.log.gz” gibi sıkıştırılmış dosyalarda yer alır.

/var/log/tomcat7/ altındaki tüm Gzip’li dosyaları dışarı çıkarmak için

gunzip /var/log/tomcat7/*.gz

komutu kullanılabilir.

Loglar içinde arama yapmak için grep aracı kullanılabilir. Diyelim ki kullanıcıların 500 aldığı tüm HTTP isteklerini listelemek istiyoruz. Bunun için şu komutu kullanabiliriz:

grep 'HTTP/1.1" 500' localhost_access_log.*

Örnek bir çıktı şu şekilde olacaktır:

localhost_access_log.2015-02-07.txt:127.0.0.1 - - [07/Feb/2015:16:22:43 -0500] "POST /challenges/eval HTTP/1.1" 500 12022
localhost_access_log.2015-02-07.txt:127.0.0.1 - - [07/Feb/2015:21:17:18 -0500] "CONNECT / HTTP/1.1" 500 3894
localhost_access_log.2015-02-09.txt:127.0.0.1 - - [09/Feb/2015:15:51:24 -0500] "GET / HTTP/1.1" 500 4670
localhost_access_log.2015-02-09.txt:127.0.0.1 - - [09/Feb/2015:17:30:25 -0500] "POST /challenges/saveChallenge HTTP/1.1" 500 30984
localhost_access_log.2015-02-09.txt:127.0.0.1 - - [09/Feb/2015:17:31:31 -0500] "POST /challenges/saveChallenge HTTP/1.1" 500 30984
localhost_access_log.2015-02-10.txt:127.0.0.1 - - [10/Feb/2015:13:25:21 -0500] "CONNECT / HTTP/1.1" 500 3894
localhost_access_log.2015-02-10.txt:127.0.0.1 - - [10/Feb/2015:15:06:54 -0500] "GET / HTTP/1.1" 500 4670
localhost_access_log.2015-02-12.txt:127.0.0.1 - - [12/Feb/2015:06:34:27 -0500] "GET / HTTP/1.1" 500 4670
localhost_access_log.2015-02-12.txt:127.0.0.1 - - [12/Feb/2015:11:11:12 -0500] ""GET /cgi-bin/php HTTP/1.1" 500 3900
localhost_access_log.2015-02-13.txt:127.0.0.1 - - [13/Feb/2015:14:48:06 -0500] "CONNECT / HTTP/1.1" 500 3894
localhost_access_log.2015-02-14.txt:127.0.0.1 - - [14/Feb/2015:06:33:53 -0500] "CONNECT / HTTP/1.1" 500 3894

Ve diyelim ki 7 Şubat 16:22:43’te alınan 500’ün neden kaynaklandığını, daha açık ifade edicek olursak atılan Exception’ının ayrıntılarını öğrenmek istiyoruz. Bunun için 7 Şubat’a ait amacımıza uygun (yani Exception loglarını da bulunduran log dosyası türündeki) log dosyasını (localhost.2015-02-07.log) incelememiz gerekir. İlgili log dosyasını

less localhost.2015-02-07.log

komutu ile açarak Exception’ı bulabiliriz:

Feb 07, 2015 4:22:43 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is java.util.NoSuchElementException: No value present] with root cause
java.util.NoSuchElementException: No value present
        at java.util.Optional.get(Optional.java:135)
        at com.expercise.controller.challenge.model.SolutionFromUser.getProgrammingLanguage(SolutionFromUser.java:34)
        at com.expercise.service.challenge.SolutionValidationService.createEvaluationContextFrom(SolutionValidationService.java:47)
        at com.expercise.service.challenge.SolutionValidationService.validateSolution(SolutionValidationService.java:33)
        at com.expercise.controller.challenge.ChallengeController.evaluate(ChallengeController.java:53)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
...
(Çıktının tamamını buraya eklenmemiştir.)

Eğer o güne ait çok fazla log varsa aradığımız şeyi “less” ile dosya içinde navigasyon yaparak bulmamız çok zor olacaktır. Böyle durumlar için yine bir grep komutundan yararlanabiliriz:

grep -A 100 "4:22:43" localhost.2015-02-07.log

Bu defa grep komutunda “-A 100” seçeneğini belirttik. Bu seçenek ile grep aracı aradığımız terimi bulunduğu satırın altındaki 100 satır ile birlikte listeleyecek.

Umuyorum dikkatinizi çekmiştir. Hatanın alındığı saat ile bir arama yaptık. Ancak burada dikkat edilmesi gereken ufak bir nokta var. localhost.*.log dosyalarındaki saat formatı localhost_access_log.* dosyalarındakinden farklı olduğu için, saati aradığımız dosyadaki formatta uygun şekilde yazdık. Aradığımızı bulabilmemiz için bu gibi farklılıklara dikkat etmekte fayda var, aksi halde bir hayli zaman kaybedebiliriz.

Yukarıdaki komutun çıktısı örnek uygulamam için şu şekilde oldu:

Feb 07, 2015 4:22:43 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is java.util.NoSuchElementException: No value present] with root cause
java.util.NoSuchElementException: No value present
	at java.util.Optional.get(Optional.java:135)
	at com.expercise.controller.challenge.model.SolutionFromUser.getProgrammingLanguage(SolutionFromUser.java:34)
	at com.expercise.service.challenge.SolutionValidationService.createEvaluationContextFrom(SolutionValidationService.java:47)
	at com.expercise.service.challenge.SolutionValidationService.validateSolution(SolutionValidationService.java:33)
	at com.expercise.controller.challenge.ChallengeController.evaluate(ChallengeController.java:53)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
...
(Çıktının tamamını buraya eklenmemiştir.)

Böylece tek hamlede aradığımızı bulmuş olduk.

Reklamlar

Bir Yorum Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s