Java JSF ile Log4j Loglama Kullanımı (Proje Örnek Uygulama)
Log4j ve Loglama nedir ?
Loglama kısaca bir projedeki uygulama geçmişini takip etmektir.Uygulamada arkaplanda çalışan her adımı her zaman görmek istemeyebiliriz.Bazen çok detay bilgiler gereklidir hata tespiti için bazen sadece hata oluştuğu sürece log görmek yeterlidir.Bunun için loglama yaparken log seviyelerini ayarlamak gereklidir.
Log4j Java’da yazılmış, Apache Yazılım Lisansı altında paylaşılan; hızlı, güvenilir ve esnek bir loglama framework’üdür. Java dışında C, C++, C#, Perl, Python, Ruby, and Eiffel dillerine de taşınmıştır.
Log Seviyeleri
Görselden anlaşılacağı gibi logların seviyesini belirleyip ona göre istediğimiz seviye logları kaydedebiliriz.
Log Yazıcılar(Appenders)
Loglama bilgilerini veritabanı,dosya,console vb. gibi istenilen yerde çıktı alınmasını sağlar.Ben örnek projemde FileAppender ve ConsoleAppender beraber kullandım.
- FileAppender
- ConsoleAppender
- SocketAppender
- SyslogAppender
- NTEventLogAppender
- SMTPAppender
Log Düzeni(Layouts)
Loglama yaparken detay bilgileri vermek için (Tarih saat,log atılan sınıf,Log seviyesi) belirli bir düzen verebiliriz.Log çıktısının düzenlenmesi olarak düşünebilriz.
Kısaltma | Anlamı |
---|---|
%r | Loglama başlayana kadar ne kadar zaman harcandı. |
%t | Loglama olayını üreten thread’in ismi. |
%p | Logun seviyesi. |
%c | c(1) getLogger() ile ayarladığımız loglama adı.örneğin HelloBean |
%x | Logun bazı kontrolleri için. |
%m | Mesaj içeriği |
%n | Mesaj içeriği geldiğinde alt satıra geç |
%L | Hangi satırda olduğu bilgisi. |
%d | Logun üretildiği zaman. {yaylı parantez içinde format verilebilir} |
Ben yazımda şu formatı kullandım
<param name="ConversionPattern" value="%d [%-5p] [%t] ..%-40c{3}:%L - %m%n" />
Çıktı bu şekilde
2017-09-05 15:07:24,783 [FATAL] [http-nio-8083-exec-4] ..bean.HelloBean :36 – Bu bir FATAL mesajı
Loglama Örnek Proje
Önceki derslerde HelloPrimefaces yapmıştık.(Yazıyı Oku)
Bu projeyi indirebilir yada adımları takip ederek oluşturabilirsiniz.
Projemiz oluştuktan sonra su şekilde güncelleyelim.
Pom XML
Öncelikle log4j kütüphanesini ekledim.
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
Pom xml son hali
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.atakancoban</groupId> <artifactId>hellojsf</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>Hello JSF</name> <!-- PrimeFaces Repository --> <repositories> <repository> <id>prime-repo</id> <name>Prime Repo</name> <url>http://repository.primefaces.org</url> </repository> </repositories> <!-- JSF Dependency --> <dependencies> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-api</artifactId> <version>2.2.14</version> </dependency> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-impl</artifactId> <version>2.2.14</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <!-- Primefaces --> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>6.0</version> </dependency> <!-- PrimeFaces Theme --> <dependency> <groupId>org.primefaces.themes</groupId> <artifactId>all-themes</artifactId> <version>1.0.10</version> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> <!-- Build Maven WAR --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.2</version> <configuration> <!-- Java version --> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
Log4j Config Xml
Log4jConfig dosyasında Appender olarak File ve Console belirttim.
Çıktı formatını yukarıda gösterdiğim şekilde kendi isteğime göre ayarladım.
<root>tagleri arasında log seviyesini ve appenderlarımı tanımladım.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> <log4j:configuration> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%-5p] [%t] ..%-40c{3}:%L - %m%n" /> </layout> </appender> <appender name="file" class="org.apache.log4j.FileAppender"> <param name="File" value="log/atakancoban.log" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%-5p] [%t] ..%-40c{3}:%L - %m%n" /> </layout> </appender> <root> <level value="all" /> <appender-ref ref="file" /> <appender-ref ref="console" /> </root> </log4j:configuration>
Logger Tanımlanması
Logger xml dosyamı sayfa açılırken init() metodu içinde configure metoduna yolladım.Burada src/main/webapp/WEB-INF/log4jconfig.xml
şeklinde bir path verdim bu yol tomcat serverınızdaki çalışma ortamına göre değişir ben proje klasörünü launch configuration olarak seçmiştim. Bu ayarı bu yazımda anlatmıştım Tomcat Launch Configuration ile çalışma ortamı ayarlanması kısmı.
private static void loadLog4jConfig() { DOMConfigurator.configureAndWatch("src/main/webapp/WEB-INF/log4jconfig.xml"); logger= Logger.getLogger(HelloBean.class); }
Butona basıldığında örnek loglar yazdırdım
public void onClick() { System.out.println("bu mesaj > system.out.print"); logger.trace("Bu bir TRACE mesajı "); logger.debug("Bu bir DEBUG mesajı "); logger.info("Bu bir INFO mesajı "); logger.warn("Bu bir WARN mesajı "); logger.error("Bu bir ERROR mesajı "); logger.fatal("Bu bir FATAL mesajı "); exceptionTest();//örnek exception oluşturdum.ERROR seviyesinde log olarak bastım }
Hello Bean son hali
package bean; import java.io.Serializable; import java.util.ArrayList; import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; @ManagedBean @SessionScoped public class HelloBean implements Serializable { private static final long serialVersionUID = -4823295172962937652L; static Logger logger; private String message = "www.atakancoban.com"; @PostConstruct public void init() { // Log4j kütüphanemizi etkinleştir loadLog4jConfig(); System.out.println("init()"); } public void onClick() { System.out.println("bu mesaj > system.out.print"); logger.trace("Bu bir TRACE mesajı "); logger.debug("Bu bir DEBUG mesajı "); logger.info("Bu bir INFO mesajı "); logger.warn("Bu bir WARN mesajı "); logger.error("Bu bir ERROR mesajı "); logger.fatal("Bu bir FATAL mesajı "); exceptionTest(); } private static void loadLog4jConfig() { DOMConfigurator.configureAndWatch("src/main/webapp/WEB-INF/log4jconfig.xml"); logger= Logger.getLogger(HelloBean.class); } public void exceptionTest() { try { ArrayList<String> testArray = new ArrayList<>(); testArray.get(10);//Hata oluşsun } catch (Exception e) { logger.error("exceptionTest() mesajı oluştu. "+e.getMessage(),e); } } // Getter Setter public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
Örnek Proje Çıktıları
Log Seviyesi : ALL
Log Seviyesi : DEBUG
Log seviyesi debug durumunda log dosyasındaki çıktı bu şekilde.Bu çıktıda örnek exceptionda oluşturdum oda log içinde yazmakta.Çıktının formatı console ile aynı verdiğim için aynı.Burada aslında iki Appender çalıştı(File Appender ve Console Appender) birisi consoleda logları gösterdi bir tanesi de atakancoban.log dosyasına logları yazdırdı.Burada console log resmine dikkat edin System.Out.Println ile bir çıktı yazdım ve atakancoban.log kısmında gözükmeyecek atakancoban.log dosyasına yazılması için logger kullanılarak bir mesaj basılması gerekir.
Log Seviyesi : INFO
Log Seviyesi : WARN
Log Seviyesi : ERROR
Log Seviyesi : FATAL
Örnek exception mesajımı ERROR seviyesinde yazmıştım.Bu nedenle FATAL seviyesinde exceptiondan haberim yok.
Log Seviyesi : OFF
Tahmin ettiğiniz gibi sizleri tertemiz bir log sayfası bekler 😀
logger.info(“Kolay Gelsin. 🙂 ” );
Projenin kaynak kodlarını indir
Yazıyı yazarken yararlandığım bloglar : sukrucakmak , yusuf-cakmak