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

LogBack , Log4J , Log4j2 , Slf4j

موارد استفاده تا تفاوت هرکدوم:

در دنیای برنامه‌نویسی جاوا، برای ثبت وقایع (Logging)، چندین کتابخانه و ابزار مختلف وجود دارد.

1 - Log4j

یک کتابخانه ثبت وقایع قدیمی و محبوب است که توسط Apache توسعه یافته است. این کتابخانه به برنامه‌نویسان اجازه می‌دهد تا وقایع و پیام‌ها را در هر سطحی (حالت Debug، Info، Warn، Error، Fatal) ثبت کنند.

ویژگی‌ها:

  • پیکربندی ساده و انعطاف‌پذیر.
  • پشتیبانی از appenders مختلف (کنسول، فایل، دیتابیس و…).
  • لاگ‌گیری دوره‌ای و چرخشی.

یه نموه ساده از نحوه استفاده :

<log4j:configuration> <appender name=&quotconsole&quot class=&quotorg.apache.log4j.ConsoleAppender&quot> <layout class=&quotorg.apache.log4j.PatternLayout&quot> <param name=&quotConversionPattern&quot value=&quot%d{ISO8601} %-5p [%t] %c: %m%n&quot/> </layout> </appender> <root> <priority value=&quotdebug&quot/> <appender-ref ref=&quotconsole&quot/> </root> </log4j:configuration>

2-Log4j2

نسخه جدیدتر و پیشرفته‌تر Log4j است که چندین محدودیت نسخه قبلی را برطرف کرده و ویژگی‌های بیشتری را اضافه کرده است. این کتابخانه همچنین بهینه‌تر است و عملکرد بالاتری دارد.

ویژگی‌ها:

  • پشتیبانی از Asynchronous Logging (ثبت وقایع غیرهمزمان).
  • معماری بهبود یافته و سبک‌تر.
  • پشتیبانی از APIهای مختلف و قابلیت گسترش.

نقاط قوت:

  • عملکرد بالا: Log4j2 می‌تواند مدیریت ثبتی کارآمدتری را ارائه دهد، به خصوص در بارهای سنگین.
  • ویژگی‌های پیشرفته: مانند پشتیبانی از ثبت وقایع غیرهمزمان، پیکربندی ساده، و پشتیبانی از JSON و XML.
  • دستوریابی و ابزارهای کمکی: Log4j2 دارای ابزارهای پیکربندی با رابط کاربری گرافیکی (GUI) برای آسان‌تر کردن تنظیمات است.

نقاط ضعف:

  • پیچیدگی: ممکن است مستندات و تنظیمات پیچیده به نظر برسند و نیاز به زمان زیادی برای یادگیری داشته باشند.
  • مدیریت وابستگی‌ها: مدیریت بسیاری از وابستگی‌ها (مثل اتصال به SLF4J) می‌تواند چالش برانگیز باشد.

باگ‌های امنیتی:

  • Log4Shell:
  • یکی از بزرگترین مشکلات امنیتی در Log4j2 منتشر شده بود که اجازه اجرای کد از راه دور (Remote Code Execution) را می‌دهد. این باگ به طور گسترده‌ای مورد سوءاستفاده قرار گرفت و منجر به نگرانی‌های جدی امنیتی شد. به همین دلیل مهم است که به‌روزرسانی‌های امنیتی را به‌روز نگه‌دارید.

دلیل محبوبیت :

  • محبوبیت Log4j2 به دلیل کارایی بالا و ویژگی‌های مدرن آن است. بسیاری از پروژه‌های بزرگ و پیچیده از آن استفاده می‌کنند.

یه نموه ساده از نحوه استفاده :

<Configuration status=&quotWARN&quot> <Appenders> <Console name=&quotConsole&quot target=&quotSYSTEM_OUT&quot> <PatternLayout pattern=&quot%d %p %c{1} - %m%n&quot/> </Console> </Appenders> <Loggers> <Root level=&quotdebug&quot> <AppenderRef ref=&quotConsole&quot/> </Root> </Loggers> </Configuration>


3. SLF4J (Simple Logging Facade for Java)

یک رابط (Facade) برای سیستم‌های ثبت وقایع است و به برنامه‌نویسان این امکان را می‌دهد که از هر کتابخانه‌ای (مانند Log4j، Logback) به راحتی استفاده کنند. این کار به سادگی تغییر کتابخانه‌ی ثبت وقایع بدون تغییر در کد برنامه انجام می‌پذیرد.

ویژگی‌ها:

  • استقلال از پیاده‌سازی‌های زیرین.
  • قابلیت تغییر کتابخانه ثبت وقایع بدون تغییر در کد اصلی.

نقاط قوت:

  • واسط کلی: SLF4J به‌عنوان یک facade برای بسیاری از پیاده‌سازی‌های لاگینگ عمل می‌کند، بنابراین می‌توانید به آسانی از یک کتابخانه به دیگری تغییر دهید.
  • ساده‌سازی گزارش‌گیری: برای کار با چندین کتابخانه لاگینگ تنها به یک API نیاز دارید.

نقاط ضعف:

  • عدم پیاده‌سازی مستقل: SLF4J خودش ابزار لاگینگ نیست و برای کار به یک پیاده‌سازی (مثل Log4j یا Logback) نیاز دارد.

باگ‌های امنیتی:

  • به خودی خود به طور مستقیم با مسائل امنیتی درگیر نیست، اما امنیت پیاده‌سازی‌هایی که به آن متکی هستند، مهم است.

موارد استفاده و محبوبیت:

  • در بین توسعه‌دهندگان Java به محبوبیت بالایی دست یافته است، به‌خصوص افرادی که نیاز به انعطاف‌پذیری لاگینگ دارند.

یه نمونه از نحوه استفاده :

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Example { private static final Logger logger = LoggerFactory.getLogger(Example.class); public void doSomething() { logger.info(&quotThis is an info message&quot); } }

4. Logback

یک کتابخانه ثبت وقایع پیشرفته است که توسط خالق Log4j توسعه یافته و می‌تواند به عنوان یک جانشین Log4j استفاده شود. این کتابخانه به طور پیش‌فرض با SLF4J سازگاری کامل دارد.

ویژگی‌ها:

  • پشتیبانی بهتر از عملکرد و سبک ثبت وقایع.
  • تنوع در اپندرها و الگوهای خروجی.
  • پشتیبانی از فایل‌های پیکربندی XML و Groovy.

نقاط قوت:

  • عملکرد و ساده‌سازی: Logback به عنوان یک جانشین برای Log4j طراحی شده و به طور مستقیم با SLF4J ادغام شده است.
  • پیکربندی آسان: پیکربندی Logback ساده و مستقیم است و می‌توان به راحتی آن را به صورت XML یا Groovy نوشت.
  • مشاهده و ردیابی آسان: Logback امکانات پیشرفته‌ای برای مشاهده و ردیابی خطاها دارد.

نقاط ضعف:

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

باگ‌های امنیتی:

  • در مقایسه با Log4j2 به ندرت با باگ‌های امنیتی بزرگ روبرو شده است. با این حال، همیشه باید به‌روزرسانی‌های امنیتی را دنبال کرد تا مطمئن شوید که آسیب‌پذیری‌های احتمالی برطرف شده‌اند.

دلیل محبوبیت:

  • به خاطر سادگی و کارایی در پروژه‌های متوسط و بزرگ محبوب است و به طور گسترده‌ای در پروژه‌های جدید توصیه می‌شود.

یه نمونه ساده از نحوه استفاده :

<configuration> <appender name=&quotconsole&quot class=&quotch.qos.logback.core.ConsoleAppender&quot> <encoder> <pattern> %date %level [%thread] %logger{10} - %msg%n </pattern> </encoder> </appender> <root level=&quotdebug&quot> <appender-ref ref=&quotconsole&quot/> </root> </configuration>



خوب حالا بریم نحوه استفاده رو بگیم :

شما می‌توانید از هر دو کتابخانه Log4j2 و Logback به همراه SLF4J استفاده کنید، زیرا SLF4J به عنوان یک واسط یا facade عمل می‌کند که امکان استفاده از پیاده‌سازی‌های مختلف کتابخانه‌های لاگینگ را فراهم می‌کند.

1- استفاده از Logback به همراه SLF4J

کانفیگ maven :

<dependencies> <!-- SLF4J API --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- Logback Classic --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.10</version> </dependency> </dependencies>

پیکربندی Logback:

شما می‌توانید Logback را با استفاده از یک فایل پیکربندی XML پیکربندی کنید.

نام فایل باید logback.xml باشد و باید در دایرکتوری src/main/resources قرار گیرد.

<configuration> <!-- تنظیم کنسول لاگ --> <appender name=&quotCONSOLE&quot class=&quotch.qos.logback.core.ConsoleAppender&quot> <encoder> <pattern> %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <!-- تنظیم فایل لاگ --> <appender name=&quotFILE&quot class=&quotch.qos.logback.core.FileAppender&quot> <file> myapp.log </file> <!-- نام فایل لاگ --> <append>true</append> <!-- برای افزودن به فایل موجود --> <encoder> <pattern> %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <!-- تعیین سطح لاگ برای کلاسی خاص --> <logger name=&quotcom.example&quot level=&quotDEBUG&quot/> <!-- سطح لاگ کلی --> <root level=&quotINFO&quot> <appender-ref ref=&quotCONSOLE&quot/> <appender-ref ref=&quotFILE&quot/> </root> </configuration>


در این پیکربندی:

  • یک appender برای نمایش لاگ‌ها در کنسول تعریف شده است.
  • یک logger برای package com.example با سطح لاگ DEBUG تعریف شده است.
  • بخش root سطح لاگ INFO را با ارجاع به CONSOLE تنظیم کرده است.

نکات اضافی

  • می‌توانید پارامترهای file و pattern را به دلخواه تغییر دهید.
  • با استفاده از size و timeBasedRollingPolicy می‌توانید لاگ‌ها را به صورت چرخشی ذخیره کنید.

کد جاوا

حالا یک کلاس جاوا ایجاد کنید که از SLF4J برای لاگ‌گیری استفاده کند. مثلا:

package com.example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LoggingExample { private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class); public static void main(String[] args) { logger.debug(&quotThis is a debug message.&quot); logger.info(&quotThis is an info message.&quot); logger.warn(&quotThis is a warning message.&quot); logger.error(&quotThis is an error message.&quot); } }


2- استفاده از Log4j2 به همراه SLF4J

برای استفاده از Log4j2 به همراه SLF4J، باید SLF4J و Log4j2 را در پروژه‌تان تنظیم کنید. این تنظیمات ابتدا شامل اضافه کردن وابستگی‌ها (dependencies) برای کتابخانه‌های مورد نیاز است.

کانفیک maven :

<!-- SLF4J API --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- Log4j2 API --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.19.0</version> </dependency> <!-- Log4j2 Core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.19.0</version> </dependency> <!-- SLF4J Binding for Log4j2 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.19.0</version> </dependency>


پیکربندی Log4j2 :

شما می‌توانید Log4j2 را با استفاده از یک فایل پیکربندی XML پیکربندی کنید.

نام فایل باید log4j2.xml باشد و باید در دایرکتوری src/main/resources قرار گیرد.

<?xml version=&quot1.0&quot encoding=&quotUTF-8&quot?> <Configuration status=&quotWARN&quot> <Appenders> <!-- تنظیم فایل لاگ --> <File name=&quotFileLogger&quot fileName=&quotlogs/myapp.log&quot append=&quottrue&quot> <PatternLayout pattern=&quot%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n&quot/> </File> <!-- تنظیم لاگ کنسولی --> <Console name=&quotConsoleLogger&quot> <PatternLayout pattern=&quot%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n&quot/> </Console> </Appenders> <Loggers> <Logger name=&quotcom.example&quot level=&quotdebug&quot additivity=&quotfalse&quot> <AppenderRef ref=&quotFileLogger&quot/> <AppenderRef ref=&quotConsoleLogger&quot/> </Logger> <Root level=&quotinfo&quot> <AppenderRef ref=&quotFileLogger&quot/> <AppenderRef ref=&quotConsoleLogger&quot/> </Root> </Loggers> </Configuration>

در این پیکربندی:

  • یک appender برای نمایش لاگ‌ها در کنسول تعریف شده است.
  • یک logger برای package com.example با سطح لاگ debug تعریف شده است.
  • بخش root سطح لاگ info را با ارجاع به Console تنظیم کرده است.

نکات اضافی

  • می‌توانید نام فایل و الگوی لاگ را به دلخواه تغییر دهید.
  • قابلیت‌های پیشرفته‌تری مانند RollingFileAppender را برای چرخش فایل‌های لاگ ارائه می‌دهد. برای این کار می‌توانید به جای File، از RollingFile استفاده کنید.

کد جاوا

حالا یک کلاس جاوا ایجاد کنید که از SLF4J برای لاگ‌گیری استفاده کند. مثلاً:

package com.example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LoggingExample { private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class); public static void main(String[] args) { logger.debug(&quotThis is a debug message.&quot); logger.info(&quotThis is an info message.&quot); logger.warn(&quotThis is a warning message.&quot); logger.error(&quotThis is an error message.&quot); } }




خوب حالا یه مسئله :

اگر به فایل های کانفیگ هر کدوم نگاه کنید این چند خط دیده میشه

در log4j2:

<Logger name=&quotcom.example&quot level=&quotdebug&quot additivity=&quotfalse&quot> <AppenderRef ref=&quotConsole&quot /> </Logger>

و در LogBack :

<logger name="com.example" level="DEBUG"/>

حالا یه سوال پیش میاد ایا باید برای تعریف log Level برای کلاس های هر پکیج بیایم و این چند خط رو بنویسیم :

جواب سوال اینه که بله باید تعریف کنید این به شما کمک میکند که برای هر پیکیج خاص بسته به نیاز log level خاص خود را تعیین کنید . (به عنوان مثال این پایین LogBack رو میگم)

<Logger name=&quotcom.example.package1&quot level=&quotdebug&quot/> <Logger name=&quotcom.example.package2&quot level=&quoterror&quot/>

هرچند که میشه root هم داشت که برای کل پروژه تعریف میشه :

<root level=&quotINFO&quot> <appender-ref ref=&quotCONSOLE&quot /> </root>




محبوبیت و انتخاب

بهترین انتخاب بستگی به نیازهای پروژه شما دارد:

Log4j2 و Logback

هر دو عملکرد بالایی دارند و با SLF4J سازگاری خوبی دارند. انتخاب یکی از آنها بستگی به نیازهای خاص پروژه شما دارد:

  • Log4j2:
  • برای عملکرد بهتر در بارهای سنگین و پشتیبانی از ویژگی‌های مدرن مانند ثبت وقایع غیرهمزمان (Asynchronous).
  • Logback:
  • برای تنظیمات پیشرفته و پشتیبانی از فایل‌های پیکربندی XML و Groovy.

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

برای پروژه‌های جدید، پیشنهاد می‌شود از Log4j2 یا Logback (در کنار SLF4J) استفاده کنید؛ چرا که این کتابخانه‌ها به ویژگی‌ها و کارایی بهتری نسبت به Log4j قدیمی و پشتیبانی بهتری برای نیازهای پروژه‌های مدرن دارند.

نتیجه‌گیری

انتخاب میان Log4j2 و Logback

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

1-Log4j2 با SLF4J:

نقاط قوت:

  1. عملکرد بالا: Log4j2 طراحی شده تا عملکرد بسیار بالا و بهینه‌تری در بارهای سنگین داشته باشد.
  2. ویژگی‌های پیشرفته: مانند ثبت وقایع غیرهمزمان (Asynchronous Logging) که می‌تواند کارایی را در اپلیکیشن‌های مقیاس بزرگ بهبود بخشد.
  3. پیکربندی انعطاف‌پذیر: پیکربندی از طریق فایل‌های XML، JSON، YAML و حتی برنامه‌نویسی امکان‌پذیر است.
  4. مدیریت بهتر خطا: Log4j2 ابزارهای بیشتری برای مدیریت خطاها و اشکال‌زدایی ارائه می‌دهد.

نقاط ضعف:

  1. پیچیدگی: ممکن است تنظیمات و پیکربندی آن در ابتدا برای برخی توسعه‌دهندگان پیچیده به نظر برسد.
  2. حساسیت به باگ‌ها: مانند مشکلات امنیتی اخیر (Log4Shell) که می‌تواند عواقب جدی داشته باشد.


2- Logback با SLF4J

نقاط قوت:

  1. سادگی و کاربرپسندی: Logback به عنوان جایگزینی برای Log4j طراحی شده و پیکربندی آن ساده‌تر است.
  2. ادغام مستقیم با SLF4J: Logback به‌طور مستقیم با SLF4J ترکیب شده است، به این معنی که نیازی به وابستگی‌های اضافی نیست.
  3. مشاهده و ردیابی خطاها: Logback ابزارهای مناسبی برای ردیابی و جمع‌آوری اطلاعات خطاها فراهم می‌کند.
  4. عملکرد مطلوب: معمولاً Logback عملکرد مطلوبی دارد، به ویژه برای پروژه‌های متوسط.

نقاط ضعف:

  1. ویژگی‌های محدودتر: در مقایسه با Log4j2 ممکن است برخی از ویژگی‌های پیشرفته‌تر را نداشته باشد.
  2. پشتیبانی از بار سنگین: در برخی سناریوهای بسیار بار سنگین، عملکرد آن ممکن است نسبت به Log4j2 کمی پایین‌تر باشد.

موارد استفاده

Log4j2 با SLF4J:

مناسب برای پروژه‌های بزرگ و پیچیده که نیاز به عملکرد بالا و ویژگی‌های پیشرفته دارند. اگر به دنبال ثبت وقایع غیرهمزمان و پیکربندی انعطاف‌پذیر هستید.

Logback با SLF4J:

مناسب برای پروژه‌های متوسط و کوچک که نیاز به سادگی و کاربرپسندی دارند. توصیه برای پروژه‌های جدید به خصوص اگر تیم از SLF4J به خوبی آگاه است.


سخن آخر:

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


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

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

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