تسجيل التمهيد الربيع

يعد التسجيل جزءًا مهمًا من جميع التطبيقات والفوائد ليس فقط نحن ، المطورين ، ولكن أيضًا المستخدمين والقائمين على صيانة النظام. تحتاج تطبيقات 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, .  .

Spring Boot     .

 application.propertiesapplication.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%

, :

,

logging.file.max-size

10 Mb

logging.file.max-history

7

logging.file.total-size-cap

.  , .

logging.file.clean-history-on-start

, .

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.xmllogback-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.  .

.  Spring - .        .

Lombok

, : Lombok, Slf4j :

@Service
@Slf4j
public class UserService {
  public String getUser(final String userID) {
    log.info("Service: Fetching user with id {}", userID);
  }
}

في هذه المقالة ، رأينا كيفية استخدام التسجيل في Spring Boot وكيفية تكوينه وفقًا لمتطلباتنا. ولكن للاستفادة الكاملة من المزايا ، يجب استكمال إمكانات التسجيل في إطار العمل بممارسات تسجيل قوية وموحدة عبر فرق التطوير لديك.

ستحتاج هذه التقنيات أيضًا إلى أن يتم تنفيذها من خلال مجموعة من مراجعة الأقران وأدوات مراقبة جودة الكود الآلي. مجتمعة ، هذا يضمن أنه عند حدوث أخطاء في الإنتاج ، لدينا أكبر قدر ممكن من المعلومات لتشخيصها.

يمكنك العثور على جميع الكود المصدري المستخدم في المقالة على  جيثب  .




All Articles