JavaRush /وبلاگ جاوا /Random-FA /چرا ورود به سیستم مورد نیاز است؟

چرا ورود به سیستم مورد نیاز است؟

در گروه منتشر شد
سلام! هنگام نوشتن سخنرانی، به ویژه توجه می کنم که آیا موضوع خاصی قطعاً در کار واقعی استفاده می شود یا خیر. چرا به ورود به سیستم نیاز دارید - 1 بنابراین، توجه! موضوعی که امروز به آن خواهیم پرداخت قطعا از روز اول کار در تمامی پروژه هایتان برای شما مفید خواهد بود. ما در مورد ورود به سیستم صحبت خواهیم کرد. این موضوع اصلا سخت نیست (حتی می گویم آسان). اما در اولین کار شما استرس کافی برای مقابله با چیزهای بدیهی وجود دارد، بنابراین بهتر است اکنون آن را کاملاً مرتب کنید :) بنابراین، بیایید شروع کنیم. ورود به سیستم چیست؟ Logging عبارت است از ثبت اطلاعاتی در مورد عملکرد یک برنامه. مکانی که این داده ها در آن نوشته می شود " log " نامیده می شود. دو سوال به طور همزمان مطرح می شود: کجا و چه داده هایی ثبت می شود؟ بیایید با "کجا" شروع کنیم. می توانید داده های عملیات برنامه را در مکان های مختلف ضبط کنید. به عنوان مثال، در طول مطالعات خود اغلب داده ها را با استفاده از System.out.println(). این ثبت واقعی است، هرچند ساده ترین. البته، این برای مشتری یا تیم پشتیبانی محصول خیلی راحت نیست: آنها بدیهی است که نمی خواهند IDE را نصب کنند و کنسول را نظارت کنند :) همچنین یک قالب آشناتر برای ضبط اطلاعات - در یک فایل متنی وجود دارد. خواندن آنها به این شکل برای مردم بسیار ساده تر است، و مطمئناً ذخیره کردن آنها بسیار آسان تر است! حالا سوال دوم: چه اطلاعاتی در مورد عملکرد برنامه باید در لاگ ثبت شود؟ اما اینجا همه چیز به شما بستگی دارد! سیستم لاگ جاوا بسیار منعطف است. شما می توانید آن را به گونه ای پیکربندی کنید که کل پیشرفت برنامه شما ثبت شود. از یک طرف این خوب است. اما از سوی دیگر، تصور کنید اگر همه چیز در آنجا نوشته شود، لاگ های فیسبوک یا توییتر به چه اندازه ای می رسند. چنین شرکت های بزرگی احتمالاً توانایی ذخیره این حجم از اطلاعات را دارند. اما تصور کنید جست‌وجوی اطلاعات مربوط به یک خطای مهم در گزارش‌های ۵۰۰ گیگابایتی متن چقدر دشوار خواهد بود؟ حتی بدتر از سوزن در انبار کاه است. بنابراین، ورود به جاوا را می توان به گونه ای پیکربندی کرد که فقط داده های خطا در گزارش (log) نوشته شود. یا حتی فقط در مورد خطاهای بحرانی! اگرچه گفتن "ورود به جاوا" کاملاً صحیح نیست. واقعیت این است که نیاز به لاگ در بین برنامه نویسان قبل از اضافه شدن این قابلیت به زبان ایجاد شد. و زمانی که جاوا کتابخانه لاگ خود را داشت، همه از کتابخانه log4j استفاده می کردند. تاریخچه ظاهر ورود به سیستم جاوا در واقع بسیار طولانی و آموزنده است؛ در اوقات فراغت خود می توانید این پست را در Habré بخوانید . به طور خلاصه، جاوا کتابخانه لاگ مخصوص به خود را دارد، اما تقریباً هیچ کس از آن استفاده نمی کند :) بعداً، وقتی چندین کتابخانه گزارش گیری مختلف ظاهر شد و همه برنامه نویسان شروع به استفاده از موارد مختلف کردند، یک مشکل سازگاری ایجاد شد. برای جلوگیری از انجام یک کار مشابه با استفاده از ده ها کتابخانه مختلف با رابط های مختلف، چارچوب انتزاعی slf4j ایجاد شد.("نمایش ثبت خدمات برای جاوا"). انتزاعی نامیده می‌شود، زیرا اگرچه از کلاس‌های slf4j استفاده می‌کنید و متدهای آن‌ها را فراخوانی می‌کنید، اما در زیر هود آن‌ها همه چارچوب‌های گزارش‌گیری قبلی در حال اجرا هستند: log4j، استاندارد java.util.logging و موارد دیگر. اگر در حال حاضر به ویژگی خاصی از log4j نیاز دارید که کتابخانه‌های دیگر ندارند، اما نمی‌خواهید پروژه را به این کتابخانه خاص پیوند دهید، فقط از slf4j استفاده کنید. و او قبلاً متدهای log4j را "کشش" خواهد کرد. اگر نظر خود را تغییر دادید و تصمیم گرفتید که دیگر به ویژگی های log4j نیازی ندارید، فقط باید "wrapper" (یعنی slf4j) را مجدداً پیکربندی کنید تا از کتابخانه دیگری استفاده کنید. کد شما کار نمی کند، زیرا در آن شما متدهای slf4j را فراخوانی می کنید، نه یک کتابخانه خاص. یک انحراف کوچک. برای اینکه مثال‌های زیر کار کنند، باید کتابخانه slf4j را از اینجا و کتابخانه log4j را از اینجا دانلود کنید . در مرحله بعد، باید آرشیو را باز کنیم و فایل‌های jar را که نیاز داریم از طریق Intellij IDEA به classpath اضافه کنیم. آیتم های منو: فایل -> ساختار پروژه -> کتابخانه ها شیشه های لازم را انتخاب کرده و به پروژه اضافه کنید (در بایگانی هایی که دانلود کرده ایم شیشه های زیادی وجود دارد، به مواردی که در تصاویر نیاز دارید نگاه کنید) چرا به ورود به سیستم نیاز دارید - 2چرا به ورود به سیستم نیاز دارید - 3توجه داشته باشید - این دستورالعمل برای کسانی است که دانش آموزانی که نحوه استفاده از Maven را نمی دانند. اگر می دانید چگونه از آن استفاده کنید، بهتر است سعی کنید با آن شروع کنید: معمولاً بسیار ساده تر است. اگر از Maven استفاده می کنید ، این وابستگی را اضافه کنید:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
عالی است، ما تنظیمات را مرتب کردیم :) بیایید ببینیم slf4j چگونه کار می کند. چگونه می توانیم مطمئن شویم که پیشرفت برنامه در جایی ثبت شده است؟ برای این ما به دو چیز نیاز داریم - یک لاگر و یک ضمیمه . بیایید با اولی شروع کنیم. لاگر شی ای است که به طور کامل نگهداری سوابق را مدیریت می کند . ایجاد یک لاگر بسیار آسان است: با استفاده از روش ایستا انجام می شود - LoggerFactory.getLogger(). به عنوان پارامتر متد، باید کلاسی را ارسال کنید که کار آن ثبت شود. بیایید کد خود را اجرا کنیم:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
خروجی کنسول: ERROR StatusLogger فایل پیکربندی Log4j 2 پیدا نشد. استفاده از پیکربندی پیش‌فرض (فقط ثبت خطاها در کنسول)، یا پیکربندی‌های ارائه‌شده توسط کاربر. ویژگی سیستم "log4j2.debug" را برای نشان دادن گزارش اولیه اولیه Log4j 2 تنظیم کنید. برای دستورالعمل های مربوط به نحوه پیکربندی Log4j 2 15:49:08.907 [اصلی] خطا MyTestClass - یک خطا در برنامه رخ داده است، https://logging.apache.org/log4j/2.x/manual/configuration.html را ببینید! اینجا چه می بینیم؟ ابتدا یک پیغام خطا می بینیم. ظاهر شد زیرا در حال حاضر تنظیمات لازم را نداریم. بنابراین، لاگر ما اکنون فقط می تواند پیام های خطا (ERROR) و فقط به کنسول ارسال کند. روش logger.info()اجرا نشد. اما logger.error()کار کرد! کنسول تاریخ فعلی، روشی که در آن خطا رخ داده است ( main)، کلمه ERROR و پیام ما را نمایش می دهد! ERROR سطح ورود به سیستم است. به طور کلی، اگر یک ورودی گزارش با کلمه ERROR مشخص شده باشد، به این معنی است که در آن نقطه از برنامه خطایی رخ داده است. اگر یک ورودی با کلمه INFO مشخص شده باشد، به این معنی است که صرفاً اطلاعات جاری در مورد عملکرد عادی برنامه است. کتابخانه SLF4J دارای سطوح مختلف گزارش گیری است که به شما اجازه می دهد تا به طور انعطاف پذیری لاگ را پیکربندی کنید. مدیریت آنها بسیار آسان است: تمام منطق لازم قبلاً در کلاس گنجانده شده است Logger. فقط باید روش های لازم را فراخوانی کنید. اگر می خواهید یک پیام معمولی ارسال کنید، با شماره تماس بگیرید logger.info(). پیغام خطا - logger.error(). نمایش اخطار - logger.warn() حالا بیایید در مورد ضمیمه صحبت کنیم . ضمیمه مکانی است که داده های شما در آن قرار می گیرند. می توانید بگویید نقطه مقابل یک منبع داده "نقطه B" است. به طور پیش فرض، داده ها به کنسول خروجی می شوند. لطفاً توجه داشته باشید که در مثال قبلی مجبور نبودیم چیزی را پیکربندی کنیم: متن در خود کنسول ظاهر شد، اما لاگر از کتابخانه log4j فقط می‌تواند پیام‌های سطح ERROR را به کنسول ارسال کند. واضح است که خواندن گزارش‌ها از یک فایل متنی و ذخیره گزارش‌ها در همان فایل‌ها برای افراد راحت‌تر است. برای تغییر رفتار پیش‌فرض لاگر، باید ضمیمه فایل خود را پیکربندی کنیم . برای شروع، باید یک فایل log4j.xml درست در پوشه src ، یا در پوشه منابع، اگر از Maven استفاده می کنید، یا در پوشه منابع، در صورتی که از Maven استفاده می کنید، ایجاد کنید. شما قبلاً با فرمت xml آشنا هستید، اخیراً یک سخنرانی در مورد آن داشتیم :) محتوای آن اینگونه خواهد بود:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
خیلی پیچیده به نظر نمی رسد :) اما اجازه دهید همچنان مطالب را مرور کنیم.
<Configuration status="INFO">
این به اصطلاح Status-Logger است. مربوط به لاگر ما نیست و به صورت داخلی توسط log4j استفاده می شود. می توانید به جای status="INFO" status=”TRACE” را تنظیم کنید، و تمام اطلاعات مربوط به عملکرد داخلی log4j به کنسول خروجی می شود (status-logger داده ها را به کنسول خروجی می دهد، حتی اگر ضمیمه برنامه ما فایل باشد. -مستقر). ما اکنون به این نیاز نداریم، بنابراین همه چیز را همانطور که هست می گذاریم.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
در اینجا ما appender خود را ایجاد می کنیم. تگ <File>نشان می دهد که یک فایل خواهد بود. name="MyFileAppender"- نام ضمیمه ما. fileName="C:\Users\Username\Desktop\testlog.txt"- مسیر فایل log که در آن تمام داده ها نوشته می شود. append="true"— آیا نوشتن اطلاعات اضافی تا انتهای فایل ضروری است یا خیر. در مورد ما این چنین خواهد بود. اگر روی false تنظیم شود ، هر بار که برنامه دوباره شروع می شود، محتوای گزارش قدیمی حذف می شود. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- اینها تنظیمات قالب بندی هستند. در اینجا می توانیم از عبارات منظم برای سفارشی کردن قالب متن در گزارش خود استفاده کنیم.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
در اینجا ما سطح ورود به سیستم (سطح ریشه) را مشخص می کنیم. ما مجموعه سطح INFO را داریم: یعنی همه پیام‌های سطوح بالاتر از INFO (طبق جدولی که در بالا نگاه کردیم) در گزارش گنجانده نمی‌شوند. ما 3 پیام در برنامه خود خواهیم داشت: یک INFO، یک WARN و یک ERROR. با پیکربندی فعلی، هر 3 پیام در گزارش نوشته می شود. اگر سطح ریشه را به ERROR تغییر دهید، فقط آخرین پیام از LOGGER.error () ثبت می شود. علاوه بر این، پیوندی به ضمیمه در اینجا قرار داده شده است. برای ایجاد چنین پیوندی، باید <Root>یک تگ در داخل تگ ایجاد کنید <ApprenderRef>و پارامتر را به آن اضافه کنید ref=”Name твоего аппендера”. ما نام appender را در اینجا ایجاد کردیم، در صورتی که فراموش کردید: <File name="MyFileAppender" و این هم کد برنامه ما!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
البته، کمی کج است (گرفتن RuntimeException ایده متوسطی است)، اما برای اهداف ما عالی است :) بیایید روش خود را main()4 بار پشت سر هم اجرا کنیم و به فایل testlog.txt خود نگاه کنیم. نیازی به ایجاد آن از قبل نیست: کتابخانه این کار را به صورت خودکار انجام می دهد. همه چیز کار کرد! :) حالا شما یک لاگر پیکربندی شده دارید. می‌توانید با برخی از برنامه‌هایی که قبلا نوشته‌اید بازی کنید، تماس‌های لاگر را به همه روش‌ها اضافه کنید، و به گزارش حاصل نگاه کنید :) برای مطالعه بیشتر، من این مقاله را به شدت توصیه می‌کنم . در آنجا موضوع ورود به سیستم به طور عمیق مورد بحث قرار می گیرد و خواندن آن در یک جلسه آسان نخواهد بود. اما حاوی اطلاعات اضافی مفید زیادی است. به عنوان مثال، شما یاد خواهید گرفت که چگونه یک لاگر را پیکربندی کنید تا اگر فایل testlog.txt ما به اندازه خاصی برسد، یک فایل متنی جدید ایجاد کند :) و این پایان درس ما است! امروز در مورد یک موضوع بسیار مهم یاد گرفتید و این دانش قطعاً در کارهای آینده برای شما مفید خواهد بود. دوباره می بینمت! :)
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION