برنامه نویسی

تسلط بر ثبت جاوا: بهترین روش ها برای نظارت موثر بر برنامه ها

به عنوان یک نویسنده پرفروش، از شما دعوت می کنم کتاب های من را در آمازون جستجو کنید. فراموش نکنید که من را در Medium دنبال کنید و حمایت خود را نشان دهید. متشکرم حمایت شما یعنی دنیا!

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

بیایید با این سوال اساسی شروع کنیم: چرا ورود به سیستم اینقدر مهم است؟ به زبان ساده، لاگ ها پنجره ما به رفتار برنامه هستند. آنها به آنچه در داخل کد ما روی می‌دهد قابل مشاهده هستند، به ما کمک می‌کنند تا جریان اجرا را درک کنیم، اشکالات را ردیابی کنیم و عملکرد را نظارت کنیم. بدون ثبت مناسب، عیب یابی به یک بازی حدس زدن تبدیل می شود.

اولین گام در پیاده سازی گزارش گیری موثر، انتخاب چارچوب مناسب گزارش است. در حالی که جاوا یک API ورود به سیستم داخلی (java.util.logging) ارائه می دهد، من متوجه شده ام که چارچوب های شخص ثالث انعطاف پذیری و عملکرد بهتری را ارائه می دهند. انتخاب اصلی من SLF4J (نمای ورود ساده برای جاوا) با Logback به عنوان پیاده سازی اساسی است.

SLF4J یک نمای ساده یا انتزاعی برای چارچوب‌های گزارش‌گیری مختلف ارائه می‌کند، که به شما امکان می‌دهد بین پیاده‌سازی‌های مختلف گزارش بدون تغییر کد خود جابجا شوید. در اینجا یک مثال اساسی از نحوه استفاده از SLF4J آورده شده است:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClass {
    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

    public void doSomething() {
        logger.info("Doing something important");
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یکی از مزایای کلیدی استفاده از چارچوبی مانند SLF4J، امکان استفاده از ثبت پارامتری است. این رویکرد کارآمدتر از الحاق رشته است، به خصوص زمانی که پیام گزارش ممکن است به دلیل سطح گزارش فعلی خروجی نباشد:

String username = "John";
int userId = 12345;
logger.debug("User {} with ID {} logged in", username, userId);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون که چارچوب ورود به سیستم خود را انتخاب کرده‌ایم، بیایید به برخی از بهترین روش‌ها برای ورود موثر بپردازیم.

اول از همه، از سطوح لاگ مناسب استفاده کنید. سطوح گزارش به دسته بندی شدت و اهمیت پیام های گزارش کمک می کند. سطوح گزارش رایج، به ترتیب افزایش شدت، عبارتند از TRACE، DEBUG، INFO، WARN، ERROR و FATAL. من معمولاً از این سطوح استفاده می کنم:

  • TRACE: برای اطلاعات بسیار دقیق، معمولاً فقط هنگام تشخیص مشکلات استفاده می شود.
  • DEBUG: برای اشکال زدایی اطلاعات، مفید در طول توسعه.
  • اطلاعات: برای اطلاعات کلی در مورد پیشرفت برنامه.
  • هشدار: برای موقعیت های بالقوه مضر که مانع از عملکرد برنامه نمی شود.
  • ERROR: برای رویدادهای خطایی که ممکن است همچنان به برنامه اجازه ادامه اجرا را بدهد.
  • FATAL: برای خطاهای شدیدی که احتمالاً منجر به لغو برنامه می شود.

استفاده از سطح گزارش صحیح بسیار مهم است. استفاده بیش از حد از سطوح بالاتر مانند ERROR برای مسائل غیر مهم می تواند منجر به خستگی هشدار شود، در حالی که استفاده بیش از حد از سطوح پایین تر می تواند گزارش های شما را با اطلاعات غیر ضروری پر کند.

بعد، بیایید در مورد ورود به سیستم ساختاری صحبت کنیم. گزارش‌گیری سنتی اغلب از پیام‌های متنی آزاد استفاده می‌کند که تجزیه و تحلیل آن‌ها ممکن است دشوار باشد. از سوی دیگر، گزارش‌گیری ساختاریافته، ورودی‌های گزارش را در قالبی سازگار و قابل خواندن توسط ماشین مانند JSON قالب‌بندی می‌کند. این رویکرد جستجو و تجزیه و تحلیل گزارش‌ها را بسیار آسان‌تر می‌کند، مخصوصاً هنگام استفاده از ابزارهای مدیریت گزارش.

در اینجا نمونه‌ای از نحوه پیاده‌سازی گزارش‌دهی ساختاریافته با استفاده از Logback با logstash-logback-encoder آورده شده است:

import net.logstash.logback.argument.StructuredArguments;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class StructuredLoggingExample {
    private static final Logger logger = LoggerFactory.getLogger(StructuredLoggingExample.class);

    public void processOrder(String orderId, double amount) {
        logger.info("Processing order", 
            StructuredArguments.keyValue("orderId", orderId),
            StructuredArguments.keyValue("amount", amount));
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این یک ورودی گزارش با فرمت JSON ایجاد می کند و تجزیه و تحلیل آن را آسان می کند.

یکی دیگر از تکنیک های قدرتمند، گزارش متن آگاه است. در برنامه های پیچیده، به ویژه آنهایی که چندین درخواست همزمان را مدیریت می کنند، اغلب مفید است که اطلاعات متنی را در هر پیام گزارش وارد کنید. اینجاست که زمینه تشخیصی نقشه‌برداری شده (MDC) مفید است.

MDC به شما امکان می دهد متغیرهای زمینه را تنظیم کنید که به طور خودکار در همه پیام های گزارش بعدی گنجانده شوند. در اینجا یک مثال است:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MDCExample {
    private static final Logger logger = LoggerFactory.getLogger(MDCExample.class);

    public void processRequest(String requestId, String userId) {
        MDC.put("requestId", requestId);
        MDC.put("userId", userId);
        try {
            logger.info("Starting request processing");
            // Process the request
            logger.info("Request processing completed");
        } finally {
            MDC.clear(); // Always clear the MDC to prevent leaks
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، هر پیام log در متد processRequest به طور خودکار شامل requestId و userId می شود و ردیابی تمام پیام های گزارش مربوط به یک درخواست خاص را آسان می کند.

عملکرد یکی دیگر از جنبه های حیاتی ورود به سیستم است. لاگ اجرا شده ضعیف می تواند به طور قابل توجهی بر عملکرد برنامه شما تأثیر بگذارد. در اینجا چند نکته برای کارآمد نگه داشتن ثبت گزارش آورده شده است:

  1. از ضمائم ناهمزمان استفاده کنید. اینها به برنامه شما اجازه می‌دهند تا زمانی که پیام‌های گزارش روی دیسک نوشته می‌شوند یا به یک سرور راه دور ارسال می‌شوند، به پردازش ادامه دهد.

  2. در مورد عملیات گران قیمت در پیام های ورود احتیاط کنید. به عنوان مثال، از فراخوانی روش هایی که پرس و جوهای پایگاه داده یا محاسبات پیچیده را در دستورات گزارش شما انجام می دهند، خودداری کنید.

  3. از ارزیابی تنبل برای پیام های گزارش استفاده کنید. بسیاری از چارچوب‌های ورود به سیستم از این موضوع پشتیبانی می‌کنند. به عنوان مثال، با SLF4J، می توانید از موارد زیر استفاده کنید:

logger.debug("Expensive operation result: {}", () -> performExpensiveOperation());
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تضمین می کند که performExpensiveOperation() تنها در صورتی فراخوانی می شود که سطح DEBUG فعال باشد.

حالا بیایید در مورد چرخش لاگ و حفظ آن صحبت کنیم. همانطور که برنامه شما اجرا می شود، می تواند حجم عظیمی از داده های گزارش را تولید کند. بدون مدیریت مناسب، این می تواند به مشکلات فضای دیسک منجر شود و یافتن اطلاعات مربوطه را دشوار کند.

اکثر چارچوب‌های ورود به سیستم، از جمله Logback، از چرخش گزارش خارج از جعبه پشتیبانی می‌کنند. در اینجا نمونه ای از پیکربندی Logback است که چرخش log را پیاده سازی می کند:


     name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        logs/myapp.log
         class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            logs/myapp-%d{yyyy-MM-dd}.log
            30
            3GB
        
        
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        
    

     level="INFO">
         ref="FILE" />
    

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این پیکربندی هر روز یک فایل گزارش جدید ایجاد می‌کند، گزارش‌ها را به مدت 30 روز نگه می‌دارد و حجم کل فایل‌های گزارش را به 3 گیگابایت محدود می‌کند.

همانطور که برنامه شما رشد می کند، به احتمال زیاد نیاز به پیاده سازی یک راه حل ثبت مرکزی دارید. این شامل ارسال گزارش ها از چندین نمونه از برنامه شما به یک مکان مرکزی برای ذخیره سازی و تجزیه و تحلیل است. ابزارهای محبوب برای این کار عبارتند از پشته ELK (Elasticsearch، Logstash، Kibana) و Graylog.

پیاده‌سازی گزارش‌گیری متمرکز اغلب شامل افزودن یک ضمیمه خاص به پیکربندی گزارش شما می‌شود. به عنوان مثال، برای ارسال گزارش‌ها به Logstash، ممکن است از پیکربندی مانند زیر استفاده کنید:

 name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    logstash-server:4560
     class="net.logstash.logback.encoder.LogstashEncoder" />

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ثبت متمرکز مزایای متعددی از جمله تجزیه و تحلیل لاگ آسان تر، توانایی مرتبط کردن گزارش ها از سرویس های مختلف و بهبود امنیت با ذخیره کردن گزارش ها دور از سرورهای تولیدی را فراهم می کند.

در مورد امنیت صحبت می کنیم، مهم است که به اطلاعات حساس در گزارش های خود توجه داشته باشید. از ثبت رمز عبور، شماره کارت اعتباری یا سایر داده های حساس خودداری کنید. اگر باید چنین اطلاعاتی را برای اهداف اشکال‌زدایی وارد کنید، مطمئن شوید که آن‌ها را به طور مناسب پنهان کنید.

در اینجا یک مثال ساده از نحوه پنهان کردن اطلاعات حساس آورده شده است:

public class SensitiveDataMasker {
    public static String maskCreditCard(String creditCardNumber) {
        if (creditCardNumber == null || creditCardNumber.length() < 4) {
            return creditCardNumber;
        }
        String lastFourDigits = creditCardNumber.substring(creditCardNumber.length() - 4);
        return "XXXX-XXXX-XXXX-" + lastFourDigits;
    }
}

// Usage
logger.info("Processing payment for card: {}", SensitiveDataMasker.maskCreditCard(cardNumber));
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یکی دیگر از جنبه های مهم ثبت گزارش، رسیدگی به استثناها است. هنگام ثبت استثنائات، بسیار مهم است که ردیابی پشته کامل را نیز لحاظ کنید. این اطلاعات ارزشمندی را برای اشکال زدایی فراهم می کند. در اینجا نحوه ثبت یک استثنا آورده شده است:

try {
    // Some operation that might throw an exception
} catch (Exception e) {
    logger.error("An error occurred while processing the request", e);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

روش logger.error به طور خودکار شامل ردیابی کامل پشته استثنا می شود.

همانطور که برنامه شما تکامل می یابد، استراتژی ورود به سیستم شما نیز باید توسعه یابد. به طور منظم گزارش های خود را بررسی کنید تا مطمئن شوید که اطلاعات مورد نیاز شما را ارائه می دهند. آیا مناطقی از برنامه وجود دارد که ثبت جزئیات بیشتر در آنها مفید باشد؟ آیا مکان هایی وجود دارد که در آن بیش از حد لاگ می کنید و نویز ایجاد می کنید که اطلاعات مهم را پنهان می کند؟

به یاد داشته باشید، هدف از ورود به سیستم این است که رفتار برنامه شما را مشاهده کنید. لاگ های خوب باید داستانی را بیان کنند و به شما این امکان را بدهند که بفهمید چه اتفاقی افتاده است، چه زمانی اتفاق افتاده است و چرا اتفاق افتاده است.

در نتیجه، ورود موثر یک مهارت حیاتی برای هر توسعه دهنده جاوا است. با انتخاب چارچوب لاگ مناسب، استفاده از سطوح لاگ مناسب، پیاده‌سازی گزارش‌دهی ساختاریافته و آگاه از زمینه، مدیریت عملکرد و نگرانی‌های امنیتی، و راه‌اندازی گزارش‌گیری متمرکز، می‌توانید توانایی خود را در نظارت و عیب‌یابی برنامه‌های جاوا به میزان قابل توجهی بهبود بخشید.

گزارش‌گیری ممکن است هیجان‌انگیزترین بخش توسعه نرم‌افزار نباشد، اما وقتی مشکلاتی در تولید ایجاد می‌شود، برای هر بیانیه گزارشی که به خوبی قرار داده شده است سپاسگزار خواهید بود. بنابراین برای پیاده سازی شیوه های ثبت خوب در برنامه های جاوا خود وقت بگذارید. خود آینده شما (و تیم عملیات شما) از شما تشکر خواهند کرد.


101 کتاب

101 کتاب یک شرکت انتشاراتی مبتنی بر هوش مصنوعی است که توسط نویسنده مشترک تأسیس شده است آراو جوشی. با استفاده از فناوری پیشرفته هوش مصنوعی، هزینه‌های انتشارات خود را بسیار پایین نگه می‌داریم—بعضی کتاب‌ها قیمت پایینی دارند. 4 دلار– در دسترس قرار دادن دانش با کیفیت برای همه.

کتاب ما را بررسی کنید کد پاک گلانگ در آمازون موجود است.

منتظر به روز رسانی ها و اخبار هیجان انگیز باشید. هنگام خرید کتاب، جستجو کنید آراو جوشی برای یافتن عناوین بیشتر ما برای لذت بردن از لینک ارائه شده استفاده کنید تخفیف های ویژه!

مخلوقات ما

حتماً خلاقیت های ما را بررسی کنید:

مرکز سرمایه گذار | سرمایه گذار اسپانیایی مرکزی | سرمایه گذار آلمان مرکزی | زندگی هوشمند | دوره ها و پژواک ها | اسرار گیج کننده | هندوتوا | Elite Dev | مدارس JS


ما در حالت متوسط ​​هستیم

بینش کوآلای فنی | دوران و پژواک جهان | سرمایه گذار مرکزی متوسط | رازهای گیج کننده رسانه | رسانه علم و عصر | هندوتوای مدرن

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا