ログparsingは、定義したルールに基づいて、非構造化ログ データをプロパティ (キーの値のペア) に変換するプロセスです。 これらの属性を NRQL クエリで使用すると、ログを便利な方法でファセット化またはフィルタリングできます。
New Relic は、特定の解析ルールに従ってログ データを自動的に解析します。このドキュメントでは、ログの解析の仕組みと、独自のカスタム解析ルールを作成する方法について学習します。
NerdGraph (GraphQL API) を使用して、ログ解析ルールを作成、クエリ、管理することもできます。これに役立つツールは、 Nerdgraph API Explorer です。詳細については、 解析に関する NerdGraph チュートリアルを 参照してください。
ログの解析に関する 5 分間のビデオを次に示します。
構文解析の例 良い例は、非構造化テキストを含むデフォルトの NGINX アクセス ログです。検索には便利ですが、それ以外はあまり役に立ちません。典型的な行の例を次に示します。
127.180.71.3 - - [10/May/1997:08:05:32 +0000] "GET /downloads/product_1 HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"
解析されていない形式では、ほとんどの質問に答えるために全文検索を行う必要があります。解析後、ログはresponse code
やrequest URL
などの属性に整理されます。
"remote_addr" : "93.180.71.3" ,
"path" : "/downloads/product_1" ,
"user_agent" : "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"
解析により、これらの値をファセットするカスタムクエリ を簡単に作成できます。これは、リクエストURLごとの応答コードの分布を理解し、問題のあるページをすばやく見つけるのに役立ちます。
ログ解析のしくみ NewRelicがログの解析を実装する方法の概要は次のとおりです。
ログの解析
使い方
何
解析は、選択された特定のフィールドに適用されます。デフォルトでは、 message
フィールドが使用されます。ただし、現在データに存在しないものであっても、任意のフィールド/属性を選択できます。 各解析ルールは、ルールが解析を試みるログを決定する NRQL WHERE
句を使用して作成されます。 照合プロセスを簡素化するために、 logtype
属性をログに追加することをお勧めします。ただし、使用できるのはlogtype
に限定されません。 NRQL WHERE
句で一致基準として1つ以上の属性を使用できます。 いつ
解析は、各ログメッセージに1回だけ適用されます。複数の解析ルールがログに一致する場合、成功した最初のルールのみが適用されます。 解析ルールには順序がありません。複数の解析ルールがログに一致する場合、ランダムに 1 つが選択されます。同じログに一致しないように解析ルールを構築してください。 解析は、データがNRDBに書き込まれる前に、ログの取り込み中に行われます。データがストレージに書き込まれると、それを解析することはできなくなります。 パイプラインで解析が行われ、 before データの強化が行われます。 解析ルールの一致基準を定義するときは注意してください。 条件が解析またはエンリッチメントが行われるまで存在しない属性に基づいている場合、一致が発生したときにそのデータはログに存在しません。 その結果、解析は行われません。 どのように
ルールは、 Grok 、正規表現、またはその 2 つの組み合わせで記述できます。Grok は、複雑な正規表現を抽象化するパターンのコレクションです。 解析 UI では Java Regex 構文をサポートしています。 キャプチャ グループ内の属性名またはフィールド名の場合、Java Regex では [A-Za-z0-9] のみが許可されます。
Grokを使用して属性を解析する 解析パターンは、ログ メッセージ解析の業界標準である Grok を使用して指定されます。logtype
フィールドを持つ受信ログは、組み込みの解析ルール に照らしてチェックされ、可能であれば、関連する Grok パターンがログに適用されます。
Grokは正規表現のスーパーセットであり、リテラルの複雑な正規表現の代わりに使用される組み込みの名前付きパターンを追加します。たとえば、整数を正規表現(?:[+-]?(?:[0-9]+))
と一致させることができることを覚えておく代わりに、 %{INT}
と書くだけで、同じ正規表現を表すGrokパターンINT
を使用できます。
Grokパターンの構文は次のとおりです。
%{PATTERN_NAME[:OPTIONAL_EXTRACTED_ATTRIBUTE_NAME[:OPTIONAL_TYPE[:OPTIONAL_PARAMETER]]]}
どこ:
PATTERN_NAME
サポートされている Grok パターンの 1 つです。パターン名は、正規表現を表すわかりやすい名前です。それらは、対応する正規表現とまったく同じです。OPTIONAL_EXTRACTED_ATTRIBUTE_NAME
、指定されている場合は、パターン名と一致する値でログメッセージに追加される属性の名前です。これは、正規表現を使用して名前付きキャプチャグループを使用するのと同じです。これが指定されていない場合、解析ルールは文字列の領域に一致するだけで、その値で属性を抽出しません。OPTIONAL_TYPE
抽出する属性値のタイプを指定します。省略した場合、値は文字列として抽出されます。たとえば、 "File Size: 123"
から値123
を数値として属性file_size
に抽出するには、 value: %{INT:file_size:int}
を使用します。OPTIONAL_PARAMETER
特定のタイプに対してオプションの難点を指定します。 現在、 datetime
タイプのみが問題をとります。詳細については、以下を参照してください。一致する文字列で正規表現と Grok パターン名を組み合わせて使用することもできます。
サポートされているGrok パターン のリストについては、このリンクをクリックしてください。サポートされているGrok タイプ のリストについては、ここをクリックしてください。
変数名は明示的に設定し、 %{URI:uri}
のように小文字にする必要があることに注意してください。%{URI}
や%{URI:URI}
などの式は機能しません。
Grokの例:ログから有用なデータを取得する ログレコードは次のようになります。
"message" : "54.3.120.2 2048 0"
この情報は正確ですが、それが何を意味するのか正確には直感的ではありません。 Grokパターンは、必要なテレメトリデータを抽出して理解するのに役立ちます。たとえば、次のようなログレコードははるかに使いやすいです。
これを行うには、これら3つのフィールドを抽出するGrokパターンを作成します。例えば:
%{IP:host_ip} %{INT:bytes_received} %{INT:bytes_sent}
処理後、ログレコードにはフィールドhost_ip
、 bytes_received
、およびbytes_sent
が含まれます。 New Relicでこれらのフィールドを使用して、ログデータのフィルタリング、ファセット、統計操作を実行できるようになりました。 New RelicでGrokパターンを使用してログを解析する方法の詳細については、ブログ投稿を参照して ください。
UIの例:Grok解析ルールの作成 適切な権限がある場合は、UIで解析ルールを作成して、Grok解析を作成、テスト、および有効にすることができます。たとえば、Inventory Servicesと呼ばれるマイクロサービスの1つについて特定の種類のエラーメッセージを取得するには、特定のエラーメッセージと製品を検索するGrok解析ルールを作成します。これをする:
ルールに名前を付けます。たとえば、 Inventory Services error parsing
。
解析する既存のフィールドを選択するか (デフォルト = message
)、新しいフィールド名を入力します。
着信ログのプレフィルターとして機能する NRQL WHERE
句を特定します。たとえば、 entity.name='Inventory Service'
です。このプレフィルターは、ルールで処理する必要があるログの数を絞り込み、不要な処理を削除します。
一致するログが存在する場合はそれを選択するか、[ログの貼り付け] タブをクリックしてサンプル ログに貼り付けます。
Grok解析ルールを追加します。例えば:
Inventory error: %{DATA:error_message} for product %{INT:product_id}
どこ:
Inventory error
:解析ルールの名前error_message
:選択したいエラーメッセージproduct_id
:在庫サービスの製品ID解析ルールを有効にして保存します。
すぐに、InventoryServiceログが2つの新しいフィールドerror_message
とproduct_id
で強化されていることがわかります。ここから、これらのフィールドのクエリ、チャートやダッシュボードの作成、アラートの設定などを行うことができます。
詳細については、UI でカスタム解析ルールを追加するためのドキュメントを 参照してください。
サポートされている Grok 型 OPTIONAL_TYPE
フィールドは、抽出する属性値のタイプを指定します。省略した場合、値は文字列として抽出されます。
サポートされているタイプは次のとおりです。
Grokで指定されたタイプ
NewRelicデータベースに保存されているタイプ
boolean
boolean
byte
short
int
integer
integer
long
long
float
float
double
double
string
(デフォルト) text
string
date
datetime
時間としての long
デフォルトでは ISO 8601 として解釈されます。 OPTIONAL_PARAMETER
が存在する場合、 datetime
を解釈するために使用する日付と時刻のパターン文字列 を指定します。
これは解析中にのみ使用できることに注意してください。 取り込みパイプラインの後半で、すべてのログに対して実行される追加の個別のタイムスタンプ解釈ステップ があります。
json
JSON 構造化データ。詳細については、プレーン テキストと混合した JSON の解析 を参照してください。
csv
CSV データ。詳細については、 CSV の解析 を参照してください。
geo
IP アドレスからの地理的位置。詳細については 、「地理位置情報 IP アドレス (GeoIP)」 を参照してください。
Grok の複数行の解析 複数行のログがある場合は、 GREEDYDATA
Grok パターンが改行と一致しないことに注意してください (これは .*
と同等です)。
したがって、 %{GREEDYDATA:some_attribute}
を直接使用する代わりに、その前に複数行のフラグを追加する必要があります。 (?s)%{GREEDYDATA:some_attribute}
プレーンテキストと混合した JSON の解析 New Relic ログ パイプラインは、デフォルトでログ JSON メッセージを解析しますが、JSON ログ メッセージがプレーン テキストと混在している場合があります。この状況では、それらを解析して、JSON 属性を使用してフィルタリングできるようにする必要がある場合があります。その場合は、 json
grok type を使用できます。これは、grok パターンによってキャプチャされた JSON を解析します。この形式は、grok 構文、解析された json 属性に割り当てるプレフィックス、 json
grok タイプ の 3 つの主要部分に依存しています。json
grok type を使用すると、適切にフォーマットされていないログから JSON を抽出して解析できます。たとえば、ログに日付/時刻の文字列がプレフィックスとして付けられている場合:
2015 -05 -13T23 : 39 : 43 .945958Z { "event" : "TestRequest" , "status" : 200 , "response" : { "headers" : { "X-Custom" : "foo" } } , "request" : { "headers" : { "X-Custom" : "bar" } } }
このログ形式から JSON データを抽出して解析するには、次の Grok 式を作成します。
%{TIMESTAMP_ISO8601:containerTimestamp} %{GREEDYDATA:my_attribute_prefix:json}
結果のログは次のとおりです。
containerTimestamp: "2015-05-13T23:39:43.945958Z"
my_attribute_prefix.event: "TestRequest"
my_attribute_prefix.status: 200
my_attribute_prefix.response.headers.X-Custom: "foo"
my_attribute_prefix.request.headers.X-Custom: "bar"
オプションkeepAttributes
またはdropAttributes
を使用して、抽出または削除する属性のリストを定義できます。 たとえば、次の Grok 式の場合:
%{TIMESTAMP_ISO8601:containerTimestamp} %{GREEDYDATA:my_attribute_prefix:json({"keepAttributes": ["my_attribute_prefix.event", "my_attribute_prefix.response.headers.X-Custom"]})}
結果のログは次のとおりです。
containerTimestamp: "2015-05-13T23:39:43.945958Z"
my_attribute_prefix.event: "TestRequest"
my_attribute_prefix.request.headers.X-Custom: "bar"
my_attribute_prefix
プレフィックスを省略したい場合は、設定に"noPrefix": true
含めることができます。
%{TIMESTAMP_ISO8601:containerTimestamp} %{GREEDYDATA:my_attribute_prefix:json({"noPrefix": true})}
my_attribute_prefix
プレフィックスを省略し、 status
属性のみを保持する場合は、設定に"noPrefix": true
と"keepAttributes: ["status"]
を含めることができます。
%{TIMESTAMP_ISO8601:containerTimestamp} %{GREEDYDATA:my_attribute_prefix:json({"noPrefix": true, "keepAttributes": ["status"]})}
JSON がエスケープされている場合は、 isEscaped
オプションを使用して解析できます。 JSON がエスケープされてから引用符で囲まれている場合は、以下に示すように引用符も一致させる必要があります。 たとえば、次の Grok 式の場合:
%{TIMESTAMP_ISO8601:containerTimestamp} "%{GREEDYDATA:my_attribute_prefix:json({"isEscaped": true})}"
エスケープされたメッセージを解析することができます:
2015-05-13T23:39:43.945958Z "{\"event\": \"TestRequest\", \"status\": 200, \"response\": {\"headers\": {\"X-Custom\": \"foo\"}}, \"request\": {\"headers\": {\"X-Custom\": \"bar\"}}}"
結果のログは次のとおりです。
containerTimestamp: "2015-05-13T23:39:43.945958Z"
my_attribute_prefix.event: "TestRequest"
my_attribute_prefix.status: 200
my_attribute_prefix.response.headers.X-Custom: "foo"
my_attribute_prefix.request.headers.X-Custom: "bar"
json
Grok タイプ を構成するには、 :json(_CONFIG_)
を使用します。
json({"dropOriginal": true})
: 解析で使用された JSON スニペットをドロップします。true
(デフォルト値) に設定すると、解析ルールは元の JSON スニペットを削除します。JSON 属性はメッセージ フィールドに残ることに注意してください。json({"dropOriginal": false})
: 抽出された JSON ペイロードが表示されます。false
に設定すると、完全な JSON のみのペイロードが上記のmy_attribute_prefix
で指定された属性の下に表示されます。ここでは、JSON 属性がメッセージ フィールドに残り、ユーザーに JSON データの 3 つの異なるビューを提供することに注意してください。3 つのバージョンすべての保存が懸念される場合は、ここでデフォルトのtrue
を使用することをお勧めします。json({"depth": 62})
: JSON 値を解析する深さのレベル (デフォルトは 62)。json({"keepAttributes": ["attr1", "attr2", ..., "attrN"]})
: JSON から抽出する属性を指定します。提供されたリストを空にすることはできません。この構成オプションが設定されていない場合は、すべての属性が抽出されます。json({"dropAttributes": ["attr1", "attr2", ..., "attrN"]})
: JSON から削除する属性を指定します。 この構成オプションが設定されていない場合、属性は削除されません。json({"noPrefix": true})
: JSON から抽出された属性からプレフィックスを削除するには、このオプションを true
に設定します。json({"isEscaped": true})
: エスケープされたJSONを解析するには、このオプションをtrue
に設定します(これは通常、JSONが文字列化されたときに表示されます。たとえば、 {\"key\": \"value\"}
)。CSV の解析 システムがコンマ区切り値 (CSV) ログを送信し、それらを New Relic で解析する必要がある場合は、Grok パターンによってキャプチャされた CSV を解析するcsv
Grok タイプ を使用できます。この形式は、Grok 構文、解析された CSV 属性に割り当てる接頭辞、およびcsv
Grok タイプ の 3 つの主要部分に依存しています。csv
Grok タイプ を使用すると、ログから CSV を抽出して解析できます。
例として、次の CSV ログ行があるとします。
"2015-05-13T23:39:43.945958Z,202,POST,/shopcart/checkout,142,10"
そして、次の形の解析規則:
%{GREEDYDATA:log:csv({"columns": ["timestamp", "status", "method", "url", "time", "bytes"]})}
ログを次のように解析します。
log.timestamp: "2015-05-13T23:39:43.945958Z"
log.url: "/shopcart/checkout"
「ログ」プレフィックスを省略する必要がある場合は、構成に"noPrefix": true
を含めることができます。
%{GREEDYDATA:log:csv({"columns": ["timestamp", "status", "method", "url", "time", "bytes"], "noPrefix": true})}
列の構成: CSV Grok タイプ構成 (有効な JSON である必要があります) で列を示すことは必須です。 列名として "_" (アンダースコア) を設定して、結果のオブジェクトから削除することにより、任意の列を無視できます。 オプションの構成オプション: 「列」構成は必須ですが、次の設定で CSV の解析を変更することができます。
dropOriginal : (デフォルトはtrue
) 解析に使用される CSV スニペットを削除します。 true
(デフォルト値) に設定すると、解析ルールによって元のフィールドが削除されます。noPrefix : (デフォルトはfalse
) 結果のオブジェクトのプレフィックスとして Grok フィールド名を含めません。separator : (デフォルトは,
) 各列を分割する文字/文字列を定義します。もう 1 つの一般的なシナリオは、タブ区切り値 (TSV) です。そのため、セパレータとして\t
を指定する必要があります。 %{GREEDYDATA:log:csv({"columns": ["timestamp", "status", "method", "url", "time", "bytes"], "separator": "\t"})
quoteChar : (デフォルトは"
) 列の内容をオプションで囲む文字を定義します。IP アドレスの位置情報 (GeoIP) システムが IPv4 アドレスを含むログを送信する場合、New Relic はそれらを地理的に特定し、指定された属性でログ イベントを充実させることができます。 geo
Grok タイプ を使用できます。これは、Grok パターンによってキャプチャされた IP アドレスの位置を見つけます。この形式は、住所に関連する 1 つ以上のフィールド (都市、国、IP の緯度/経度など) を返すように構成できます。
例として次のログ行があるとします。
2015-05-13T23:39:43.945958Z 146.190.212.184
そして、次の形の解析規則:
%{TIMESTAMP_ISO8601:containerTimestamp} %{GREEDYDATA:ip:geo({"lookup":["city","region","countryCode", "latitude","longitude"]})}
ログは次のように解析されます。
ip.countryName: United States
ip.regionName: New Jersey
containerTimestamp:2015-05-13T23:39:43.945958Z
ルックアップ構成: geo
アクションによって返される目的の lookup
フィールドを指定することは必須です。次のオプションから少なくとも 1 つのアイテムが必要です。
city : 都市名countryCode : 国の略称countryName : 国名latitude : 緯度longitude : 経度postalCode : 郵便番号、ZIPコード、または類似の番号region : 州、県、または地域の略語regionName : 州、県、または地域の名前ログタイプによる整理 New Relicのログ取り込みパイプラインは、ログイベントをログの解析方法を説明するルールと照合することでデータを解析できます。ログイベントを解析する方法は2つあります。
ルールは、マッチング ロジックと解析ロジックの組み合わせです。照合は、ログの属性でクエリ照合を定義することによって行われます。ルールはさかのぼって適用されません。ルールが作成される前に収集されたログは、そのルールによって解析されません。
ログとその解析方法を整理する最も簡単な方法は、ログ イベントにlogtype
フィールドを含めることです。これにより、どの組み込みルールをログに適用するかが New Relic に伝えられます。
重要 解析ルールがアクティブになると、ルールによって解析されたデータは完全に変更されます。これは元に戻せません。
制限 解析は計算コストが高く、リスクが伴います。解析は、アカウントで定義されたカスタムルールと、パターンをログに一致させるために行われます。多数のパターンまたは不十分に定義されたカスタムルールは、完了するのに非常に長い時間がかかる一方で、大量のメモリとCPUリソースを消費します。
問題を防ぐために、ルールごととアカウントごとの2つの解析制限を適用します。
制限
説明
ルールごとのメッセージごと
ルールごとのメッセージごとの制限により、単一のメッセージの解析に費やされる時間が100ミリ秒を超えることはありません。その制限に達すると、システムはそのルールでログメッセージを解析しようとするのをやめます。
取り込みパイプラインは、そのメッセージに該当する他のメッセージを実行しようとしますが、メッセージは引き続き取り込みパイプラインを通過してNRDBに保存されます。ログメッセージは、元の未解析の形式になります。
アカウントごと
アカウントごとの制限は、アカウントがリソースを公平な割合を超えて使用することを防ぐために存在します。 この制限には、 all のログメッセージの処理に費やされる 1 分あたりの合計時間が考慮されます。0
組み込みの解析ルール 一般的なログ形式には、確立された解析ルールがすでに作成されています。組み込みの解析ルールを利用するには、ログを転送するときにlogtype
属性を追加します。次の表にリストされている値に値を設定すると、そのタイプのログのルールが自動的に適用されます。
組み込みルールのリスト 次のlogtype
属性値は、事前定義された解析ルールにマップされます。たとえば、アプリケーションロードバランサーをクエリするには、次のようにします。
New Relic UIから、形式logtype:"alb"
を使用します。 NerdGraph から、形式logtype = 'alb'
を使用します。各ルールで解析されるフィールドについては、組み込みの解析ルールに関する ドキュメントを参照してください。
追加する logtype
ログを集約するときは、それらのログの整理、検索、および解析を容易にするメタデータを提供することが重要です。これを行う簡単な方法の 1 つは、送信時にログ メッセージに属性logtype
を追加することです。組み込みの解析規則 は、デフォルトで特定のlogtype
値に適用されます。
ヒント フィールドlogType
、 logtype
、およびLOGTYPE
はすべて、組み込みルールでサポートされています。検索を容易にするために、組織内の単一の構文に合わせるようにすることをお勧めします。
サポートされている配送方法 のいくつかによって送信されたログにlogtype
を追加する方法の例を次に示します。
NewRelicインフラストラクチャエージェントの例 logtype
をattribute
として追加します。名前付きソースごとにログタイプを設定する必要があります。
流暢な例 .conf
ファイルにフィルター ブロックを追加します。このブロックでは、 record_transformer
を使用して新しいフィールドを追加します。 この例では、 nginx
のlogtype
を使用して、組み込みの NGINX 解析ルールをトリガーします。 他のFluentd の例 を確認してください。
流暢なビットの例 record_modifier
を使用して新しいフィールドを追加するフィルターブロックを.conf
ファイルに追加します。この例では、 nginx
のlogtype
を使用して、組み込みのNGINX解析ルールをトリガーします。他のFluentBitの例 を確認してください。
Record hostname ${HOSTNAME}
Record service_name Sample-App-Name
Logstashの例 add_field
変異フィルターを使用して新しいフィールドを追加するLogstash構成にフィルターブロックを追加します。この例では、 logtype
のnginx
を使用して、組み込みのNGINX解析ルールをトリガーします。他のLogstashの例 を確認してください。
"service_name" = > "myservicename"
LogsAPIの例 NewRelicに送信されるJSONリクエストに属性を追加できます。この例では、値nginx
のlogtype
属性を追加して、組み込みのNGINX解析ルールをトリガーします。 LogsAPI の使用の詳細をご覧ください。
Host: log-api.newrelic.com
Content-Type: application/json
X-License-Key: YOUR_LICENSE_KEY
"timestamp": TIMESTAMP_IN_UNIX_EPOCH,
"message": "User 'xyz' logged in",
"service": "login-service",
"hostname": "login.example.com"
カスタム解析ルールを作成して表示する 多くのログは、独自の方法でフォーマットまたは構造化されています。それらを解析するには、カスタムロジックを構築して適用する必要があります。
ログ UI の左側のナビゲーションからParsing を選択し、有効な NRQL WHERE
句と Grok パターンを使用して独自のカスタム解析ルールを作成します。
独自のカスタム解析ルールを作成および管理するには、次のようにします。
one.newrelic.com > All capabilities > Logs に移動します。ログ UI の左側のナビゲーションのManage data から、 Parsing をクリックし、次にCreate parsing rule をクリックします。 新しい解析規則の名前を入力します。 解析する既存のフィールドを選択するか (デフォルト = message
)、新しいフィールド名を入力します。 解析するログに一致する有効な NRQL WHERE
句を入力してください。 一致するログが存在する場合はそれを選択するか、 Paste log タブをクリックしてサンプル ログを貼り付けます。 ログUIまたは書き込みビルダーからテキストをコピーして解析UIに貼り付ける場合は、それが Unformatted バージョンであることを確認してください。 解析ルールを入力し、 Output セクションの結果を表示してそれが機能していることを確認します。 Grok とカスタム解析ルールの詳細については、 Grok パターンを使用してログを解析する方法に関するブログ投稿を お読みください。 カスタム解析ルールを有効にして保存します。 既存の解析ルールを表示するには:
one.newrelic.com > All capabilities > Logs に移動します。ログ UI の左側のナビゲーションにあるManage data から、 Parsing をクリックします。 トラブルシューティング 解析が意図したとおりに機能しない場合は、次のことが原因である可能性があります。
Logic: 解析ルールの一致ロジックが、必要なログと一致しません。Timing: 解析一致ルールがまだ存在しない値である場合、失敗します。 これは、エンリッチメント プロセスの一部としてパイプラインの後半で値が追加された場合に発生する可能性があります。Limits: 解析、パターン、ドロップ フィルターなどを使用してログを処理するために、1 分ごとに一定の時間が利用できます。 最大時間が経過した場合、追加のログイベント レコードの解析はスキップされます。これらの問題を解決するには、カスタム解析ルール を作成または調整します。