ããã¯ããªã«ãããããŠæžãããã®ïŒ
以åãFluent Bitã§è€æ°è¡ïŒMultilineïŒã®ãã°ãã¡ã€ã«ãèªããšã³ããªãæžããŸããã
Fluent Bitで、複数行のログファイルを読む - CLOVER🍀
ä»åã¯ããããFluentdã§è¡ã£ãŠã¿ãŸãã
FluentdãšMultiline
Fluentdã䜿ã£ãŠè€æ°è¡ã®ãã°ãèªãã«ã¯ã2ã€ã®æ¹æ³ãããããã§ãã
Fluentdåäœã ãšãParser Pluginã®multilineã䜿ããŸãã
multiline - Fluentd
ãµãŒãããŒãã£è£œã®ãã©ã°ã€ã³ã䜿ãå Žåã¯ãfluentd-plugin-concatã䜿ããŸãã
GitHub - fluent-plugins-nursery/fluent-plugin-concat: Fluentd Filter plugin to concatenate multiline log separated in multiple events.
ä»åããããã䜿ã£ãŠè€æ°è¡ã®ãã°ãèªãã§ã¿ãããšæããŸãã
ãã°ãåºåãããµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã¯ãFluent Bitã®æãšåããã®ïŒSpring Bootã®ããŒãžã§ã³ã ãäžããŸãïŒã䜿ããŸãã
Fluent Bitで、複数行のログファイルを読む - CLOVER🍀
以äžãããããã®æ¹æ³ã®æŠèŠãã
Parser Plugin / multiline
ãŸãã¯ãmultiline Parser Pluginã䜿ãæ¹æ³ããã
multiline - Fluentd
ä»ã®Parser Pluginãšç°ãªããTail Pluginãšçµã¿åãããŠäœ¿ãããšãæ³å®ãããŠããŸãã
Unlike other parser plugins, this plugin needs special code in input plugin e.g. handle format_firstline. So, currently, in_tail plugin works with multiline but other input plugins do not work with it.
ãã©ã¡ãŒã¿ãŒã¯2çš®é¡ã§ãformat_firstline
ãšformatN
ïŒNã¯æ°åïŒã§ãã
å°ãªããšããformat1
ã¯å¿
é ã«ãªããŸãã1以éã®formatN
ã¯ãè€æ°è¡ã§æ§æãããåãã°ããã现ãããã¿ãŒã³ããããããæã«
䜿ããŸãã
Railsã®ãã°ã®äŸãããã®æŽ»çšäŸã«ãªã£ãŠããŸãã
multiline / Rails Log
format_firstline
ã¯ãè€æ°è¡ã®éå§ãè¡šãæ£èŠè¡šçŸãã¿ãŒã³ãæå®ããŸããããã©ã«ãã¯nil
ã§ãæå®ããå Žåã¯ãã®ãã¿ãŒã³ã«
ãããããªãè¡ããããã¡ã«æºããŠããããã«ãªããŸãã
å床format_firstline
ã«ãããããè¡ãæ¥ããããã®çŽåãŸã§ãã²ãšã€ã®ãã°ã¬ã³ãŒããšããŠæ±ãããããšã«ãªããŸãããšã
Javaã®ã¹ã¿ãã¯ãã¬ãŒã¹ã®äŸããformat_firstline
ãšformat1
ã ããæå®ããŠã²ãšã€ã«ãŸãšããäŸãšããŠã¯ããããããã§ããã
ãããããã¥ã¡ã³ãã«èšèŒãããŠããŸãã
multiline / Java Stacktrace Log
ãœãŒã¹ã³ãŒãã§èŠããšã確ãã«Tail Pluginãmultilineãå®å
šæèããæ§æã«ãªã£ãŠããŸããã
https://github.com/fluent/fluentd/blob/v1.11.2/lib/fluent/plugin/in_tail.rb#L519-L556
ãŸããMultiline Pluginã®ããŒã¹åŠçãã®ãã®ã«ã¯format_firstline
ã®æ¹ã¯åºãŠããªãããã§ããformat_firstline
ãæèããŠããã®ã¯ã
ãããŸã§Tail Pluginã®ããã§ããã
https://github.com/fluent/fluentd/blob/v1.11.2/lib/fluent/plugin/parser_multiline.rb#L76-L100
ã€ãŸããformatN
ã®ã¿ã䜿ã£ãå Žåã¯è€æ°è¡ãã°ã®è¡æ°ãæ³å®ã§ããããšã«ãªããŸãããšã
fluent-plugin-concat
ç¶ããŠãfluent-plugin-concatã§ãããã¡ãã¯Filter PluginãšããŠäœ¿ããè€æ°ã®ã€ãã³ãã«åå²ããããã°ãçµåããããã®ãã®ã§ãã
GitHub - fluent-plugins-nursery/fluent-plugin-concat: Fluentd Filter plugin to concatenate multiline log separated in multiple events.
è€æ°è¡ã®æå®æ¹æ³ã¯ããã€ããããn_lines
ãmultiline_start_regexp
ãmultiline_end_regexp
ãcontinuous_line_regexp
ã
ãããŸããn_lines
ãšä»ã®èšå®ã«ã¯ãæä»ã®é¢ä¿ããããŸãã
ããããæå³ã¯ãããããã§ãããn_lines
ãè€æ°è¡ãã©ãã ãç¶ãããä»ã¯è€æ°è¡ã®éå§ãçµäºãç¶ç¶ãè¡šãæ£èŠè¡šçŸã
æå®ãããšãã£ãæãã§ããã
䜿ãæ¹ãæžãããŠããŸãããç¹ã«DockerãšKubernetesããšãŠããã£ããæžãããŠããŸãããããã§ãã䜿ããããã§ããããâŠã
Usage
ãã®Filter Pluginãè€æ°ã®ã¿ã°ã«ãããããå Žåããã°ãæ··ãã£ããããã®ã§ã¯ïŒãšæã£ãã®ã§ãããããã©ã«ãã§ã¿ã°ããšã«
ã¹ããªãŒã ã®ç®¡çãåãããŠããããã§ãã
https://github.com/fluent-plugins-nursery/fluent-plugin-concat/blob/v2.4.0/lib/fluent/plugin/filter_concat.rb#L177-L188
ããã«çŽ°ããã¹ããªãŒã ã®åäœãæå®ãããå Žåã¯ãstream_identity_key
ã§ã¬ã³ãŒãå
ã§ã©ã®ããŒãã¹ããªãŒã ã®åäœãšããŠ
æ±ãããæå®ããŸãã
説æã¯ãããããã«ããŠãå®éã«äœ¿ã£ãŠã¿ãŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã§ãã
$ td-agent --version
td-agent 1.11.2
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.1 LTS
Release: 20.04
Codename: focal
$ uname -srvmpio
Linux 5.4.0-65-generic #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³
ãŸãã¯ããã°ãèªã¿èŸŒã察象ãšãªããµã³ãã«ã¢ããªã±ãŒã·ã§ã³ãçšæããŸããSpring Bootã§ãç°¡åã«äœæã
JavaãšMavenã®ããŒãžã§ã³ã
$ java --version
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)
$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.9.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-64-generic", arch: "amd64", family: "unix"
`pom.xml
xml version="1.0" encoding="UTF-8"
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance"
xsischemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.littlewings</groupId>
<artifactId>simple-logging-web-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<projectbuildsourceEncoding>UTF-8</projectbuildsourceEncoding>
<projectreportingoutputEncoding>UTF-8</projectreportingoutputEncoding>
<mavencompilersource>11</mavencompilersource>
<mavencompilertarget>11</mavencompilertarget>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
ãã°ãåºåããã ãã®ã@RestController
ã
src/main/java/org/littlewings/spring/example/App.java
package org.littlewings.spring.example;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
@RequestMapping("app")
public class App {
Logger logger = LoggerFactory.getLogger(App.class);
public static void main(String... args) {
SpringApplication.run(App.class, args);
}
@GetMapping("info")
public String info() {
logger.info("{}, info logging", "hello");
return "info logging";
}
@GetMapping("warn")
public String warn() {
logger.warn("{}, warn logging", "world");
return "warn logging";
}
@GetMapping("error")
public String error() {
logger.error("{}, error logging", "oops!!");
return "error logging";
}
@GetMapping("exception")
public String exception() {
Exception e = new RuntimeException("Oops!!");
logger.error("exception occurred, {}", "why?", e);
return "exception logging";
}
}
ããã±ãŒãžã³ã°ããŠ
$ mvn package
èµ·åãããã§ã/tmp/spring.log
ã«ãã°ãåºåãããŸãã
$ java -Dlogging.file.path=/tmp -jar target/simple-logging-web-app.jar
確èªã
$ curl localhost:8080/app/info
info logging
$ curl localhost:8080/app/error
error logging
$ curl localhost:8080/app/exception
exception logging
ãã°ã¯ãããªæãã«åºåãããŸãã
2021-01-27 14:28:14.969 INFO 1263 --- [http-nio-8080-exec-1] org.littlewings.spring.example.App : hello, info logging
2021-01-27 14:28:16.503 ERROR 1263 --- [http-nio-8080-exec-3] org.littlewings.spring.example.App : oops!!, error logging
2021-01-27 14:28:17.895 ERROR 1263 --- [http-nio-8080-exec-2] org.littlewings.spring.example.App : exception occurred, why?
java.lang.RuntimeException: Oops!!
at org.littlewings.spring.example.App.exception(App.java:44) ~[classes!/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar!/:4.0.FR]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar!/:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
ããã§ãæºåå®äºã§ããã§ã¯ãFluentdã®èšå®ãè¡ã£ãŠãããŸãããã
Parser Plugin / multilineã§è€æ°è¡ã®ãã°ãã¡ã€ã«ãèªã
ãŸãã¯ãmultilineã䜿ããã¿ãŒã³ã§ãã
multiline - Fluentd
èšå®ã¯ããããªæãã§è¡ããŸããã
/etc/td-agent/td-agent.conf
<source>
@type tail
@id app_log_tail
<parse>
@type multiline
format_firstline /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}/
format1 /^(?<log>(?<time>\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}).+)/
</parse>
path /tmp/spring.log
pos_file /var/log/td-agent/app.log.pos
tag app.log
</source>
<match app.**>
@type stdout
@id output_stdout
</match>
Tail Pluginã§ããã°ãã¡ã€ã«ãèªã¿ç¶ããŸãããã®æã«ãParser PluginãšããŠmultiline
ãæå®ããŸãã
<parse>
@type multiline
format_firstline /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}/
format1 /^(?<log>(?<time>\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}).+)/
</parse>
ã¢ããªã±ãŒã·ã§ã³ãã°ã®æ¥æã®éšåãéå§è¡ãšããŠå®çŸ©ããŠãããŸãã
ãŸããtime
ããã¿ãŒã³ãšããŠæå®ããŠããŸãããtime_key
ã®ããã©ã«ãã¯time
ãããã®ã§ããã¡ãã«åãããŠãããŸããã
Config: Parse Section / Parse Parameters
ãã以äžã®ããŒã¹ã¯ä»åã¯è¡ããŸããã
åºåå
ã¯ãStdout PluginâŠã€ãŸããFluentdèªèº«ã®ãã°ãã¡ã€ã«ã«ããŸãã
<match app.**>
@type stdout
@id output_stdout
</match>
èšå®ããããFluentdãåèµ·åã
$ sudo systemctl restart td-agent
ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŠã¿ãŸãã
â»æ£ç¢ºã«ã¯ããã®ããšãã1åã¢ã¯ã»ã¹ããªããšæåŸã®ãªã¯ãšã¹ãã®ãã°ã¯æžãåºãããŸããã
$ curl localhost:8080/app/info
$ curl localhost:8080/app/error
$ curl localhost:8080/app/exception
$ curl localhost:8080/app/warn
Fluentdã®ãã°ãèŠãŸãã
/var/log/td-agent/td-agent.log
2021-01-27 14:39:43.891000000 +0000 app.log: {"log":"2021-01-27 14:39:43.891 INFO 1263 --- [http-nio-8080-exec-5] org.littlewings.spring.example.App : hello, info logging"}
2021-01-27 14:39:46.925000000 +0000 app.log: {"log":"2021-01-27 14:39:46.925 ERROR 1263 --- [http-nio-8080-exec-6] org.littlewings.spring.example.App : oops!!, error logging"}
2021-01-27 14:40:14.398000000 +0000 app.log: {"log":"2021-01-27 14:40:14.398 ERROR 1263 --- [http-nio-8080-exec-7] org.littlewings.spring.example.App : exception occurred, why?\n\njava.lang.RuntimeException: Oops!!\n\tat org.littlewings.spring.example.App.exception(App.java:44) ~[classes!/:na]\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar!/:4.0.FR]\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar!/:4.0.FR]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]\n"}
2021-01-27 14:40:20.487000000 +0000 app.log: {"log":"2021-01-27 14:40:20.487 WARN 1263 --- [http-nio-8080-exec-8] org.littlewings.spring.example.App : world, warn logging"}
ã¹ã¿ãã¯ãã¬ãŒã¹ããŸãšãŸã£ãè¡ã«ãªã£ãŠããããšãããããŸããã
ã¡ãªã¿ã«ãtime_key
ã§æå®ãããŠãããã£ãŒã«ãïŒä»åã¯ããã©ã«ãã®time
ïŒãæ®ãã«ã¯ãkeep_time_key
ãtrue
ã«
èšå®ããŸãã
<parse>
@type multiline
format_firstline /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}/
format1 /^(?<log>(?<time>\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}).+)/
keep_time_key true
</parse>
確èªã
2021-01-27 14:45:26.306000000 +0000 app.log: {"log":"2021-01-27 14:45:26.306 INFO 1263 --- [http-nio-8080-exec-10] org.littlewings.spring.example.App : hello, info logging","time":"2021-01-27 14:45:26.306"}
fluent-plugin-concat
次ã¯ãfluent-plugin-concatã䜿ããŸãã
GitHub - fluent-plugins-nursery/fluent-plugin-concat: Fluentd Filter plugin to concatenate multiline log separated in multiple events.
ãã¡ãã¯ãµãŒãããŒãã£è£œã®ãã©ã°ã€ã³ã«ãªãã®ã§ãã€ã³ã¹ããŒã«ãå¿
èŠã§ãããã¡ãã®ããã¥ã¡ã³ãã«èšèŒãããŠãã
ãã©ã°ã€ã³ã®ã€ã³ã¹ããŒã«ã³ãã³ãã確èªããã
Plugin Management - Fluentd
ã€ã³ã¹ããŒã«ããŸãã
$ sudo td-agent-gem install fluent-plugin-concat
Fetching fluent-plugin-concat-2.4.0.gem
Successfully installed fluent-plugin-concat-2.4.0
Parsing documentation for fluent-plugin-concat-2.4.0
Installing ri documentation for fluent-plugin-concat-2.4.0
Done installing documentation for fluent-plugin-concat after 0 seconds
1 gem installed
ä»åã¯2.4.0ãã€ã³ã¹ããŒã«ãããŸããã
ã€ã³ã¹ããŒã«ãããå Žæã¯ããã¡ãã
$ ll /opt/td-agent/lib/ruby/gems/2.7.0/gems/fluent-plugin-concat-2.4.0
total 56
drwxr-xr-x 4 root root 4096 Jan 25 15:13 ./
drwxr-xr-x 131 root root 4096 Jan 25 15:13 ../
-rw-r--r-- 1 root root 0 Jan 25 15:13 Appraisals
-rw-r--r-- 1 root root 1047 Jan 25 15:13 fluent-plugin-concat.gemspec
-rw-r--r-- 1 root root 105 Jan 25 15:13 Gemfile
drwxr-xr-x 2 root root 4096 Jan 25 15:13 .github/
-rw-r--r-- 1 root root 53 Jan 25 15:13 .gitignore
drwxr-xr-x 3 root root 4096 Jan 25 15:13 lib/
-rw-r--r-- 1 root root 1072 Jan 25 15:13 LICENSE.txt
-rw-r--r-- 1 root root 762 Jan 25 15:13 NEWS.md
-rw-r--r-- 1 root root 219 Jan 25 15:13 Rakefile
-rw-r--r-- 1 root root 4718 Jan 25 15:13 README.md
-rw-r--r-- 1 root root 1153 Jan 25 15:13 .rubocop.yml
-rw-r--r-- 1 root root 970 Jan 25 15:13 .travis.yml
ã§ã¯ãèšå®ããŸãã
/etc/td-agent/td-agent.conf
<source>
@type tail
@id app_log_tail
<parse>
@type regexp
expression /(?<log>.*)/
</parse>
path /tmp/spring.log
pos_file /var/log/td-agent/app.log.pos
tag app.log
</source>
<filter app.**>
@type concat
key log
multiline_start_regexp /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}/
</filter>
<filter app.**>
@type parser
key_name log
<parse>
@type regexp
expression /^(?<log>(?<time>\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}).+)/m
keep_time_key true
</parse>
</filter>
<match app.**>
@type stdout
@id output_stdout
</match>
è€æ°è¡ã®ãã°ãã¡ã€ã«ã¯fluent-plugin-concatã§çµåãããã®ã§ãTail Pluginã¯ãªã«ãèããã«1è¡ãã€ãã°ã¬ã³ãŒããšããŠ
èªã¿åãããã«èšå®ããŸãã
<source>
@type tail
@id app_log_tail
<parse>
@type regexp
expression /(?<log>.*)/
</parse>
path /tmp/spring.log
pos_file /var/log/td-agent/app.log.pos
tag app.log
</source>
Tail Pluginã§èªã¿åã£ããã°ã¯ãfluent-plugin-concatã§çµåãããŸããå
ã»ã©ã®multilineã®æãšåæ§ã«ãæ¥æã®ãã¿ãŒã³ã
ãã°ã®éå§ãã¿ãŒã³ãšããŠå®çŸ©ããŸããã
<filter app.**>
@type concat
key log
multiline_start_regexp /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}/
</filter>
ããšã¯ãªãã±ã§ãtime_key
ïŒtime
ãã£ãŒã«ãïŒãæãåºãããã«ãregex Parser Pluginãä»ããŠããŸãã
ä»åã¯æåããkeep_time_key
ã¯true
ã«ããŠããŸãã
<filter app.**>
@type parser
key_name log
<parse>
@type regexp
expression /^(?<log>(?<time>\d{4}-\d\d-\d\d \d\d:\d\d:\d\d.\d{3}).+)/m
keep_time_key true
</parse>
</filter>
èšå®ããããFluentdãåèµ·åããŠ
$ sudo systemctl restart td-agent
ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŠã¿ãŸãã
â»ãã£ã±ãããã®ããšã«ãã1åãªã¯ãšã¹ããã€ããŠããŸã
$ curl localhost:8080/app/info
$ curl localhost:8080/app/error
$ curl localhost:8080/app/exception
$ curl localhost:8080/app/warn
Fluentdã®ãã°ã確èªã
/var/log/td-agent/td-agent.log
2021-01-27 14:59:28.464000000 +0000 app.log: {"log":"2021-01-27 14:59:28.464 INFO 1263 --- [http-nio-8080-exec-4] org.littlewings.spring.example.App : hello, info logging","time":"2021-01-27 14:59:28.464"}
2021-01-27 14:59:30.036000000 +0000 app.log: {"log":"2021-01-27 14:59:30.036 ERROR 1263 --- [http-nio-8080-exec-2] org.littlewings.spring.example.App : oops!!, error logging","time":"2021-01-27 14:59:30.036"}
2021-01-27 14:59:34.503000000 +0000 app.log: {"log":"2021-01-27 14:59:34.503 ERROR 1263 --- [http-nio-8080-exec-6] org.littlewings.spring.example.App : exception occurred, why?\n\njava.lang.RuntimeException: Oops!!\n\tat org.littlewings.spring.example.App.exception(App.java:44) ~[classes!/:na]\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar!/:4.0.FR]\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.3.jar!/:5.3.3]\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar!/:4.0.FR]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]\n\tat java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]\n","time":"2021-01-27 14:59:34.503"}
2021-01-27 14:59:36.987000000 +0000 app.log: {"log":"2021-01-27 14:59:36.987 WARN 1263 --- [http-nio-8080-exec-7] org.littlewings.spring.example.App : world, warn logging","time":"2021-01-27 14:59:36.987"}
ã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãã ãã°ãçµåãããŠããŸãããOKã§ããã
ãŸãšã
Fluentdã䜿ã£ãŠãè€æ°è¡ã®ãã°ãèªãæ¹æ³ã2ã€è©ŠããŠã¿ãŸããã
multilineã®èšå®ã£ãŠã1åè©ŠããåŸã«æéã空ããšããå¿ããŠããŸãã®ã§ããâŠãããã£ãŠã¡ã¢ããŠããã®ãè¯ãã®ã§ãããâŠã
ãã£ãšããŸãæãåºãããã«èŠãããšã«ãªãã§ãããã