مرحبا عزيزي خابروفيتس.
المواد المعروضة في المقالة مخصصة للمبتدئين ، وربما ستوفر لي عدة ساعات من البحث في StackOverFlow والمواقع الأخرى من أجل الحصول على نظام تسجيل مناسب يفهم نفسه مكان تسجيل الدخول - إلى وحدة التحكم أو الملف أو خندق السجل.
في بداية المشروع ، تنشأ المهمة دائمًا عن تكوين التسجيل بشكل صحيح ، بينما في البيئة المحلية يجب عرض السجلات في وحدة التحكم وفي الملف من أجل الراحة أثناء التصحيح ، ومن غير المرغوب فيه للغاية إخراج السجلات إلى وحدة التحكم على الخادم البعيد ، ولكن بدلاً من ذلك يجب كتابتها إلى الملف ، logstash أو في قاعدة البيانات. وإذا كان لديك Windows محليًا وعلى جهاز Linux بعيد ، فسيختلف عنوان موقع ملف السجل هذا.
وبالتالي ، هناك العديد من المواقف التي تحتاج فيها إلى تصحيح تكوين نظام التسجيل باستمرار بيديك ، اعتمادًا على الظروف الخارجية.
لقد سئمت من التذكر باستمرار والتعليق على المُلحقين ، وقمت بتطوير طريقة لتكوين Log4j2 بحيث يتم تشغيل المُلحقين الصحيحين تلقائيًا وفقًا لملف تعريف Maven المحدد.
فيما يلي تعليمات لإعداد مشروع باستخدام Spring Boot + Maven + Log4j2 ، وستكون نتيجة ذلك نظام تسجيل مهيأ واثنين من أدوات الإضافة: CONSOLE و SOCKET.
بادئ ذي بدء ، سنقوم بإجراء تغييرات على تكوين Maven (pom.xml):
في المتغيرات على مستوى pom.xml بأكمله ، أضف عنوان المضيف لملحق logstash:
<properties> <logstash.host>logstashcsm.example.ru</logstash.host> </properties>
أضف التبعيات اللازمة للعمل:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies>
لاحظ أننا نستبعد تبعية تسجيل دخول نظام بدء التشغيل الربيعي من شبكة تشغيل نظام التشغيل الربيعي.
قم بإعداد ملفات تعريف Maven لإدارة المتلقين المتصلين ديناميكيًا. على مستوى كل ملف تعريف ، قمنا بتعيين المتغيرات logstash.port, logger.console.tresholdFilter, logger.socket.tresholdFilter
.
<profiles> <profile> <id>local</id> <properties> <logstash.port>10000</logstash.port> <logger.console.tresholdFilter>ALL</logger.console.tresholdFilter> <logger.socket.tresholdFilter>OFF</logger.socket.tresholdFilter> </properties> </profile> <profile> <id>dev</id> <properties> <logstash.port>10001</logstash.port> <logger.console.tresholdFilter>OFF</logger.console.tresholdFilter> <logger.socket.tresholdFilter>ALL</logger.socket.tresholdFilter> </properties> </profile> </profiles>
logstash.port - المنفذ الذي يجب إرسال السجلات إليه.
logger.console.tresholdFilter - تقوم القيمة بتعيين مستوى التصفية للسجلات المعروضة على وحدة التحكم. في حالتنا ، يعني ALL أن سجلات السجل لجميع المستويات سيتم عرضها في ملحق وحدة التحكم.
logger.socket.tresholdFilter - تقوم القيمة بتعيين مستوى التصفية للسجلات التي يتم إرسالها إلى ملف تعريف السجلات. إيقاف - يعني أنه لن تمر أية سجلات مرسلة إلى هذا المُلحق.
نحتاج الآن إلى إجراء تغييرات على خصائص application.properties بحيث يمكننا من ملف Log4j2.xml الوصول إلى قيمة المتغيرات المحددة في pom.xml:
logstash.host=@logstash.host@
logstash.port=@logstash.port@
logger.console.tresholdFilter=@logger.console.tresholdFilter@
logger.socket.tresholdFilter=@logger.socket.tresholdFilter@
وأخيرًا ، قمنا بتكوين تكوين Log4j2 نفسه في ملف log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <Property name="socket.host">${bundle:application:logstash.host}</Property> <Property name="socket.port">${bundle:application:logstash.port}</Property> <Property name="console.thresholdFilter">${bundle:application:logger.console.tresholdFilter}</Property> <Property name="socket.thresholdFilter">${bundle:application:logger.socket.tresholdFilter}</Property> </Properties> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <ThresholdFilter level="${console.thresholdFilter}"/> <PatternLayout pattern="%d %-5p [%t] %c{10} - %m%n"/> </Console> <Socket name="SOCKET" host="${socket.host}" port="${socket.port}" immediateFlush="true"> <ThresholdFilter level="${socket.thresholdFilter}"/> <JSONLayout eventEol="true" compact="true"/> </Socket> <Async name="ASYNC"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="SOCKET"/> </Async> </Appenders> <Loggers> <Logger name="ru.example" level="debug" additivity="false"> <AppenderRef ref="ASYNC"/> </Logger> <Root level="error"> <AppenderRef ref="ASYNC"/> </Root> </Loggers> </Configuration>
الآن ، لاستدعاء المسجل في صفك ، تحتاج إلى إنشاء مثيل منه:
private static Logger logger = LoggerFactory.getLogger(YourClass.class);
والتفت إليه:
logger.info(" ");
هذا كل شيء. سيعمل التسجيل الآن مع مراعاة ملف تعريف Maven النشط في المشروع.
يرجى ملاحظة أنه في قائمة ملف log4j2.xml
، يتم ru.example
اثنين من أجهزة التسجيل - ru.example
و root
، ولديهما مستويات مختلفة من تسجيل الأحداث. ستعمل الأولى على جميع الأحداث التي تم إنشاؤها بواسطة الفئات من ru.example.*
كل شيء من مستوى DEBUG ، ru.example.*
مسجل root
الأحداث من جميع الفئات على الإطلاق ، ولكن من مستوى الخطأ.
في نفس الوقت ، بحيث لا يتم تكرار الإدخالات في السجلات ، يتم استخدام الإعداد additivity="false"
.