geri

Play Framework JPA loglarını farklı bir çıktıya yönlendirin

23/08/2012

Play Framework 1.x ilişkisel veriyi yönetmek için JPA kullanır.

Debug ya da analiz amacıyla, uygulama tarafından yapılan tüm SQL sorgularını loglamak istediğinizde application.conf içerisinde aşağıdaki ayarı yapmanız yeterli olur.

# Debug SQL statements (logged using DEBUG level):
jpa.debugSQL=true

Bu ayarı yaptıktan sonra çıktıda aşağıdakine benzer SQL loglarını görebilirsiniz.

23:48:07,200 DEBUG ~ insert into tbl_user (id, adres, age, name) values (null, ?, ?, ?)
23:48:24,580 DEBUG ~ select user0_.id as id2_, user0_.adres as adres2_, user0_.age as age2_, user0_.name as name2_ from tbl_user user0_ where user0_.name=? limit ?

Play Framework logları yönetmek için log4j kütüphanesini kullanır.

log4j ayarları için uygulamanızın conf/ dizini içerisinde log4j.properties dosyası oluşturmanız yeterlidir. Farklı kurulumlar için farklı ayarlara ihtiyacınız olursa application.conf içerisinde aşağıdaki gibi farklı dosyalar belirtebilirsiniz.

application.log.path=/log4j-dev.properties
%prod.application.log.path=/log4j-prod.properties

Logları standart çıktıya yönlendiren örnek bir log4j.properties dosyasının içeriği aşağıdaki gibidir.

log4j.rootLogger=DEBUG, Console

# Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d %-5p - %m%n

Burada layout.ConversionPattern ayarına %c parametresini eklersek her bir logun hangi Logger aracılığıyla yazıldığını görebiliriz. Play Framework varsayılan olarak play Logger'ını kullanır. Eğer SQL logları farklı bir Logger ile yazılıyorsa gerekli ayarları yaparak bu logları istediğimiz çıktıya yönlendirebiliriz.

log4j.appender.Console.layout.ConversionPattern=%d %-5p - [%c] %m%n
2012-08-24 00:17:47,611 INFO  - [play] Automatically applying evolutions in in-memory database
2012-08-24 00:17:47,916 DEBUG - [org.hibernate.SQL] select user0_.id as id0_, user0_.adres as adres0_, user0_.age as age0_, user0_.name as name0_ from tbl_user user0_ where user0_.name=? limit ?

Loglardan anlaşıldığı üzere SQL logları için org.hibernate.SQL Logger'ı kullanılıyor. SQL loglarını logs/sql.log isimli bir dosyaya kaydetmek için aşağıdaki ayarlar yeterli olur.

log4j.rootLogger=ERROR, Console

log4j.logger.play=INFO

log4j.logger.org.hibernate.SQL=DEBUG, SQL
log4j.additivity.org.hibernate.SQL=false

# Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d %-5p - [%c] %m%n

# SQL
log4j.appender.SQL=org.apache.log4j.FileAppender
log4j.appender.SQL.File=logs/sql.log
log4j.appender.SQL.layout=org.apache.log4j.PatternLayout
log4j.appender.SQL.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - %m%n

log4j.additivity.org.hibernate.SQL=false ayarı ile bu Logger'ın üst seviye Logger ayarlarını miras almamasını sağlıyoruz. Böylece SQL logları konsola yazılmayacak, yalnızca logs/sql.log dosyasına kaydedilecektir.

log4j ayarları konusunda daha ayrıntılı bilgi için manual sayfasını ziyaret edebilirsiniz. Ayrıca production ortamında tüm SQL loglarının kaydediliyor olmasının az da olsa bir performans kaybına sebep olacağını unutmayınız.

Follow me on Twitter