SpringBootロギング

ロギングはすべてのアプリケーションの重要な部分であり、私たち、開発者だけでなく、システムのユーザーとメンテナにもメリットがあります。Spring Bootアプリケーションは、関連するログデータを収集して、問題の診断と修正、およびビジネスパフォーマンスの測定に役立てる必要があります。

Spring Bootフレームワークは、SpringFrameworkへの「有能な」アプローチのデフォルト実装としてLogbackを使用して事前構成されています。 この記事では、SpringBootでロギングを構成するさまざまな方法について説明します。

 サンプルコード

この記事には、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でロギングを使用する方法と、要件に従ってログを構成する方法について説明しました。ただし、この利点を最大限に活用するには、フレームワークのロギング機能を、開発チーム全体で堅牢で標準化されたロギング手法で補完する必要があります。

これらの手法は、ピアレビューと自動化されたコード品質管理ツールを組み合わせて実装する必要もあります。これらを総合すると、生産エラーが発生した場合に、診断するために可能な限り多くの情報を確実に入手できます。

Githubの記事で使用されているすべてのソースコードを見つけることができます  。




All Articles