Java Developer | digipay
How to do logging in Spring Boot?

در دنیای برنامهنویسی جاوا، برای ثبت وقایع (Logging)، چندین کتابخانه و ابزار مختلف وجود دارد.
ما 4 تا از پراستفاده ترین هاشون ( LogBack , Log4J , Log4j2 , Slf4j ) رو قبلا مقایسه کردیم و دلیل استفاده از هر کدوم رو شرح دادیم ، اگر آشنایی ندارید حتما یه سر بهش بزنید.
توی این آموزش قصد داریم روش به کارگیری این ابزار ها رو در spring boot آموزش بدیم.
1- Logback - slf4j

برای استفاده از SLF4J به همراه Logback در یک پروژه Spring Boot، شما میتوانید از روشهای مختلفی بهرهبرداری کنید. SLF4J یک لایه انتزاعی برای لاگبرداری است و Logback به عنوان پیادهساز مناسبی برای آن عمل میکند.
اضافه کردن وابستگیها:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>پیکربندی Logback:
خوب میشه با سه روش پیکر بندی انجام داد :
- روش اول استفاده از
logback.xml - روش دوم استفاده از
logback-spring.xml - روش سوم استفاده از
application.properties
خوب حالا بریم هر کدوم رو بررسی کنیم :
1- استفاده از logback.xml
شما میتوانید یک فایل پیکربندی به نام logback.xml در دایرکتوری src/main/resources ایجاد کنید.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>2- استفاده از logback-spring.xml
اگر میخواهید پیکربندیتان تحت Spring Boot باشد، میتوانید از logback-spring.xml استفاده کنید که به شما اجازه میدهد از ویژگیهای Spring Boot بهره ببرید:
<configuration>
<springProfile name="development">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
</springProfile>
</configuration>یه چنتا کانفیگ اضافی هم بگیم بعد بریم سر مورد سوم :
- تنظیم سطح لاگ
شما میتوانید سطح لاگ را در فایل پیکربندی خود تغییر دهید:
<logger name="com.example" level="DEBUG"/>
- ذخیره لاگها در فایل:
یه سر به آموزش Logback بزنید.
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>
logs/app.log
</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>3-تنظیمات لاگبرداری در application.properties
3.1. تنظیم سطح لاگ
شما میتوانید سطح لاگ را برای کل برنامه یا برای دستههای خاصی از کلاسها تنظیم کنید:
# تنظیم سطح لاگ برای کل برنامه
logging.level.root=INFO
# تنظیم سطح لاگ برای یک بسته خاص
logging.level.com.example=DEBUG
3.2. تنظیم فرمت لاگ
شما میتوانید فرمت لاگ را نیز تنظیم کنید:
# تنظیم فرمت لاگ برای کنسول
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n
# تنظیم فرمت لاگ برای فایل
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} - %msg%n
3.3. ذخیره لاگها در فایل
اگر میخواهید لاگها را در یک فایل ذخیره کنید، میتوانید مسیر فایل را مشخص کنید:
# فعالسازی ذخیرهسازی لاگها در فایل
logging.file.name=logs/app.log
#یا
logging.file.path=logs
۴. تنظیم سطح لاگ برای سطحهای مختلف
شما میتوانید تنظیمات را برای سطوح مختلف ثبت کنید:
# تنظیم سطح لاگ برای WARN
logging.level.root=WARNنمونهای کامل از تنظیمات
در اینجا یک نمونه از تنظیمات در application.properties آورده شده است:
# تنظیم سطح لاگ ریشه
logging.level.root=INFO
# تنظیم سطح لاگ برای بسته خاص
logging.level.com.example=DEBUG
# تنظیم مسیر فایل
logging.file.name=logs/app.log
# تنظیم الگوی لاگ
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%nاستفاده از application.properties یا application.yml برای پیکربندی لاگبرداری در Spring Boot بسیار آسان و منعطف است. این روش به شما اجازه میدهد تا به راحتی تنظیمات خود را تغییر دهید و بهتر با محیطهای مختلف (توسعه، تولید و غیره) سازگار شوید.
خوب حالا لاگ زدنش چطوریه:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class MyService {
private static final Logger logger = LoggerFactory.getLogger(MyService.class);
public void performAction() {
logger.info("Action has been performed!");
}
}2- Log4j2 - slf4j

برای استفاده از Log4j2 به همراه SLF4J در یک پروژه Spring Boot، شما باید چنتا کار ساده انجام بدید . Log4j2 یک پیادهساز قدرتمند و سریع برای SLF4J است و از قابلیتهای پیشرفتهای برخوردار است.
اضافه کردن وابستگیها:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<scope>exclude</scope> <!-- حذف Logback -->
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>پیکربندی Log4j2:
خوب میشه با سه روش پیکر بندی انجام داد :
- روش اول استفاده از
log4j2.xml - روش دوم استفاده از log4j2.yaml
- روش سوم استفاده از log4j2.json
- روش چهارم استفاده از
application.properties
خوب حالا بریم هر کدوم رو بررسی کنیم :
1- استفاده از log4j2.xml
شما میتوانید فایل پیکربندی Log4j2 را به نام log4j2.xml، log4j2.json یا log4j2.yaml در دایرکتوری src/main/resources ایجاد کنید. در اینجا یک نمونه ساده از log4j2.xmlگفتیم:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
</Console>
<File name="FileLogger" fileName="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileLogger"/>
</Root>
</Loggers>
</Configuration>یه چنتا کانفیگ اضافی هم بگیم بعد بریم سر مورد بعدی:
- تنظیم سطح لاگ
شما میتوانید سطح لاگ را در فایل پیکربندی Log4j2 تنظیم کنید:
<Loggers>
<Logger name="com.example" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>- فعالسازی ذخیره لاگها در فایل
برای ذخیره لاگها در یک فایل، در قسمت appenders ، از File استفاده میشود که در نمونه بالا نشان داده شده است. (یه سر به آموزش Log4j2 بزنید)
2-تنظیمات Log4j2 در application.properties (مثل همون Logback)
۱. تنظیم سطح لاگ
میتوانید سطح لاگ را برای کل برنامه یا برای بستههای خاص تنظیم کنید:
# تنظیم سطح لاگ برای ریشه
logging.level.root=INFO
# تنظیم سطح لاگ برای یک بسته خاص
logging.level.com.example=DEBUG۲. ذخیره لاگها در فایل
برای ذخیرهسازی لاگها در یک فایل، میتوانید نام و مسیر فایل را از این طریق تنظیم کنید:
# فعالسازی ذخیرهسازی لاگها در فایل
logging.file.name=logs/app.log
# تنظیم سطح لاگ با ذخیره در فایل
logging.file.path=logs۳. تنظیم الگوی لاگ
برای تنظیم فرمت (الگو) لاگها:
# تنظیم الگوی لاگ برای کنسول
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n
# تنظیم الگوی لاگ برای فایل
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} - %msg%nدر اینجا یک نمونه کامل از پیکربندی در application.propertiesگفتیم:
# تنظیم سطح لاگ ریشه
logging.level.root=INFO
# تنظیم سطح لاگ برای بسته خاص
logging.level.com.example=DEBUG
# تنظیم نام فایل لاگ
logging.file.name=logs/app.log
# تنظیم الگوی لاگ برای کنسول
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%nقابلیتهای اضافی
۱. فعالسازی لاگبرداری غیرهمزمان
اگر میخواهید از لاگبرداری غیرهمزمان استفاده کنید:
چون Log4j2 از Asynchronous Logging (ثبت وقایع غیرهمزمان) پشتیبانی میکنه میتونید از این کانفیگ استفاده کنید.
logging.async.enabled=trueجمعبندی
استفاده از application.properties برای پیکربندی Log4j2 در Spring Boot بسیار ساده و موثر است و به شما این امکان را میدهد که پیکربندیهای خود را به راحتی مدیریت کنید.
خوب حالا بریم باهاش یه لاگ بزنیم :
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class MyService {
private static final Logger logger = LoggerFactory.getLogger(MyService.class);
public void performAction() {
logger.info("Action has been performed!");
}
}سخن آخر:
اگر به دنبال ویژگیهای پیشرفته، عملکرد قوی و انعطافپذیری هستید، Log4j2 گزینه بهتری خواهد بود. اما اگر سادگی و کاربرپسندی برای شما در اولویت است و برای پروژههای متوسط کار میکنید، Logback میتواند انتخاب مناسبی باشد. در هر صورت، با توجه به نیازهای خاص پروژه و تیم خود، میتوانید انتخاب مناسبی داشته باشید.
امیدوارم خوشتون بیاد و لذت ببرید
این آموزش هم بخونید کمکتون میکنه : LogBack , Log4J , Log4j2 , Slf4j
منتظر نگاه قشنگتون هستم.
مطلبی دیگر از این انتشارات
using JUnit5 and Mockito (مفاهیم کلی تست)
مطلبی دیگر از این انتشارات
Exception Handling - Sample Code (Spring Boot)
مطلبی دیگر از این انتشارات
HashMap VS TreeMap VS Set