La journalisation est une partie importante de toutes les applications et profite non seulement à nous, les développeurs, mais également aux utilisateurs et aux mainteneurs du système. Les applications Spring Boot doivent collecter des données de journal pertinentes pour nous aider à diagnostiquer et à résoudre les problèmes et à mesurer les performances de l'entreprise.
Le framework Spring Boot est préconfiguré avec Logback comme implémentation par défaut dans son approche "compétente" du Framework Spring. Cet article explore différentes façons de configurer la journalisation dans Spring Boot.
Exemple de code
Cet article est accompagné d'un exemple de code de travail sur GitHub .
Pourquoi la journalisation est importante
Les décisions sur ce qu'il faut et où enregistrer sont souvent stratégiques et sont prises en supposant qu'une application pourrait ne pas fonctionner correctement dans des environnements réels. Les journaux jouent un rôle clé pour aider une application à se remettre rapidement de ces plantages et à reprendre son fonctionnement normal.
Rendre les erreurs visibles aux points d'intégration
La nature distribuée des applications d'aujourd'hui construites à l'aide d'une architecture de microservice introduit de nombreuses tâches. Ainsi, naturellement, vous pouvez rencontrer des problèmes dus à des pannes temporaires dans l'un des systèmes d'infrastructure.
Les journaux d'exceptions enregistrés aux points d'intégration nous permettent d'identifier la cause première d'une interruption et nous permettent de prendre les mesures appropriées pour récupérer avec un impact minimal sur l'expérience de l'utilisateur final.
Diagnostic des erreurs fonctionnelles dans le système de production
Des clients peuvent se plaindre d'un montant de transaction incorrect. Pour diagnostiquer cela, nous devons explorer nos journaux pour trouver la séquence d'opérations à partir des données de demande lorsque l'API est appelée vers les données de réponse à la fin de l'API de traitement.
Analyse de l'historique des événements
. , .
, , , .
, , , , . 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);
}
}
Dans cet article, nous avons vu comment utiliser la journalisation dans Spring Boot et comment la personnaliser en fonction de nos besoins. Mais pour tirer pleinement parti des avantages, les capacités de journalisation du framework doivent être complétées par des pratiques de journalisation robustes et standardisées au sein de vos équipes de développement.
Ces techniques devront également être mises en œuvre au moyen d'une combinaison d'outils d'examen par les pairs et d'outils automatisés de contrôle de la qualité du code. Ensemble, cela garantit que lorsque des erreurs de production se produisent, nous avons autant d'informations que possible à diagnostiquer.
Vous pouvez retrouver tout le code source utilisé dans l'article sur Github .