Spring Boot-Protokollierung

Die Protokollierung ist ein wichtiger Bestandteil aller Anwendungen und kommt nicht nur uns, den Entwicklern, sondern auch den Benutzern und Betreuern des Systems zugute. Spring Boot-Anwendungen müssen relevante Protokolldaten erfassen, damit wir Probleme diagnostizieren und beheben und die Geschäftsleistung messen können.

Das Spring Boot-Framework ist mit Logback als Standardimplementierung in seinem "kompetenten" Ansatz für das Spring Framework vorkonfiguriert. In diesem Artikel werden verschiedene Möglichkeiten zum Konfigurieren der Protokollierung in Spring Boot erläutert.

 Beispielcode

Dieser Artikel wird von einem Beispielarbeitscode  auf GitHub begleitet  .

Warum Journaling wichtig ist

Entscheidungen darüber, was und wo protokolliert werden soll, sind häufig strategisch und werden unter der Annahme getroffen, dass eine Anwendung in realen Umgebungen möglicherweise nicht richtig funktioniert. Protokolle spielen eine wichtige Rolle bei der schnellen Wiederherstellung einer Anwendung nach solchen Abstürzen und der Wiederaufnahme des normalen Betriebs.

Fehler an Integrationspunkten sichtbar machen

Die verteilte Natur heutiger Anwendungen, die mithilfe einer Microservice-Architektur erstellt wurden, führt viele Werkstücke ein. Daher können natürlich Probleme aufgrund vorübergehender Ausfälle in einem der Infrastruktursysteme auftreten.

An Integrationspunkten aufgezeichnete Ausnahmeprotokolle ermöglichen es uns, die Hauptursache einer Unterbrechung zu identifizieren und geeignete Maßnahmen zu ergreifen, um die Wiederherstellung mit minimalen Auswirkungen auf die Endbenutzererfahrung durchzuführen.

Diagnose von Funktionsfehlern im Produktionssystem

Es kann zu Kundenbeschwerden über den falschen Transaktionsbetrag kommen. Um dies zu diagnostizieren, müssen wir einen Drilldown in unseren Protokollen durchführen, um die Reihenfolge der Vorgänge aus den Anforderungsdaten zu ermitteln, wenn die API zu den Antwortdaten am Ende der Verarbeitungs-API aufgerufen wird.

Ereignisverlaufsanalyse

.  , .

, , , .

, , , , .  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);
  }
}

In diesem Artikel haben wir gesehen, wie die Protokollierung in Spring Boot verwendet und wie sie an unsere Anforderungen angepasst wird. Um die Vorteile voll nutzen zu können, müssen die Protokollierungsfunktionen des Frameworks durch robuste und standardisierte Protokollierungspraktiken in Ihren Entwicklungsteams ergänzt werden.

Diese Techniken müssen auch durch eine Kombination aus Peer-Review- und automatisierten Tools zur Codequalitätskontrolle implementiert werden. Zusammengenommen stellt dies sicher, dass wir bei Auftreten von Produktionsfehlern so viele Informationen wie möglich diagnostizieren können.

Sie finden den gesamten Quellcode, der im Artikel über  Github verwendet wird  .




All Articles