Spring Boot- Log4J2 Kullanımı
Merhabalar.
Bu yazıda Spring Boot uygulamamızla Log4J2'nun birlikte kullanımına hızlıca değineceğiz.
Başlayalım…
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>SpringBootLog4J2Example</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
</project>
pom.xml dosyamızda spring-boot-starter-web bağımlılığın içinde gelen spring-boot-starter-logging bağımlılığını exclude ediyoruz. Bunun yapılmasındaki amaç çakışmaların önlenmesidir.
Akabinde de spring-boot-starter-log4j2 bağımlılığımızı projemize ekliyoruz.
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" />
</Console>
<RollingFile name="RollingFile"
fileName="C:\Users\IGUNEL\Desktop\SpringBootLog4J2Example.log"
filePattern="./logs/$${date:yyyy-MM}/spring-boot-logger-log4j2-%d{-dd-MMMM-yyyy}-%i.log.gz">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- rollover on startup, daily and when the file reaches
10 MegaBytes -->
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy
size="10 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!-- LOG everything at INFO level -->
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</Root>
<!-- LOG "com.ilkaygunel*" at TRACE level -->
<Logger name="com.ilkaygunel" level="trace"/>
</Loggers>
</Configuration>
log4j2 dosyamız bizim loglama konfigürasyon dosyamızdır. Bu dosya içerisinde loglarımızın konsola nasıl basılacağını, hangi dosyaya hangi şekilde basılacağını ve hangi seviyedeki logların dikkate alınacağını bildiriyoruz.
RollingFile tag’i ile loglarımızın console’un yanı sıra bir dosyaya da yazılmasını söylüyoruz. PatternLayout altındaki pattern kısmında ise logların nasıl bir pattern’e göre yazdırılacağını söylüyoruz. Burada yer alan
%d %p %C{1.} [%t] %m%n
kısmının ne anlama geldiğini inceleyelim.
%d -> logun yazıldığı tarih ve saati niteler. yyyy-MM-dd HH:mm:ss,nnn formatında yazdırılır.
%p -> logun seviyesini yazdırır.
%C{1.} -> Logun yazdırıldığı sınıfın ait olduğu paket bir harfle yazdırılıyor. Demo kısmındaki log çıktılarına bakınca paket isimlerinin a.b.c… şeklinde yazıldığını görüyoruz.
[%t] -> logu hangi uygulama parçasının yazdırdığını söyler. Örneğin uygulama ayağa kalkarken uygulamayı main metodu üzerinden kaldırdığımız için loglarda [main] görüyoruz.
%m%n -> %m ile yazdırılacak log mesajını yazdır %n ile de log mesajı bitince bir alt satıra kay demiş oluyoruz.
Loggers kısmında Root level=”info” satırı ile seviyesi info olan logları yazacağımızı bildiriyoruz.
Hemen altındaki Logger name=”com.ilkaygunel” satırı ile ise proje içerisinde com.ilkaygunel paketi altında yer alan sınıflardaki trace ve üzerindeki loglar loglanacak.
Log4J2ExampleService.java
package com.ilkaygunel.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class Log4J2ExampleService {
Logger logger = LoggerFactory.getLogger(Log4J2ExampleService.class);
public void loggingForExample() {
logger.debug("Log4J2 Example Service Debug Level Logging!");
}
}
Log4J2ExampleService.java sınıfımızda slf4j altından bir Logger objesi elde ettik ve logginfForExample metodunda debug seviyesinde bir log basıyoruz.
RestAPIS.java
package com.ilkaygunel.apis;
import com.ilkaygunel.service.Log4J2ExampleService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RestAPIS {
private final Log4J2ExampleService log4J2ExampleService;
public RestAPIS(Log4J2ExampleService log4J2ExampleService) {
this.log4J2ExampleService = log4J2ExampleService;
}
@RequestMapping(method = RequestMethod.GET, value = "/log4j2ExampleApi")
public ResponseEntity<HttpStatus> log4j2ExampleApi() {
log4J2ExampleService.loggingForExample();
return new ResponseEntity<>(HttpStatus.OK);
}
}
RestAPIS sınıfımız ise bizim Rest Api controller’ımız. log4j2ExampleApi path’ine gelen istekler Log4J2ExampleService içerisindeki loggingForExample metodunu çağırıp log basmamıza yardımcı olacak.
Demo
Şimdi log4j2.xml dosyamızda konfigürasyon değişiklikleri yaparak kullanımı bir demo edelim.
Şimdi http://localhost:8080/log4j2ExampleApi adresine istek gönderiyorum ve logu kontrol ettiğimde Log4J2ExampleService içerisindeki DEBUG seviyesindeki logun basıldığını görüyorum.
Şimdi Desktop’ta oluşan SpringBootLog4J2Example.log dosyasını kontrol ettiğimde loglar oraya da yansımış durumda.
Şimdi
<Logger name="com.ilkaygunel" level="trace"/>
satırındaki level’ı trace’den info’ya çekiyoruz.
<Logger name="com.ilkaygunel" level="info"/>
Projeyi yeniden başlatıp tekrar adresi çağırdığımda ise Log4J2ExampleService sınıfındaki logun yazdırılmadığını görüyorum. Log4J2.xml dosyasında com.ilkaygunel paketindeki logların info ve üzerinde olanlar loglansın demiştik ve bizim logumuz debug seviyesinde olduğu için loglanmadı.
Bu yazıda anlatacaklarım da bu kadar arkadaşlar.
Başka yazıda görüşene kadar hoşçakalın.