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=&quotSTDOUT&quot class=&quotch.qos.logback.core.ConsoleAppender&quot>
         <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern> 
         </encoder> 
     </appender>
     <root level=&quotINFO&quot>
         <appender-ref ref=&quotSTDOUT&quot/>
      </root> 
</configuration>

2- استفاده از logback-spring.xml

اگر می‌خواهید پیکربندی‌تان تحت Spring Boot باشد، می‌توانید از logback-spring.xml استفاده کنید که به شما اجازه می‌دهد از ویژگی‌های Spring Boot بهره ببرید:

<configuration>
      <springProfile name=&quotdevelopment&quot> 
         <appender name=&quotSTDOUT&quot class=&quotch.qos.logback.core.ConsoleAppender&quot> 
         <encoder>
              <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern> 
         </encoder> 
      </appender> 
 
     <root level=&quotDEBUG&quot>
           <appender-ref ref=&quotSTDOUT&quot/>
      </root> 
     </springProfile>
 </configuration>

یه چنتا کانفیگ اضافی هم بگیم بعد بریم سر مورد سوم :

  • تنظیم سطح لاگ

شما می‌توانید سطح لاگ را در فایل پیکربندی خود تغییر دهید:

<logger name="com.example" level="DEBUG"/>
  • ذخیره لاگ‌ها در فایل:

یه سر به آموزش Logback بزنید.

<appender name=&quotFILE&quot class=&quotch.qos.logback.core.FileAppender&quot>
           <file>
                  logs/app.log
           </file> 
           <encoder>
                 <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
            </encoder> 
</appender>

 <root level=&quotINFO&quot> 
       <appender-ref ref=&quotFILE&quot/>
</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(&quotAction has been performed!&quot);     
     } 
}




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=&quot1.0&quot encoding=&quotUTF-8&quot?>
<Configuration status=&quotWARN&quot>
    <Appenders>
        <Console name=&quotConsole&quot target=&quotSYSTEM_OUT&quot>
            <PatternLayout pattern=&quot%d{yyyy-MM-dd HH:mm:ss} - %msg%n&quot/>
        </Console>
        <File name=&quotFileLogger&quot fileName=&quotlogs/app.log&quot>
            <PatternLayout pattern=&quot%d{yyyy-MM-dd HH:mm:ss} - %msg%n&quot/>
        </File>
    </Appenders>
    <Loggers>
        <Root level=&quotINFO&quot>
            <AppenderRef ref=&quotConsole&quot/>
            <AppenderRef ref=&quotFileLogger&quot/>
        </Root>
    </Loggers>
</Configuration>

یه چنتا کانفیگ اضافی هم بگیم بعد بریم سر مورد بعدی:

  • تنظیم سطح لاگ

شما می‌توانید سطح لاگ را در فایل پیکربندی Log4j2 تنظیم کنید:

<Loggers>
    <Logger name=&quotcom.example&quot level=&quotDEBUG&quot additivity=&quotfalse&quot>
        <AppenderRef ref=&quotConsole&quot/>
    </Logger>
    <Root level=&quotINFO&quot>
        <AppenderRef ref=&quotConsole&quot/>
    </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(&quotAction has been performed!&quot);     
       }
 }



سخن آخر:

اگر به دنبال ویژگی‌های پیشرفته، عملکرد قوی و انعطاف‌پذیری هستید، Log4j2 گزینه بهتری خواهد بود. اما اگر سادگی و کاربرپسندی برای شما در اولویت است و برای پروژه‌های متوسط کار می‌کنید، Logback می‌تواند انتخاب مناسبی باشد. در هر صورت، با توجه به نیازهای خاص پروژه و تیم خود، می‌توانید انتخاب مناسبی داشته باشید.

امیدوارم خوشتون بیاد و لذت ببرید

این آموزش هم بخونید کمکتون میکنه : LogBack , Log4J , Log4j2 , Slf4j

منتظر نگاه قشنگتون هستم.