صادق خانزادی
صادق خانزادی
خواندن ۵ دقیقه·۲ ماه پیش

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

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

spring bootlogbackslf4jlog4j2java
Java Developer - Technical Team Lead At Dotin
شاید از این پست‌ها خوشتان بیاید