يعد التسجيل جزءًا مهمًا من جميع التطبيقات والفوائد ليس فقط نحن ، المطورين ، ولكن أيضًا المستخدمين والقائمين على صيانة النظام. تحتاج تطبيقات Spring Boot إلى جمع بيانات السجل ذات الصلة لمساعدتنا في تشخيص المشكلات وإصلاحها وقياس أداء الأعمال.
تم تكوين إطار عمل Spring Boot مسبقًا باستخدام Logback باعتباره التنفيذ الافتراضي في منهجه "المختص" لإطار Spring Framework. تستكشف هذه المقالة طرقًا مختلفة لتكوين التسجيل في Spring Boot.
عينة من الرموز
هذه المقالة مصحوبة بنموذج رمز العمل على GitHub .
لماذا اليومية مهمة
غالبًا ما تكون القرارات المتعلقة بما وأين يتم تسجيل الدخول استراتيجية ويتم اتخاذها بافتراض أن التطبيق قد لا يعمل بشكل صحيح في بيئات العالم الحقيقي. تلعب السجلات دورًا رئيسيًا في مساعدة التطبيق على التعافي بسرعة من أي أعطال من هذا القبيل واستئناف التشغيل العادي.
جعل الأخطاء واضحة في نقاط التكامل
تقدم الطبيعة الموزعة لتطبيقات اليوم التي تم إنشاؤها باستخدام بنية الخدمات المصغرة العديد من أجزاء العمل. وبالتالي ، بطبيعة الحال ، يمكن أن تواجه مشاكل بسبب الأعطال المؤقتة في أي من أنظمة البنية التحتية.
تسمح لنا سجلات الاستثناء المسجلة في نقاط التكامل بتحديد السبب الجذري للانقطاع وتسمح لنا باتخاذ الإجراء المناسب للتعافي بأقل تأثير على تجربة المستخدم النهائي.
تشخيص الأخطاء الوظيفية في نظام الإنتاج
قد تكون هناك شكاوى من العملاء بشأن مبلغ المعاملة الخاطئ. لتشخيص هذا ، نحتاج إلى التعمق في سجلاتنا للعثور على تسلسل العمليات من بيانات الطلب عندما يتم استدعاء API إلى بيانات الاستجابة في نهاية معالجة API.
تحليل تاريخ الحدث
. , .
, , , .
, , , , . CI / CD.
Spring Boot
Spring Boot - Logback .
, Spring Boot. -, start.spring.io . :
@SpringBootApplication
public class SpringLoggerApplication {
static final Logger log =
LoggerFactory.getLogger(SpringLoggerApplication.class);
public static void main(String[] args) {
log.info("Before Starting application");
SpringApplication.run(SpringLoggerApplication.class, args);
log.debug("Starting my application in debug with {} args", args.length);
log.info("Starting my application with {} args.", args.length);
}
}Maven Gradle jar , :
13:21:45.673 [main] INFO io.pratik.springLogger.SpringLoggerApplication - Before Starting application
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.2.RELEASE)
.
.
.
... : Started SpringLoggerApplication in 3.054 seconds (JVM running for 3.726)
... : Starting my application 0, Spring, . .
application.properties( application.yml), .
. .
java -jar target/springLogger-0.0.1-SNAPSHOT.jar --trace, , , .
, , Spring. , log.level.<package-name>:
java \\
-jar target/springLogger-0.0.1-SNAPSHOT.jar \\
-Dlogging.level.org.springframework=ERROR \\
-Dlogging.level.io.pratik=TRACE application.properties:
logging.level.org.springframework=ERROR
logging.level.io.app=TRACE , logging.file.name logging.file.path application.properties. info.
# Output to a file named application.log.
logging.file.name=application.log# Output to a file named spring.log in path /Users
logging.file.path=/Users , logging.file.name .
, Spring 2.2 , . 2.3.2.RELEASE.
, logging.pattern.file:
# Logging pattern for file
logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%, :
| , | |
|---|---|---|
|
| 10 Mb |
|
| 7 |
| . , . |
|
|
|
, .
Spring . , off application.properties:
spring.main.banner-mode=off ANSI, spring.output.ansi.enabled. : , .
spring.output.ansi.enabled=ALWAYS spring.output.ansi.enabled DETECT. , ANSI.
Logback Spring Boot . log4j java util, spring-boot-starter-loging pom.xml:
<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>logback-spring.xml
, logback.xml logback-spring.xml XML . Spring logback-spring.xml, logback-spring.groovy .
appender configuration. encoder:
<configuration >
<include
resource="/org/springframework/boot/logging/logback/base.xml" />
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
</configuration>Logback
debug configuration true, .
<configuration debug="true">, Logback, :
...- About to instantiate appender of type [...ConsoleAppender]
...- About to instantiate appender of type [...RollingFileAppender]
..SizeAndTimeBasedRollingPolicy.. - setting totalSizeCap to 0 Bytes
..SizeAndTimeBasedRollingPolicy.. - ..limited to [10 MB] each.
..SizeAndTimeBasedRollingPolicy.. Will use gz compression
..SizeAndTimeBasedRollingPolicy..use the pattern /var/folders/
..RootLoggerAction - Setting level of ROOT logger to INFO, , .
, logback-spring.xml. , .
. Spring Boot , . , Logstash:
<appender name="LOGSTASH"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:4560</destination>
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LogstashEncoder" />
</appender> LogstashEncoder JSON localhost:4560. .
Lombok
, : Lombok, Slf4j :
@Service
@Slf4j
public class UserService {
public String getUser(final String userID) {
log.info("Service: Fetching user with id {}", userID);
}
}في هذه المقالة ، رأينا كيفية استخدام التسجيل في Spring Boot وكيفية تكوينه وفقًا لمتطلباتنا. ولكن للاستفادة الكاملة من المزايا ، يجب استكمال إمكانات التسجيل في إطار العمل بممارسات تسجيل قوية وموحدة عبر فرق التطوير لديك.
ستحتاج هذه التقنيات أيضًا إلى أن يتم تنفيذها من خلال مجموعة من مراجعة الأقران وأدوات مراقبة جودة الكود الآلي. مجتمعة ، هذا يضمن أنه عند حدوث أخطاء في الإنتاج ، لدينا أكبر قدر ممكن من المعلومات لتشخيصها.
يمكنك العثور على جميع الكود المصدري المستخدم في المقالة على جيثب .