ことの始まり
Splunkにログを入れるときに、host,source,sourcetype,indexあたりのFieldは必須のFieldであり、サーチするとDefaultで必ず抽出されるわけですが、Default Fieldはその他にも、linecount,splunk_server,date_hour,date_wdayなどいくつも抽出されます。このdate_*をどのように使うかは結構アイデア次第だと思います。残業時間を(date_hour<9 OR date_hour>18)と表すところを目の当たりにしたとき、なるほどな〜、と少し感動しました。それ以降、date_*を意識して使うようにしています。
そこにあると思ったらない
本日の現場でdate_hourとdate_wdayを使ってサーチをしたら、結果が出てこないのであわくってしまいました。画像は再現環境ですが、見事にdate_*のFieldがないわけです。最初はBugかと思いましたが、こんなBugが放置されているわけないので、周りの人に調べてもらった結果、date_*はいつでも抽出されるわけではないことがわかりました。
マニュアルみると、Index時にTimezoneをいじったら出てこないとか、いくつか制限があることがわかります。
https://docs.splunk.com/Documentation/Splunk/7.1.1/Knowledge/Usedefaultfields
また、以下のAnswersには、Modular Input系だと同様にでてこないとコメントされています。回答者はなんでこんな仕様を知っているのか謎ですが。
https://answers.splunk.com/answers/221233/why-are-date-fields-are-not-being-extracted-from-w.html
そのため、UFを使って、Windowsイベントログや Perfmonデータを取り込んでいる場合には、date_* は抽出されないということになります。
ワークアラウンド
最初、rexで頑張る必要があるのかと思われましたが、date_wdayはどうやるんだかわからず悩んでいたところ、「evalを使え」という話でした。以下のようなevalをサーチの後ろに差し込むことで、解決しました。| eval a = strftime(_time, "%a"), w = strftime(_time, "%w")
evalをマスターすることは本当に重要ですね。