Slide 1

Slide 1 text

ecs-logging-java つかってみた 第39回Elasticsearch勉強会 2020.12.17 #elasticsearchjp

Slide 2

Slide 2 text

あなた誰? 某決済代行会社所属 Java中心にサーバサイド開発 U゜Д゜)<ヨロシクネ

Slide 3

Slide 3 text

今回話すこと ● ecs-logging-javaを使ったアプリケーションログの可視化活用例 ○ 導入は軽く触れる程度 ○ どう使っているかを中心に @shiba_dog

Slide 4

Slide 4 text

アプリログ、kibanaでどう可視化していますか? @shiba_dog

Slide 5

Slide 5 text

アプリログ、kibanaでどう可視化していますか? ● 複数のアプリから集めたログを一つのダッシュボードで見てる! @shiba_dog

Slide 6

Slide 6 text

アプリログ、kibanaでどう可視化していますか? ● 複数のアプリから集めたログを一つのダッシュボードで見てる! @shiba_dog

Slide 7

Slide 7 text

アプリログ、kibanaでどう可視化していますか? ● 複数のアプリから集めたログを一つのダッシュボードで見てる! これだと、業務的なメトリクスやTermsしたい情報を可視化できない!! @shiba_dog

Slide 8

Slide 8 text

アプリログ、kibanaでどう可視化していますか? ● 複数のアプリから集めたログを一つのダッシュボードで見てる! これだと、業務的なメトリクスやTermsしたい情報を可視化できない!! @shiba_dog ログのレイアウトをいじって、 構造化させればいいじゃん!

Slide 9

Slide 9 text

でもでも ● 複数のアプリを動かすPasSで稼働しているため、アプリ個別のgrokを プラットフォーム側で管理するのはしんどい(これはうちの事情) ● マイクロサービスで作られたアプリに対して、ログ出力のルールを敷い て管理するのはしんどい @shiba_dog

Slide 10

Slide 10 text

そこでecs-logging-java! @shiba_dog

Slide 11

Slide 11 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままLoggerに渡すことも簡単 ● ExceptionやStackTraceをイイ感じに統一して構造化 @shiba_dog

Slide 12

Slide 12 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままLoggerに渡すことも簡単 ● ExceptionやStackTraceをイイ感じに統一して構造化 @shiba_dog

Slide 13

Slide 13 text

こんな風に使っています! ● 共通のapplication log用ダッシュボードで、Exceptionのスタックトレースを構造化 してエラーの種類と発生具合を簡単に把握 ● アプリケーション独自のaccess logを可視化 ● 同様にアプリ個別のapplication log用のダッシュボードを作成して可視化 @shiba_dog

Slide 14

Slide 14 text

こんな風に使っています!

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

こんな風に使っています!

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

こんな風に使っています!

Slide 19

Slide 19 text

使ってみて困ったこと ● 構造化できるのはお手軽だが、構造化ルールはどっちにしろ決めないとindex patternがぐちゃる ○ 今は、アプリごとに一段レイヤを掘って使うように ○ 何でもかんでも構造化したオブジェクトを出力するのはよくなさそう ● 開発時にローカル起動するときはJSONよりいつものログのほうが見やすい ○ プロファイルでログパターンを制御するようにして解決。 @shiba_dog

Slide 20

Slide 20 text

まとめ ● ecs-logging-javaの導入は簡単で、すぐに効果が出せる ● アプリログを工夫して可視化をすると運用がすごく楽になる @shiba_dog

Slide 21

Slide 21 text

ご清聴ありがとうございました。 @shiba_dog もっと良い使い方があるよ!などありましたら、 お気軽に@shiba_dogにDMくださいm(_ _)m

Slide 22

Slide 22 text

Appendix

Slide 23

Slide 23 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままLoggerに渡すことも簡単 ● ExceptionやStackTraceをイイ感じに統一して構造化 @shiba_dog

Slide 24

Slide 24 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままLoggerに渡すことも簡単 ● StackTraceをイイ感じに統一して構造化 @shiba_dog

Slide 25

Slide 25 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままLoggerに渡すことも簡単 ● ExceptionやStackTraceをイイ感じに統一して構造化 @shiba_dog

Slide 26

Slide 26 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままlog.infoに渡すことも簡単 ○ メッセージ内容をJsonにしておけば勝手に構造化 ● StackTraceをイイ感じに統一して構造化 {"@timestamp":"2019-08-06T12:09:12.375Z", "log.level": "INFO", "message":"Tomcat started on port(s): 8080 (http) with context path ''", "service.name":"spring-petclinic","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer"} {"@timestamp":"2019-08-06T12:09:12.379Z", "log.level": "INFO", "message":"Started PetClinicApplication in 7.095 seconds (JVM running for 9.082)", "service.name":"spring-petclinic","process.thread.name":"restartedMain","log.logger":"org.springframework.samples.petclinic.PetClinicApplication"} {"@timestamp":"2019-08-06T14:08:40.199Z", "log.level":"DEBUG", "message":"init find form", "service.name":"spring-petclinic","process.thread.name":"http-nio-8080-exec-8","log.logger":"org.springframework.samples.petclinic.owner.OwnerController","transaction .id":"28b7fb8d5aba51f1","trace.id":"2869b25b5469590610fea49ac04af7da"} @shiba_dog

Slide 27

Slide 27 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままLoggerに渡すことも簡単 ● ExceptionやStackTraceをイイ感じに統一して構造化 @shiba_dog

Slide 28

Slide 28 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままlog.infoに渡すことも簡単 ● ExceptionやStackTraceをイイ感じに統一して構造化 @shiba_dog

Slide 29

Slide 29 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままLoggerに渡すことも簡単 ● ExceptionやStackTraceをイイ感じに統一して構造化 @shiba_dog

Slide 30

Slide 30 text

ecs-loggin-javaいいところ ● 依存追加とlogライブラリのLayoutを変更するだけ。 ● ソースは変えずに、出力内容がイイ感じにJSONになる。 ○ なのでgrokはjsonでやればOK ● log4j2を使えば、オブジェクトをそのままlog.infoに渡すことも簡単 ○ メッセージ内容をJsonにしておけば勝手に構造化 ● StackTraceをイイ感じに統一して構造化 {"@timestamp":"2019-09-17T13:16:48.038Z", "log.level":"ERROR", "message":"Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Expected: controller used to showcase what happens when an exception is thrown] with root cause", "process.thread.name":"http-nio-8080-exec-1","log.logger":"org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]","log.origin":{"file.name":" DirectJDKLog.java","function":"log","file.line":175},"error.type":"java.lang.RuntimeException","error.message":"Expected: controller used to showcase what happens when an exception is thrown","error.stack_trace":[ "java.lang.RuntimeException: Expected: controller used to showcase what happens when an exception is thrown", "\tat org.springframework.samples.petclinic.system.CrashController.triggerException(CrashController.java:33)", "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "\tat java.lang.reflect.Method.invoke(Method.java:498)", "\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)", "\tat java.lang.Thread.run(Thread.java:748)"]} @shiba_dog