kooh-q-hook

いわゆる一つの技術メモ

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 ファイルから毎度読み出すのは現実的ではないので、
データベースに移した方が良さそうです。ファイルサイズも塵も積もればとんでもないことですし。