如何在Log Parser语句中提取IIS日志的checkedItems参数值?
解决Log Parser提取逗号分隔checkedItems参数的问题
嘿,我之前也遇到过Log Parser处理这类逗号分隔查询参数的头疼问题,核心原因是Log Parser 2.2没有内置的字符串拆分函数,没法直接把checkedItems=A,B里的多个值拆成独立条目统计。不过有两种靠谱的解决方式,结合你的场景给你梳理清楚:
方法1:修改Log Parser SQL(适合固定数量的分隔值)
如果你的checkedItems最多只有2-3个值(比如你例子里的A,B),可以用Log Parser的字符串处理函数手动拆分。先把你的SQL改成这样,既能提取subject,又能拆分出单个的checkedItem值:
SELECT TOP 5 EXTRACT_VALUE(cs-uri-query,'subject') AS Query_subject, -- 拆分第一个checkedItem值 CASE WHEN CHARINDEX(',', EXTRACT_VALUE(cs-uri-query,'checkedItems')) > 0 THEN SUBSTRING(EXTRACT_VALUE(cs-uri-query,'checkedItems'), 1, CHARINDEX(',', EXTRACT_VALUE(cs-uri-query,'checkedItems')) - 1) ELSE EXTRACT_VALUE(cs-uri-query,'checkedItems') END AS CheckedItem, COUNT(*) AS Total FROM C:\temp\LOG\u_ex201007_x.log WHERE cs-uri-stem LIKE '/api/path/get' GROUP BY Query_subject, CheckedItem ORDER BY Total DESC
如果需要提取第二个值,只要再加一个类似的CASE分支就行,但如果checkedItems的数量不固定(比如可能有3个、4个值),这种方法就太繁琐了,这时候推荐用方法2。
方法2:结合你的ASP.NET控制台应用(灵活处理任意数量的分隔值)
既然你已经写了ASP.NET控制台应用,不如把“提取原始数据”和“拆分统计”分开做,效率更高:
- 先用Log Parser把需要的原始字段导出到临时CSV:
SELECT EXTRACT_VALUE(cs-uri-query,'subject') AS Query_subject, EXTRACT_VALUE(cs-uri-query,'checkedItems') AS CheckedItemsList FROM C:\temp\LOG\u_ex201007_x.log WHERE cs-uri-stem LIKE '/api/path/get' INTO C:\temp\TempLogData.csv
- 在控制台应用里读取CSV,用C#的
Split方法拆分逗号分隔值,再统计:
// 示例代码,你可以根据自己的需求调整 var csvLines = File.ReadAllLines(@"C:\temp\TempLogData.csv").Skip(1); // 跳过表头 var stats = new Dictionary<(string Subject, string Item), int>(); foreach (var line in csvLines) { var parts = line.Split(','); if (parts.Length < 2) continue; var subject = parts[0]; var items = parts[1].Split(',', StringSplitOptions.RemoveEmptyEntries); foreach (var item in items) { var key = (subject, item); stats[key] = stats.TryGetValue(key, out int count) ? count + 1 : 1; } } // 输出统计结果 foreach (var (key, total) in stats.OrderByDescending(kv => kv.Value)) { Console.WriteLine($"Subject: {key.Subject}, CheckedItem: {key.Item}, Total: {total}"); }
补充:为什么你原来的查询拿不到checkedItems?
你的原始SQL里根本没加EXTRACT_VALUE(cs-uri-query,'checkedItems')这个字段,所以自然提取不到。就算加上了,Log Parser也会把A,B当成一个整体来分组,而不是拆成两个独立的A和B,这就是没法得到单个值统计的核心原因。
内容的提问来源于stack exchange,提问作者user788448
相关产品推荐
相关产品推荐

