Tx.Windows を使用して IIS W3C ログをCSVに変換してみる
IIS W3C ログをごにょごにょしたい時があります。ログ解析とか。
でも、Log Parserを使ってSQLのようなクエリは書きたくない。思いませんか。
C#でLINQを使って何とかしたい。そんな時には、Tx の Tx.Windows を使いましょう。
GitHub - Microsoft/Tx: Tx (LINQ to Events)
適当ですがコードサンプルを。
args[0] には IIS ログのファイルパスが入っている前提です。
コンソール アプリケーション(.exe)にログファイルをドラッグ&ドロップするイメージ。
using CsvHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using Tx.Windows; namespace TxWindowsSample { class Program { static void Main(string[] args) { if (args.Length > 0 && File.Exists(args[0])) { var records = W3CEnumerable.FromFile(args[0]).Select(x => new { LocalDateTimeLocal = x.dateTime.ToLocalTime(), ClientIPAddress = x.c_ip, Method = x.cs_method, Referrer = x.cs_Referer ?? "NULL", URIQuery = x.cs_uri_query ?? "NULL", URIStem = x.cs_uri_stem, UserAgent = x.cs_User_Agent ?? "NULL", UserName = x.cs_username ?? "NULL", ServerIPAddress = x.s_ip, ServerPort = x.s_port, ProtocolStatus = x.sc_status, ProtocolSubStatus = x.sc_substatus, Win32Status = x.sc_win32_status, TimeTaken = x.time_taken }); using (var writer = new CsvWriter(new StreamWriter(Path.ChangeExtension(args[0], ".csv")))) { writer.WriteRecords(records); } } } } }
実際にログ解析をするなら、.log ファイルから毎度読み出すのは現実的ではないので、
データベースに移した方が良さそうです。ファイルサイズも塵も積もればとんでもないことですし。