1
2

More than 5 years have passed since last update.

LibertyからLogstash CollectorでELKへのログ出力を試す

Last updated at Posted at 2018-05-18

WebSphere LibertyからLogstash Collectorフィーチャーを使って、ELK Stackへログを送る設定を試してみます。

以下のリンク先の手順に沿います。

Using the Logstash collector version 1.1

鍵の準備

鍵と証明書の作成

LogstashとLogstash Connectorの接続をSSLとするため、Logstashが使用する鍵と証明書を作成します。

openssl req -x509 -newkey rsa:2048 -keyout logstash.key -out logstash.crt -days 365 -nodes
$ openssl req -x509 -newkey rsa:2048 -keyout logstash.key -out logstash.crt -days 365 -nodes
Generating a 2048 bit RSA private key
.........+++
...........+++
writing new private key to 'logstash.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:logstash
Email Address []:
$

Liberty用のトラストストアの作成

作成したLogstash用の証明書から、この証明書を追加済みのトラストストアを作成しておきます。このトラストストアを後でLibertyで使います。

eytool -import -noprompt -alias logstash -file logstash.crt -keystore trust.jks -storepass Liberty
$ keytool -import -noprompt -alias logstash -file logstash.crt -keystore trust.jks -storepass Liberty
証明書がキーストアに追加されました
$ 

Libertyの準備

Liberty Betaのダウンロード

Logstash Collectorはバージョン1.0と1.1があり、送信するフィールド名が異なります。今回は1.1を使用してみますが、バージョン1.1はBetaのため、Liberty Betaを使用します。

フィールドの違いについてはKnowledge Centerの以下のトピックに記載があります。

Logstash collector

以下サイトよりLiberty Betaのzipファイルをダウンロードし、適当なフォルダに展開します。

サーバーの作成

zipを展開したら、サーバーを作成します。サーバー名を指定しない場合はdefaultServerが作成されます。

sotoiwa@soto-no-air:~/opt/ibm/wlp/bin
$ ./server create
objc[5139]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java (0x10ba6d4c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10bb234e0). One of the two will be used. Which one is undefined.
サーバー defaultServer が作成されました。
sotoiwa@soto-no-air:~/opt/ibm/wlp/bin
$

証明書の作成

Libertyで使用する証明書を作成します。

sotoiwa@soto-no-air:~/opt/ibm/wlp/bin
$ ./securityUtility createSSLCertificate --server=defaultServer --password="Liberty" --subject=CN=myHostname,OU=defaultServer,O=ibm,C=us
鍵ストア /Users/sotoiwa/opt/ibm/wlp/usr/servers/defaultServer/resources/security/key.jks を作成中です

サーバー defaultServer の SSL 証明書を作成しました。 証明書は SubjectDN CN=myHostname,OU=defaultServer,O=ibm,C=us で作成されました。

SSL を使用可能にするには、server.xml に次の行を追加してください。

    <featureManager>
        <feature>ssl-1.0</feature>
    </featureManager>
    <keyStore id="defaultKeyStore" password="{xor}EzY9Oi0rJg==" />


sotoiwa@soto-no-air:~/opt/ibm/wlp/bin
$

トラストストアの配置

今作成した鍵ストアとは別に、先ほど作成したLogstashの証明書が取り込み済みのトラストストアをLibertyサーバーに配置します。

sotoiwa@soto-no-air:~/opt/ibm/wlp/usr/servers/defaultServer/resources/security
$ ls -l
total 16
-rw-r--r--  1 sotoiwa  staff  2172  6 15 13:33 key.jks
-rw-r--r--  1 sotoiwa  staff   743  6 15 13:38 trust.jks
sotoiwa@soto-no-air:~/opt/ibm/wlp/usr/servers/defaultServer/resources/security
$

server.xmlの修正

server.xmlを編集します。ここでの編集のポイントは以下です。

  • Logstash Collectorフィーチャーを有効にし、接続先を構成します。
  • HTTPアクセスロギングを有効にします。
  • SSL構成を作成してキーストアとトラストストアを指定します。
  • Logstash Colloctorの設定でタグを付けています。本質的な設定ではありませんが、タグがないと後でダッシュボードがエラーになります。
<?xml version="1.0" encoding="UTF-8"?>
<server description="Liberty beta">

    <featureManager>
        <feature>webProfile-8.0</feature>
        <feature>transportSecurity-1.0</feature>
        <feature>logstashCollector-1.1</feature>
    </featureManager>

    <httpEndpoint id="defaultHttpEndpoint"
                  httpPort="9080"
                  httpsPort="9443"
                  host="*"
                  accessLoggingRef="accessLogging" />

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true" />

    <httpAccessLogging id="accessLogging" />

    <logstashCollector sslRef="mySSLConfig" hostName="localhost" port="5043" >
        <source>accesslog</source>
        <source>message</source>
        <source>ffdc</source>
        <source>trace</source>
        <source>garbageCollection</source>
        <tag>serverRackA5</tag>
        <tag>billingAppTeam</tag>
    </logstashCollector>

    <keyStore id="defaultKeyStore" password="Liberty" />
    <keyStore id="defaultTrustStore" location="trust.jks" password="Liberty" />
    <ssl id="mySSLConfig" trustStoreRef="defaultTrustStore" keyStoreRef="defaultKeyStore" />

</server>

GCログ出力

IBM JDKの場合は、Logstash CollectorからGarbage Collectionの情報を送れます。残念ながらMacだとIBM JDKがないのでGarbage Collectionの情報は送れません。
jvm.optionsファイルに以下を記載します。

-verbose:gc

アプリケーションのデプロイ

何でもいいのですが、アプリケーションをデプロイします。ここでは以下からsample.warをダウンロードして、dropinsフォルダーに配置します。

Libertyを起動

Libertyサーバーを起動します。コンソール出力を確認するため、ここではserver startの代わりにserver runコマンドを使ってフォアグラウンドで起動します。

$ ./server run
objc[7950]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java (0x1060dc4c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x1061924e0). One of the two will be used. Which one is undefined.
Java HotSpot(TM) 64-Bit Server VM バージョン 1.8.0_151-b12 (ja_JP) で、defaultServer (WebSphere Application Server 2018.6.0.0/wlp-1.0.21.20180531-2100) を起動しています
[AUDIT   ] CWWKE0001I: サーバー defaultServer が起動されました。
[AUDIT   ] CWWKE0104I: この製品はベータ版であり、実動には使用できません。 全ライセンス条項は以下で表示可能です: https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/license/early_access/ilar/2018.6.0.0/lafiles/ja.html
[GC (Allocation Failure)  33280K->10005K(125952K), 0.0327679 secs]
[GC (Allocation Failure)  43285K->15742K(159232K), 0.0260316 secs]
[GC (Allocation Failure)  82302K->24419K(159232K), 0.0419508 secs]
[GC (Metadata GC Threshold)  35740K->26052K(225792K), 0.0220855 secs]
[Full GC (Metadata GC Threshold)  26052K->19908K(213504K), 0.0908929 secs]
[AUDIT   ] CWWKZ0058I: アプリケーションの dropins をモニター中です。
[GC (Allocation Failure)  152993K->31758K(213504K), 0.0315995 secs]
[GC (Metadata GC Threshold)  87418K->36722K(307200K), 0.0435490 secs]
[Full GC (Metadata GC Threshold)  36722K->26108K(336896K), 0.1808532 secs]
[警告      ] TRAS4352W: Health Center エージェントが見つからなかったため、JVM モニタリング情報および診断情報は提供されません。
[AUDIT   ] CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[beanValidation-2.0, servlet-4.0, ssl-1.0, jndi-1.0, cdi-2.0, transportSecurity-1.0, jdbc-4.2, appSecurity-3.0, appSecurity-2.0, jaxrs-2.1, webProfile-8.0, jpa-2.2, jsp-2.3, jsonb-1.0, ejbLite-3.2, managedBeans-1.0, jsf-2.3, logstashCollector-1.1, jsonp-1.1, jaxrsClient-2.1, el-3.0, jpaContainer-2.2, jaspic-1.1, distributedMap-1.0, websocket-1.1]。
[AUDIT   ] CWWKF0011I: サーバー defaultServer は、Smarter Planet に対応する準備ができました。
[警告      ] TRAS0216W: logstash コレクターが、指定されたホスト localhost およびポート番号 5043 上の logstash サーバーに接続できませんでした。

起動することが確認できたら、Ctrl+Cで停止します。

ELKの起動

簡単に試すため、今回はELKをローカルで起動します。バージョンはKnowledge Centerにテスト済みと記載がある5.3.3を使用します。

ダウンロード

以下からELKをダウンロードして展開します。
https://www.elastic.co/jp/downloads/logstash
https://www.elastic.co/jp/downloads/elasticsearch
https://www.elastic.co/jp/downloads/kibana

Logstashへの接続確認

はじめに、Logstashだけを起動してLogstash Colloectorからデータが送られてきていることを確認します。

この手順の最初に作成した鍵と証明書を、Logstashを展開したディレクトリーのconfigディレクトリーに配置します。

以下のデバッグ用のLogstash構成ファイルを作成します。入力はSSLを使用して5043ポートで受け付けるようにし、SSLで使用する鍵と証明書のパスを指定しています。出力は標準出力にそのまま出力する設定です。

config/logstash_debug.conf
input {
    beats {
        port => "5043"
        ssl => true
        ssl_certificate => "config/logstash.crt"
        ssl_key => "config/logstash.key"
    }
}
filter {
}
output {
    stdout {}
}

この設定ファイルを指定してLogstashを起動します。

sotoiwa@soto-no-air:~/opt/logstash/logstash-5.3.3
$ bin/logstash -f config/logstash_debug.conf
Sending Logstash's logs to /Users/sotoiwa/opt/logstash/logstash-5.3.3/logs which is now configured via log4j2.properties
[2018-06-19T18:18:14,300][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
log4j:WARN No appenders could be found for logger (io.netty.util.internal.logging.InternalLoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[2018-06-19T18:18:14,973][INFO ][logstash.inputs.beats    ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5043"}
[2018-06-19T18:18:15,062][INFO ][logstash.pipeline        ] Pipeline main started
[2018-06-19T18:18:15,150][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

Logstashが起動したあと、別のコンソールを開いてLibertyを起動するとLogstash Collectorからログが送られてくることが確認できます。

2018-06-19T09:18:35.118Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKE0001I: サーバー defaultServer が起動されました。","ibm_threadId":"00000001","ibm_datetime":"2018-06-19T18:18:20.294+0900","ibm_messageId":"CWWKE0001I","module":"com.ibm.ws.kernel.launch.internal.FrameworkManager","loglevel":"AUDIT","ibm_sequence":"1529399900294_0000000000001","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.123Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKE0104I: この製品はベータ版であり、実動には使用できません。 全ライセンス条項は以下で表示可能です: https:\/\/public.dhe.ibm.com\/ibmdl\/export\/pub\/software\/websphere\/wasdev\/license\/early_access\/ilar\/2018.6.0.0\/lafiles\/ja.html","ibm_threadId":"00000001","ibm_datetime":"2018-06-19T18:18:20.325+0900","ibm_messageId":"CWWKE0104I","module":"com.ibm.ws.kernel.launch.internal.FrameworkManager","loglevel":"AUDIT","ibm_sequence":"1529399900325_0000000000002","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.124Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKE0002I: カーネルは 2.527 秒 秒後に始動されました。","ibm_threadId":"00000001","ibm_datetime":"2018-06-19T18:18:22.481+0900","ibm_messageId":"CWWKE0002I","module":"com.ibm.ws.kernel.launch.internal.FrameworkManager","loglevel":"INFO","ibm_sequence":"1529399902481_0000000000003","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.125Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKF0007I: フィーチャー更新が開始しました。","ibm_threadId":"00000018","ibm_datetime":"2018-06-19T18:18:22.549+0900","ibm_messageId":"CWWKF0007I","module":"com.ibm.ws.kernel.feature.internal.FeatureManager","loglevel":"INFO","ibm_sequence":"1529399902549_0000000000004","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.126Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKS0007I: セキュリティー・サービスを開始しています...","ibm_threadId":"00000011","ibm_datetime":"2018-06-19T18:18:24.028+0900","ibm_messageId":"CWWKS0007I","module":"com.ibm.ws.security.ready.internal.SecurityReadyServiceImpl","loglevel":"INFO","ibm_sequence":"1529399904028_0000000000005","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.127Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKO0219I: TCP チャネル defaultHttpEndpoint が開始され、現在、ホスト *  (IPv6)、ポート 9080 の要求を listen しています。","ibm_threadId":"00000020","ibm_datetime":"2018-06-19T18:18:25.252+0900","ibm_messageId":"CWWKO0219I","module":"com.ibm.ws.tcpchannel.internal.TCPChannel","loglevel":"INFO","ibm_sequence":"1529399905252_0000000000006","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.128Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKO0219I: TCP チャネル defaultHttpEndpoint-ssl が開始され、現在、ホスト *  (IPv6)、ポート 9443 の要求を listen しています。","ibm_threadId":"00000020","ibm_datetime":"2018-06-19T18:18:25.283+0900","ibm_messageId":"CWWKO0219I","module":"com.ibm.ws.tcpchannel.internal.TCPChannel","loglevel":"INFO","ibm_sequence":"1529399905283_0000000000007","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.129Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKZ0058I: アプリケーションの dropins をモニター中です。","ibm_threadId":"00000011","ibm_datetime":"2018-06-19T18:18:25.293+0900","ibm_messageId":"CWWKZ0058I","module":"com.ibm.ws.app.manager.internal.monitor.DropinMonitor","loglevel":"AUDIT","ibm_sequence":"1529399905293_0000000000008","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.130Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKZ0064I: Jandex の使用はアプリケーション sample で有効になっています。","ibm_threadId":"00000013","ibm_datetime":"2018-06-19T18:18:25.321+0900","ibm_messageId":"CWWKZ0064I","module":"com.ibm.ws.app.manager.internal.ApplicationConfig","loglevel":"INFO","ibm_sequence":"1529399905321_0000000000009","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.131Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKS1123I: クラス名が NullCollectiveAuthenticationPlugin である集合認証プラグインがアクティブ化されました。 ","ibm_threadId":"00000011","ibm_datetime":"2018-06-19T18:18:25.939+0900","ibm_messageId":"CWWKS1123I","module":"com.ibm.ws.security.authentication.internal.jaas.JAASServiceImpl","loglevel":"INFO","ibm_sequence":"1529399905939_000000000000A","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.131Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKS4105I: LTPA 構成は、0.099 秒後に作動可能になります。","ibm_threadId":"0000001c","ibm_datetime":"2018-06-19T18:18:25.956+0900","ibm_messageId":"CWWKS4105I","module":"com.ibm.ws.security.token.ltpa.internal.LTPAKeyCreateTask","loglevel":"INFO","ibm_sequence":"1529399905956_000000000000B","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.132Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKS1655I: Java セキュリティー・プロパティー authconfigprovider.factory が設定されていないため、デフォルト Java Authentication SPI for Containers (JASPIC) AuthConfigFactory クラス com.ibm.ws.security.jaspi.ProviderRegistry が使用されます。 ","ibm_threadId":"00000011","ibm_datetime":"2018-06-19T18:18:26.340+0900","ibm_messageId":"CWWKS1655I","module":"com.ibm.ws.security.jaspi.AuthConfigFactoryWrapper","loglevel":"INFO","ibm_sequence":"1529399906340_000000000000C","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.133Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"DYNA1001I: WebSphere 動的キャッシュ・インスタンス baseCache が正常に初期化されました。","ibm_threadId":"00000011","ibm_datetime":"2018-06-19T18:18:28.198+0900","ibm_messageId":"DYNA1001I","module":"com.ibm.ws.cache.ServerCache","loglevel":"INFO","ibm_sequence":"1529399908198_000000000000D","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.134Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"DYNA1071I: キャッシュ・プロバイダー default が使用されています。","ibm_threadId":"00000011","ibm_datetime":"2018-06-19T18:18:28.208+0900","ibm_messageId":"DYNA1071I","module":"com.ibm.ws.cache.ServerCache","loglevel":"INFO","ibm_sequence":"1529399908208_000000000000E","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.135Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"DYNA1056I: 動的キャッシュ (オブジェクト・キャッシュ) が、正常に初期化されました。","ibm_threadId":"00000011","ibm_datetime":"2018-06-19T18:18:28.210+0900","ibm_messageId":"DYNA1056I","module":"com.ibm.ws.cache.CacheServiceImpl","loglevel":"INFO","ibm_sequence":"1529399908210_000000000000F","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.136Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKZ0018I: アプリケーション sample を開始中です。","ibm_threadId":"0000001c","ibm_datetime":"2018-06-19T18:18:28.663+0900","ibm_messageId":"CWWKZ0018I","module":"com.ibm.ws.app.manager.AppMessageHelper","loglevel":"INFO","ibm_sequence":"1529399908663_0000000000010","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.137Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"SESN8501I: セッション・マネージャーが、永続ストレージ・ロケーションを検出しませんでした。HttpSession オブジェクトはローカル・アプリケーション・サーバーのメモリーに保管されます。","ibm_threadId":"0000001c","ibm_datetime":"2018-06-19T18:18:29.159+0900","ibm_messageId":"SESN8501I","module":"com.ibm.ws.session.WASSessionCore","loglevel":"INFO","ibm_methodName":"initialize","ibm_className":"SessionMgrComponentImpl","ibm_sequence":"1529399909159_0000000000011","ext_thread":"Default Executor-thread-4","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.138Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"WELD-000900: 3.0.3 (Final)","ibm_threadId":"0000001c","ibm_datetime":"2018-06-19T18:18:29.249+0900","module":"org.jboss.weld.Version","loglevel":"INFO","ibm_methodName":"<clinit>","ibm_className":"org.jboss.weld.bootstrap.WeldStartup","ibm_sequence":"1529399909249_0000000000012","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.139Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"SRVE0169I: Web モジュールをロード中: Hello, World Application。","ibm_threadId":"0000001c","ibm_datetime":"2018-06-19T18:18:29.633+0900","ibm_messageId":"SRVE0169I","module":"com.ibm.ws.webcontainer.osgi.webapp.WebGroup","loglevel":"INFO","ibm_sequence":"1529399909633_0000000000013","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.139Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"SRVE0250I: Web モジュール Hello, World Application は default_host にバインドされています。","ibm_threadId":"0000001c","ibm_datetime":"2018-06-19T18:18:29.640+0900","ibm_messageId":"SRVE0250I","module":"com.ibm.ws.webcontainer","loglevel":"INFO","ibm_methodName":"addWebApplication","ibm_className":"com.ibm.ws.webcontainer.osgi.DynamicVirtualHost","ibm_sequence":"1529399909640_0000000000014","ext_thread":"Default Executor-thread-4","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.140Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKT0016I: Web アプリケーションが使用可能です (default_host): http:\/\/soto-no-air.dhcp.hakozaki.ibm.com:9080\/sample\/","ibm_threadId":"0000001c","ibm_datetime":"2018-06-19T18:18:29.642+0900","ibm_messageId":"CWWKT0016I","module":"com.ibm.ws.http.internal.VirtualHostImpl","loglevel":"AUDIT","ibm_sequence":"1529399909642_0000000000015","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.141Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKZ0001I: アプリケーション sample が 0.999 秒で開始しました。","ibm_threadId":"0000001c","ibm_datetime":"2018-06-19T18:18:29.662+0900","ibm_messageId":"CWWKZ0001I","module":"com.ibm.ws.app.manager.AppMessageHelper","loglevel":"AUDIT","ibm_sequence":"1529399909662_0000000000016","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.142Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"SESN0176I: アプリケーション・キー default_host\/sample に新しいセッション・コンテキストが作成されます。","ibm_threadId":"00000020","ibm_datetime":"2018-06-19T18:18:29.700+0900","ibm_messageId":"SESN0176I","module":"com.ibm.ws.session.WASSessionCore","loglevel":"INFO","ibm_methodName":"getSessionContext","ibm_className":"SessionContextRegistryImpl","ibm_sequence":"1529399909700_0000000000017","ext_thread":"Default Executor-thread-7","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.143Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"SESN0172I: セッション・マネージャーは、セッション ID の生成に Java のデフォルト SecureRandom 実装を使用しています。","ibm_threadId":"00000020","ibm_datetime":"2018-06-19T18:18:29.726+0900","ibm_messageId":"SESN0172I","module":"com.ibm.ws.util","loglevel":"INFO","ibm_methodName":"IDGeneratorImpl","ibm_className":"IDGeneratorImpl","ibm_sequence":"1529399909726_0000000000018","ext_thread":"Default Executor-thread-7","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.144Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"TRAS4352W: Health Center エージェントが見つからなかったため、JVM モニタリング情報および診断情報は提供されません。","ibm_threadId":"00000011","ibm_datetime":"2018-06-19T18:18:29.782+0900","ibm_messageId":"TRAS4352W","module":"com.ibm.ws.health.center.agent.HCAgentConnection","loglevel":"WARNING","ibm_sequence":"1529399909782_0000000000019","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.144Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[beanValidation-2.0, servlet-4.0, ssl-1.0, jndi-1.0, cdi-2.0, transportSecurity-1.0, jdbc-4.2, appSecurity-3.0, appSecurity-2.0, jaxrs-2.1, webProfile-8.0, jpa-2.2, jsp-2.3, jsonb-1.0, ejbLite-3.2, managedBeans-1.0, jsf-2.3, logstashCollector-1.1, jsonp-1.1, jaxrsClient-2.1, el-3.0, jpaContainer-2.2, jaspic-1.1, distributedMap-1.0, websocket-1.1]。","ibm_threadId":"00000018","ibm_datetime":"2018-06-19T18:18:29.806+0900","ibm_messageId":"CWWKF0012I","module":"com.ibm.ws.kernel.feature.internal.FeatureManager","loglevel":"AUDIT","ibm_sequence":"1529399909806_000000000001A","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.145Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKF0008I: フィーチャー更新が 7.326 秒で完了しました。","ibm_threadId":"00000018","ibm_datetime":"2018-06-19T18:18:29.807+0900","ibm_messageId":"CWWKF0008I","module":"com.ibm.ws.kernel.feature.internal.FeatureManager","loglevel":"INFO","ibm_sequence":"1529399909807_000000000001B","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.146Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"CWWKF0011I: サーバー defaultServer は、Smarter Planet に対応する準備ができました。","ibm_threadId":"00000018","ibm_datetime":"2018-06-19T18:18:29.808+0900","ibm_messageId":"CWWKF0011I","module":"com.ibm.ws.kernel.feature.internal.FeatureManager","loglevel":"AUDIT","ibm_sequence":"1529399909808_000000000001C","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.147Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"HV000001: Hibernate Validator 6.0.9.Final","ibm_threadId":"00000020","ibm_datetime":"2018-06-19T18:18:29.858+0900","module":"org.hibernate.validator.internal.util.Version","loglevel":"INFO","ibm_methodName":"<clinit>","ibm_className":"org.hibernate.validator.internal.util.Version","ibm_sequence":"1529399909858_000000000001D","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.147Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"SRVE9103I: Web サーバー・プラグイン構成ファイルは、このサーバー用に、\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/servers\/defaultServer\/logs\/state\/plugin-cfg.xml に自動的に生成されました。","ibm_threadId":"0000002a","ibm_datetime":"2018-06-19T18:18:30.054+0900","ibm_messageId":"SRVE9103I","module":"com.ibm.ws.webcontainer.osgi.mbeans.PluginGenerator","loglevel":"INFO","ibm_sequence":"1529399910054_000000000001E","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.148Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"DYNA1056I: 動的キャッシュ (オブジェクト・キャッシュ) が、正常に初期化されました。","ibm_threadId":"00000020","ibm_datetime":"2018-06-19T18:18:30.320+0900","ibm_messageId":"DYNA1056I","module":"com.ibm.ws.cache.CacheServiceImpl","loglevel":"INFO","ibm_sequence":"1529399910320_000000000001F","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:35.149Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"Using org.apache.myfaces.ee.MyFacesContainerInitializer","ibm_threadId":"00000020","ibm_datetime":"2018-06-19T18:18:30.347+0900","module":"org.apache.myfaces.ee.MyFacesContainerInitializer","loglevel":"INFO","ibm_sequence":"1529399910347_0000000000020","ext_thread":"Default Executor-thread-7","ibm_tags":["serverRackA5","billingAppTeam"]}
2018-06-19T09:18:39.732Z %{host} {"type":"liberty_message","host":"soto-no-air.dhcp.hakozaki.ibm.com","ibm_userDir":"\/Users\/sotoiwa\/opt\/ibm\/wlp\/usr\/","ibm_serverName":"defaultServer","message":"TRAS0218I: logstash コレクターが、指定されたホスト localhost およびポート番号 5043 上の logstash サーバーに接続されました。","ibm_threadId":"00000031","ibm_datetime":"2018-06-19T18:18:35.049+0900","ibm_messageId":"TRAS0218I","module":"com.ibm.ws.logstash.collector.internal.LogstashClient","loglevel":"INFO","ibm_sequence":"1529399915049_0000000000021","ibm_tags":["serverRackA5","billingAppTeam"]}

各行は

時刻 ホスト名 json

となっており、json部分を整形すると、次のような内容です。

{
    "type": "liberty_message",
    "host": "soto-no-air.dhcp.hakozaki.ibm.com",
    "ibm_userDir": "/Users/sotoiwa/opt/ibm/wlp/usr/",
    "ibm_serverName": "defaultServer",
    "message": "CWWKF0011I: サーバー defaultServer は、Smarter Planet に対応する準備ができました。",
    "ibm_threadId": "00000018",
    "ibm_datetime": "2018-06-19T18:18:29.808+0900",
    "ibm_messageId": "CWWKF0011I",
    "module": "com.ibm.ws.kernel.feature.internal.FeatureManager",
    "loglevel": "AUDIT",
    "ibm_sequence": "1529399909808_000000000001C",
    "ibm_tags": [
        "serverRackA5",
        "billingAppTeam"
    ]
}

接続できたらCtrl-CでLibertyとLogstashをそれぞれ停止します。

Liberty用のLogstash設定ファイルの準備

https://github.com/WASdev/sample.logstash.collector
から以下のファイルを取得してconfigディレクトリーに配置します。

ダウンロードしたliberty_logstash.confを修正します。
また、鍵ファイル、証明書、索引テンプレート・ファイルのパスを実際の配置場所に合わせて修正します。

input {
    beats {
・・・
        ssl_certificate => "config/logstash.crt" 
        ssl_key => "config/logstash.key" 
    }

てElasticsearchにログを送るようにします。Kubernetes環境であれば、elasticsearchというホスト名でElasticsearchのサービスにアクセスするケースが多そうですが、今回はローカルでElasticsearchを起動しているので、ホスト名をlocalhostに書き換えます。

output {
    elasticsearch {
        hosts => "localhost:9200"
・・・
    }
}

liberty_logstash.confには次のようなフィルターも設定されています。

filter {
    if [type] =~ "liberty_*" {
        if [type] == "liberty_accesslog" {
            json {
                source => "message"
                remove_field => [ "message" ]
            }
        }
        else if [type] == "liberty_trace" {
            json {
                source => "message"
            }
        }
        else if [type] == "liberty_gc" {
            json {
                source => "message"
                remove_field => [ "message" ]
            }
        }
        else if [type] == "liberty_message" {
            json {
                source => "message"
            }
        }
        else if [type] == "liberty_ffdc" {
            json {
                source => "message"
                remove_field => [ "message" ]
            }
        }
    }
}

Logstashの出力設定をstdout { codec => rubydebug }stdout { codec => json }に変更することで、LogstashからElasticsearchに送られるはずのjsonを確認することができます。jsonだと整形まではしてくれないので、rubydebugのほうが見やすいです。

output {
    #stdout {}
    stdout { codec => json }
}

filterがない状態で、出力をjsonとして出力して内容を確認すると以下のようになっていました。messageフィールドにjson部分が入っていていて、それ以外に@timestamp@versiontypeといったフィールドが設定されています。

{
    "@timestamp": "2018-06-19T07:25:41.269Z",
    "@version": "1",
    "message": "{\"type\":\"liberty_message\",\"host\":\"soto-no-air.hogehoge.com\",\"ibm_userDir\":\"\\/Users\\/sotoiwa\\/opt\\/ibm\\/wlp\\/usr\\/\",\"ibm_serverName\":\"defaultServer\",\"message\":\"CWWKF0011I: サーバー defaultServer は、Smarter Planet に対応する準備ができました。\",\"ibm_threadId\":\"00000018\",\"ibm_datetime\":\"2018-06-19T16:25:35.921+0900\",\"ibm_messageId\":\"CWWKF0011I\",\"module\":\"com.ibm.ws.kernel.feature.internal.FeatureManager\",\"loglevel\":\"AUDIT\",\"ibm_sequence\":\"1529393135921_000000000001C\",\"ibm_tags\":[\"serverRackA5\",\"billingAppTeam\"]}",
    "type": "liberty_message",
    "tags": [
        "beats_input_codec_plain_applied"
    ]
}

liberty_logstash.confでは、jsonフィルタープラグインを使い、messageフィールドがjsonであることを指定しているので、次のように、jsonの内容が取り出されてフィールドに設定されます。

{
    "module": "com.ibm.ws.kernel.feature.internal.FeatureManager",
    "ibm_sequence": "1529393526665_000000000001C",
    "ibm_tags": [
        "serverRackA5",
        "billingAppTeam"
    ],
    "message": "CWWKF0011I: サーバー defaultServer は、Smarter Planet に対応する準備ができました。",
    "type": "liberty_message",
    "tags": [
        "beats_input_codec_plain_applied"
    ],
    "ibm_userDir": "/Users/sotoiwa/opt/ibm/wlp/usr/",
    "ibm_serverName": "defaultServer",
    "@timestamp": "2018-06-19T07:32:12.134Z",
    "loglevel": "AUDIT",
    "@version": "1",
    "host": "soto-no-air.hogehoge.com",
    "ibm_threadId": "00000018",
    "ibm_datetime": "2018-06-19T16:32:06.665+0900",
    "ibm_messageId": "CWWKF0011I"
}

なお、liberty_logstash.confでは、typeで条件分岐がされています。typeliberty_messageまたはliberty_traceの場合、messageフィールドのjsonのなかに入れ子でmessageのフィールドがあるので、フィルター後はjsonのなかのmessageフィールドがmessageフィールドに設定されます。

typeliberty_gclibberty_ffdcliberty_accesslogの場合は、jsonのなかにmessageフィールドがないので、json全体がmessageフィールドに入ったままとなりますが、このmessageフィールドは不要なので削除しています。

Elasticsearchを起動

Elasticsearchを起動します。

sotoiwa@soto-no-air:~/opt/elasticsearch/elasticsearch-5.3.3
$ bin/elasticsearch
[2018-06-19T14:00:58,167][INFO ][o.e.n.Node               ] [] initializing ...
[2018-06-19T14:00:58,362][INFO ][o.e.e.NodeEnvironment    ] [GcxldH9] using [1] data paths, mounts [[/ (/dev/disk1s1)]], net usable_space [51.4gb], net total_space [233.5gb], spins? [unknown], types [apfs]
[2018-06-19T14:00:58,363][INFO ][o.e.e.NodeEnvironment    ] [GcxldH9] heap size [1.9gb], compressed ordinary object pointers [true]
[2018-06-19T14:00:58,594][INFO ][o.e.n.Node               ] node name [GcxldH9] derived from node ID [GcxldH9xQkuG5qEtogRhgw]; set [node.name] to override
[2018-06-19T14:00:58,595][INFO ][o.e.n.Node               ] version[5.3.3], pid[9909], build[65e26e6/2017-05-22T12:03:12.318Z], OS[Mac OS X/10.13.4/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_151/25.151-b12]
[2018-06-19T14:01:00,929][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [aggs-matrix-stats]
[2018-06-19T14:01:00,931][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [ingest-common]
[2018-06-19T14:01:00,933][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [lang-expression]
[2018-06-19T14:01:00,934][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [lang-groovy]
[2018-06-19T14:01:00,934][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [lang-mustache]
[2018-06-19T14:01:00,934][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [lang-painless]
[2018-06-19T14:01:00,935][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [percolator]
[2018-06-19T14:01:00,935][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [reindex]
[2018-06-19T14:01:00,936][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [transport-netty3]
[2018-06-19T14:01:00,936][INFO ][o.e.p.PluginsService     ] [GcxldH9] loaded module [transport-netty4]
[2018-06-19T14:01:00,938][INFO ][o.e.p.PluginsService     ] [GcxldH9] no plugins loaded
[2018-06-19T14:01:06,566][INFO ][o.e.n.Node               ] initialized
[2018-06-19T14:01:06,567][INFO ][o.e.n.Node               ] [GcxldH9] starting ...
[2018-06-19T14:01:07,115][INFO ][o.e.t.TransportService   ] [GcxldH9] publish_address {127.0.0.1:9300}, bound_addresses {[fe80::1]:9300}, {[::1]:9300}, {127.0.0.1:9300}
[2018-06-19T14:01:10,371][INFO ][o.e.c.s.ClusterService   ] [GcxldH9] new_master {GcxldH9}{GcxldH9xQkuG5qEtogRhgw}{FXdz9K49R2mbOoWmvBWDfA}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)
[2018-06-19T14:01:10,412][INFO ][o.e.h.n.Netty4HttpServerTransport] [GcxldH9] publish_address {127.0.0.1:9200}, bound_addresses {[fe80::1]:9200}, {[::1]:9200}, {127.0.0.1:9200}
[2018-06-19T14:01:10,419][INFO ][o.e.n.Node               ] [GcxldH9] started
[2018-06-19T14:01:11,322][INFO ][o.e.g.GatewayService     ] [GcxldH9] recovered [5] indices into cluster_state
[2018-06-19T14:01:13,081][INFO ][o.e.c.r.a.AllocationService] [GcxldH9] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[metricbeat-2018.05.21][3]] ...]).

起動したら、cat APIを使ってインデックスの一覧とテンプレートの一覧を取得してみます。

$ curl -XGET 'localhost:9200/_cat/indices?v&pretty'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
$
$ curl -XGET 'localhost:9200/_cat/templates?v&pretty'
name template order version
$

まだインデックスもテンプレートもありません。

liberty_logstash.confを指定してLogstashを起動します。

sotoiwa@soto-no-air:~/opt/logstash/logstash-5.3.3
$ bin/logstash -f config/liberty_logstash.conf
Sending Logstash's logs to /Users/sotoiwa/opt/logstash/logstash-5.3.3/logs which is now configured via log4j2.properties
[2018-06-19T14:17:14,480][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}}
[2018-06-19T14:17:14,493][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://localhost:9200/, :path=>"/"}
log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAuthCache).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[2018-06-19T14:17:14,729][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>#<URI::HTTP:0x6acdef31 URL:http://localhost:9200/>}
[2018-06-19T14:17:14,739][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>"config/liberty_logstash_template_ibm.json"}
[2018-06-19T14:17:14,865][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"liberty_message"=>{"properties"=>{"host"=>{"type"=>"keyword", "index"=>"true"}, "ibm_userDir"=>{"type"=>"keyword", "index"=>"true"}, "ibm_serverName"=>{"type"=>"keyword", "index"=>"true"}, "ibm_datetime"=>{"type"=>"date", "format"=>"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}, "ibm_sequence"=>{"type"=>"keyword", "index"=>"true"}, "ibm_className"=>{"type"=>"keyword", "index"=>"true"}, "module"=>{"type"=>"keyword", "index"=>"true"}, "message"=>{"type"=>"text", "index"=>"true"}, "ibm_messageId"=>{"type"=>"keyword", "index"=>"true"}, "ibm_methodName"=>{"type"=>"keyword", "index"=>"true"}, "loglevel"=>{"type"=>"keyword", "index"=>"true"}, "ibm_threadId"=>{"type"=>"keyword", "index"=>"true"}, "ibm_tags"=>{"type"=>"keyword", "index"=>"true"}}}, "liberty_ffdc"=>{"properties"=>{"host"=>{"type"=>"keyword", "index"=>"true"}, "ibm_userDir"=>{"type"=>"keyword", "index"=>"true"}, "ibm_serverName"=>{"type"=>"keyword", "index"=>"true"}, "ibm_datetime"=>{"type"=>"date", "format"=>"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}, "ibm_sequence"=>{"type"=>"keyword", "index"=>"true"}, "ibm_className"=>{"type"=>"keyword", "index"=>"true"}, "ibm_exceptionName"=>{"type"=>"keyword", "index"=>"true"}, "ibm_objectDetails"=>{"type"=>"keyword", "index"=>"true"}, "ibm_probeID"=>{"type"=>"keyword", "index"=>"true"}, "ibm_stackTrace"=>{"type"=>"keyword", "index"=>"true"}, "ibm_tags"=>{"type"=>"keyword", "index"=>"true"}}}, "liberty_trace"=>{"properties"=>{"host"=>{"type"=>"keyword", "index"=>"true"}, "ibm_userDir"=>{"type"=>"keyword", "index"=>"true"}, "ibm_serverName"=>{"type"=>"keyword", "index"=>"true"}, "ibm_datetime"=>{"type"=>"date", "format"=>"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}, "ibm_sequence"=>{"type"=>"keyword", "index"=>"true"}, "ibm_className"=>{"type"=>"keyword", "index"=>"true"}, "module"=>{"type"=>"keyword", "index"=>"true"}, "message"=>{"type"=>"text", "index"=>"true"}, "ibm_methodName"=>{"type"=>"keyword", "index"=>"true"}, "loglevel"=>{"type"=>"keyword", "index"=>"true"}, "ibm_threadId"=>{"type"=>"keyword", "index"=>"true"}, "ibm_tags"=>{"type"=>"keyword", "index"=>"true"}}}, "liberty_gc"=>{"properties"=>{"host"=>{"type"=>"keyword", "index"=>"true"}, "ibm_userDir"=>{"type"=>"keyword", "index"=>"true"}, "ibm_serverName"=>{"type"=>"keyword", "index"=>"true"}, "ibm_datetime"=>{"type"=>"date", "format"=>"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}, "ibm_sequence"=>{"type"=>"keyword", "index"=>"true"}, "ibm_heap"=>{"type"=>"long", "index"=>"true"}, "ibm_usedHeap"=>{"type"=>"long", "index"=>"true"}, "ibm_maxHeap"=>{"type"=>"long", "index"=>"true"}, "ibm_duration"=>{"type"=>"long", "index"=>"true"}, "ibm_gcType"=>{"type"=>"keyword", "index"=>"true"}, "ibm_reason"=>{"type"=>"keyword", "index"=>"true"}, "ibm_tags"=>{"type"=>"keyword", "index"=>"true"}}}, "liberty_accesslog"=>{"properties"=>{"host"=>{"type"=>"keyword", "index"=>"true"}, "ibm_userDir"=>{"type"=>"keyword", "index"=>"true"}, "ibm_serverName"=>{"type"=>"keyword", "index"=>"true"}, "ibm_datetime"=>{"type"=>"date", "format"=>"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}, "ibm_sequence"=>{"type"=>"keyword", "index"=>"true"}, "ibm_requestHost"=>{"type"=>"keyword", "index"=>"true"}, "ibm_requestPort"=>{"type"=>"keyword", "index"=>"true"}, "ibm_remoteHost"=>{"type"=>"keyword", "index"=>"true"}, "ibm_requestMethod"=>{"type"=>"keyword", "index"=>"true"}, "ibm_requestProtocol"=>{"type"=>"keyword", "index"=>"true"}, "ibm_bytesReceived"=>{"type"=>"long", "index"=>"true"}, "ibm_elapsedTime"=>{"type"=>"long", "index"=>"true"}, "ibm_queryString"=>{"type"=>"text", "index"=>"true"}, "ibm_responseCode"=>{"type"=>"integer", "index"=>"true"}, "ibm_uriPath"=>{"type"=>"keyword", "index"=>"true"}, "ibm_userAgent"=>{"type"=>"keyword", "index"=>"true"}, "ibm_tags"=>{"type"=>"keyword", "index"=>"true"}}}}}}
[2018-06-19T14:17:14,897][INFO ][logstash.outputs.elasticsearch] Installing elasticsearch template to _template/logstash
[2018-06-19T14:17:15,045][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>[#<URI::Generic:0x5cd552c7 URL://localhost:9200>]}
[2018-06-19T14:17:15,048][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
[2018-06-19T14:17:16,435][INFO ][logstash.inputs.beats    ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5043"}
[2018-06-19T14:17:16,610][INFO ][logstash.pipeline        ] Pipeline main started
[2018-06-19T14:17:16,739][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

起動時にテンプレートがPOSTされ作成されたことが確認できます。

$ curl -XGET 'localhost:9200/_cat/indices?v&pretty'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
$
$ curl -XGET 'localhost:9200/_cat/templates?v&pretty'
name     template   order version
logstash logstash-* 0
$

Libertyを起動します。

$ curl -XGET 'localhost:9200/_cat/indices?v&pretty'
health status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   logstash-2018.06.19 aF0gR54USJ6C0AqBrYpzVw   5   1         19            0       82kb           82kb
$

インデックスが作成されたことが確認できます。日毎に作成されます。

アクセスログを出したいので、アプリケーションにアクセスしておきます。

Kibanaの起動

Kibanaを起動します。

sotoiwa@soto-no-air:~/opt/kibana/kibana-5.3.3-darwin-x86_64
$ bin/kibana
  log   [05:46:07.758] [info][status][plugin:kibana@5.3.3] Status changed from uninitialized to green - Ready
  log   [05:46:07.945] [info][status][plugin:elasticsearch@5.3.3] Status changed from uninitialized to yellow - Waiting for Elasticsearch
  log   [05:46:08.028] [info][status][plugin:console@5.3.3] Status changed from uninitialized to green - Ready
  log   [05:46:08.569] [info][status][plugin:timelion@5.3.3] Status changed from uninitialized to green - Ready
  log   [05:46:08.575] [info][listening] Server running at http://localhost:5601
  log   [05:46:08.576] [info][status][ui settings] Status changed from uninitialized to yellow - Elasticsearch plugin is yellow
  log   [05:46:13.920] [info][status][plugin:elasticsearch@5.3.3] Status changed from yellow to yellow - No existing Kibana index found
  log   [05:46:14.699] [info][status][plugin:elasticsearch@5.3.3] Status changed from yellow to green - Kibana index ready
  log   [05:46:14.702] [info][status][ui settings] Status changed from yellow to green - Ready

Kibanaのコンソールにアクセスします。

Time-field nameにibm_datetimeを指定して、Createをクリックします。

image.png

Discoverタブに移動すると、ログが送られてきていることが確認できます。

image.png

リポジトリーからLiberty用のダッシュボードのサンプルをダウンロードします。

KibanaコンソールのManagement > Saved Object > Importからダッシュボードをインポートします。

image.png

インポートした内容がいくつかエラーになってしまいました。これはGarbageCollectionなど、検索で使用するいくつかのフォールドについて、実際のログが送られてきていないためです。

Liberty Problem DashboardとTraffic DashboardについてはDashboardタブからダッシュボードの表示が確認できると思います。

image.png

image.png

表示ができない場合、フィールドが検索可能になっていないことが考えられます。
例えば、Management > Index Patternsを確認すると、以下の例ではibm_classNameフィールドがsearchableになっていないので、このフィールドを使うVisualizationやDashboardがエラーになります。

image.png

このフィールドを含むログを出力させた後、Index Patternを再作成することで、フィールドがsearchableとなり、エラーが解消するはずです。

image.png

続き

Libertyのログをjson形式で出力してFilebeatでELKに送る

参考リンク

Logstash のログ・コレクター
Logstash collector

Logstash コレクター V1.0 の使用
Using the Logstash collector version 1.1

Logstash Collector 1.0
Logstash Collector 1.1

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2