2020年7月22日水曜日

英語版WindowsなのにSplunkに取り込んだイベントログが日本語に

ことのはじまり

タイトルの通りで、Windows 2016で英語版使っているはずなのにSplunkにとりこんだイベントが日本語でとりこまれます、と問い合わせを受けて調査をしていました。
結論からいうとUIロケールとシステムロケールで言語設定が違っていたというものなので、そのあたり詳しい方は読んで頂く必要はありません。

どういうことだったのか?

「イベントビューワーでみると英語なのに、Splunkで見ると日本語です」ということでした。そんなことあるわけないでしょ、と思いながらも実機を確認したら本当でした。(※画像は再現環境)


何が原因だったのか?

WindowsはUIロケールとシステムロケールが別れています。特に深いことを考えずにインストーラーからSplunkをインストールすると、Splunkは、Local Systemで実行されます。そのため、Splunkが取得するイベントはシステムロケールに依存します。

対して、イベントビューワーはログオンしているアカウントのロケールに依存するため、たとえAdministratorで開いたイベントビューワーが英語で表示されているとしても、Splunkが読み込む言語とは関係ありません。
確認したポイントはリージョン設定の管理タブのところです。
今回、事象が発生したWindows 2016ではCurrent userのところとWelcome screen のところとで内容が異なっていました。
Welcome screenがシステムロケールとなんの関係があるか疑問に思うかもしれませんが、下部のチェックボックスを見ると、"Welcome screen and system account"となっていて、ここをチェックするとCurrent Userの設定が、Welcome screenにコピーされます。見た目はWelcome screenですが、ここにはsystem account (Local System含む)が含まれるようです。非常に分かりづらいです。
ちなみに、この設定をして"OK"をクリックすると、もう再起動するかキャンセルするかの選択しかないので、事前に設定しておいて、いつの日か再起動するタイミングで反映できればいいや的な対応はできませんでした。

結果

Windows 2016の再起動後に、無事に英語で取り込まれるようになりました。


そもそもなぜ、このような設定になっていたかは不明ですが、おそらく英語版Windowsに日本語パックをインストールしてがちゃがちゃやってしまったのだろうなと推測しています。今回、MSから転職してきた同寮のおかげでサクッと解決しましたが、自分ひとりだったらとりあえず日本語パックをアンインストールしていただろうな、と思いました。Windowsは難しいですね。手伝ってくれた同寮には感謝の気持ちでいっぱいです。

最後に大事なところですが、日本語で取り込まれることで何が問題かというところですが、日本語で取り込んでしまうとフィールド名も日本語になってしまいます。Splunkでフィールド名を日本語にしてしまうと動くことは動くのですが、サポート外となります。あまり意識されない部分なので注意が必要です。



2020年5月13日水曜日

日本企業固有の「月度」で集計したい

ことのはじまり

日本企業では月末締めじゃなくて、途中に締める習慣がある企業があります。思い起こせば、前職でも「20日締め」という仕組みで給料が支払われていました。Splunkでこの月度の考えを入れるときはいつも頭を悩まします。



そんなに悩むことはないかもしれない

timechart コマンドで集計するときに月の始まりと月の終わりを指定できたらいいのですが、そんなOptionはありません。ただし、そもそもそんなに複雑に考えなくとも 月度に収まるように_timeをいじってしまえばいいのだと思います。

以下のようなSPL差し込んで、締め日の前のデータは先月に放り込んでしまえばいいでしょう。20日締めだとしたら、20日以内のデータは20日前にずらしてしまうという考えです。あくまで、span=1mon で時系列を崩しても問題ない集計する前提です。

 | eval date_day=strftime(_time,"%d")
 | eval _time=if(date_day<=20,_time-(86400*20),_time)
 | timechart span=1mon count

date_mday 使っても良いと思いますが、date_mday は抽出されないときがあるので汎用的なevalを入れました。 

2020年2月1日土曜日

CSVにおける括弧の中のカンマ

ことの始まり

CSVの中のStringに,(カンマ)が含まれているが""でくくられていなくて、{}で囲まれている場合で、その{}内のカンマだけを置換したいとときに正規表現でかくとしたらどうなりますか?と聞かれまして、やりかたを探しました。

Stringの例

aaa,bbb,{ccc,ccc,ccc,,,},ddd

正規表現

(?:{|\G(?!^))[^,}]*\K,

感想

アンカー問題だということはわかったのですが、結局自分で考えるより、stackoverflowを探した方が早かったです。
検索ワードはこちら
regex all commas between brackets