メインコンテンツまでスキップ
Sumo Logic Japanese

formatDate

formatDate operator でログ ファイル内の日付を必要な形式 (米国日付フ形式、欧州形式、タイムスタンプなど) の文字列にできます。 

構文

  • formatDate(<date> [, <format> [, <timeZone>]]) as <field>

結果

形式を指定しないと、米国の日付形式での日付文字列が返されます。タイムゾーンを指定しないと、ユーザのローカル タイムゾーンが使用されます。

パラメーター

  • date - long 型の数値 (ミリ秒)。formatDate は now operator と一緒に使用することもできます。
  • format - Java の SimpleDateFormat に対応した日付と時刻のパターン文字列。
    format の指定方法の詳細については、「タイムスタンプ、タイム ゾーン、時間範囲、および日付形式」を参照してください。
  • timeZone - 「America/Los Angeles」や「Europe/London」などの文字列。

日付形式 YYYY-MM-dd

次のクエリを使用すると、現在の日付が YYYY-MM-dd の形式で返されます。

* | formatDate(now(), "yyyy-MM-dd") as today

そして、「today」という列が作成され、次のような結果が返されます。

FormatDate

欧州日付形式 dd-MM-yyyy

次のクエリを使用すると、「today」列が作成され、日、月、年 (dd-MM-yyyy) の欧州日付形式で現在の日付が返されます。

* | formatDate(now(),"dd-MM-yyyy") as today

結果は次のようになります。

EuropeanDateFormat

タイムスタンプ付きの米国日付形式

この例では、「today」列が作成され、現在の日付がタイムスタンプ付きの米国日付形式 (MM-dd-yyyy HH:mm) で返されます。

* | formatDate(now(), "MM-dd-yyyy HH:mm", "America/New_York") as today

結果は次のようになります。

DateTimestamp

間違ったタイムスタンプを持つメッセージの検索

このクエリは、間違ったタイムスタンプを持つメッセージを検索します。

* | formatDate(_receipttime, "MM/dd/yyyy HH:mm:ss:SSS") as receiptDate
| formatDate(_messageTime, "MM/dd/yyyy HH:mm:ss:SSS") as messageDate
| _receiptTime - _messageTime as delay
| delay / 60000 as delayInMinutes

結果は次のようになります。

間違ったタイムスタンプ

メッセージの古さ

このクエリは、ログ メッセージの古さを調べます。

* | formatDate(_messageTime, "MM/dd/yyyy HH:mm:ss:SSS") as messageDate
| formatDate(now(), "MM/dd/yyyy HH:mm:ss:SSS") as today
| now() as currentTime
| currentTime - _messageTime as messageAge
| messageAge / (60*1000) as messageAgeInMinutes

結果は次のようになります。

メッセージの古さ

曜日ごとのログ メッセージの比較

ログから曜日を抽出するには、_messageTime というメタデータフィールドに格納されているログのタイムスタンプを参照します。また、ログからはどの日付でも抽出でき、formatDate operator を使用して曜日を取得できます。

まず、_messageTime フィールドで曜日を特定してから、formatDate operator を使用して不要な曜日を削除できます。この例では、月曜日の結果のみが返されます。

| formatDate(_messagetime, "EEE") as day
| where day="Mon"

この例では、平日の結果のみが返されます。

| formatDate(_messagetime, "EEE") as day
| where !(day="Sat" or day="Sun")

_messageTime を使用せずに別のタイムスタンプを抽出する場合は、次のようにタイムスタンプをミリ秒に変換してから、曜日を特定できます。

| parseDate(parsedtime, "MM/dd/yyyy HH:mm:ss a") as inMilliseconds

エポック値 (1970 年からのミリ秒) から人間が読める形式への形式

次のクエリでは:

 _sourceCategory=sourceCategory
  | parse "] [*][*][*].[*]" as (user, datasource, session, command) 
  | count, min(_messageTime), max(_messageTime) by session

以下の結果が返されます。

 # session _count _min _max
 1 7oEmE+KLpk1nVYpF 22 1.35844e+12 1.35844e+12
 2 6uklr9UDkTOg79je 412 1.35844e+12 1.35844e+12
 3 q0K6ztX9IvpZWh1p 18 1.35844e+12 1.35844e+12

結果では、_min と _max の値がエポック値として表示されます。実験的な operator である toLong を使用することで、これらのエポック値を人間が読める形式に形式できます。

  • toLong は、データを long 型のミリ秒値にキャストします。

通常は、エポック時を日付フォーマットの文字列に変換するには、次のような操作を行います。

* | formatDate(_messagetime, "MM-dd-yyyy HH:mm:ss") as myDate 

ここでは MinMax を使用して最初と最後の値を取得していますので、実験的な toLong operator を使用して結果を long 型の値にキャストする必要があります。その理由は、Min operator と Max operator で返される値は double 型の値にフォーマットされているため、そのままでは formatDate operator で読むことができないからです。

 * | count, min(_messagetime) as mindate | formatDate(toLong(mindate))

この例では、次のクエリによって適切な日付と時刻の値を得ることができます。

_sourceCategory=sourceCategory
  | parse "] [*][*][*].[*]" as (user, datasource, session, command)
  | count, min(_messagetime) as mindate, max(_messagetime) as maxdate by session
  | formatDate(toLong(mindate),"MM-dd-yyyy HH:mm:ss:SSS") as mindate
  | formatDate(toLong(maxdate),"MM-dd-yyyy HH:mm:ss:SSS") as maxdate

  • この記事は役に立ちましたか?