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
منتظر نگاه قشنگتون هستم.
مطلبی دیگر از این انتشارات
Ternary Operator in Java
مطلبی دیگر از این انتشارات
Mutable VS Immutable in java
مطلبی دیگر از این انتشارات
Integer vs int in java