Iis 日志解析器Case语句

Iis 日志解析器Case语句,iis,logparser,Iis,Logparser,我在日志解析器中使用case语句查找浏览器名称,如, 案例strcnt(cs(用户代理),“MSIE”)当1时,然后是“IE” 但是有些用户代理字段不止一次具有“MSIE”,有没有办法检查>=1 案例strcnt(cs(用户代理),“MSIE”)当>=1时,则为“IE” 或 当strcnt(cs(用户代理),'MSIE')>=1,则为'IE' 我尝试了这些语句,但给出了语法错误 请提供一些其他解决方法来检查多个事件。。 感谢注意:日志解析器的实际发布版本不支持下面所示的CASE语句形式@Gabr

我在日志解析器中使用case语句查找浏览器名称,如, 案例strcnt(cs(用户代理),“MSIE”)当1时,然后是“IE”

但是有些用户代理字段不止一次具有“MSIE”,有没有办法检查>=1

案例strcnt(cs(用户代理),“MSIE”)当>=1时,则为“IE”

当strcnt(cs(用户代理),'MSIE')>=1,则为'IE'

我尝试了这些语句,但给出了语法错误

请提供一些其他解决方法来检查多个事件。。
感谢

注意:日志解析器的实际发布版本不支持下面所示的CASE语句形式@Gabrielle Guiseppe在评论中提到了这一点。


有两种形式的
CASE
语句-一种只允许您执行相等操作(您正在使用的语句),另一种允许您使用任何表达式:

当STRCNT(cs(用户代理),'MSIE')>=1时选择CASE,然后选择'IE'或'FOO'结束

还要注意在
案例
语句的…结尾使用了
END

另一个选择是:


当(cs(用户代理),'MSIE')的索引不为空时选择CASE,然后当(cs(用户代理),'Google')的索引不为空时选择'IE',然后选择'CHROME'或'UNKNOWN'结束

我解决这个问题的方法是使用多个WHEN关键字

CASE strcnt(TO_LOWERCASE(User-Agent),'mobile') when 1 THEN 'Mobile' when 2 THEN 'Mobile' when 3 THEN 'Mobile' else CASE strcnt(TO_LOWERCASE(User-Agent),'feed')  when 1 THEN 'Feed'  when 2 THEN 'Feed'   when 3 THEN 'Feed' ELSE 'Normal' End End 

这包括word mobile最多出现3次。

这就是我的手机的外观。。。它似乎不支持多个when,所以需要嵌套它们

case strcnt(cs(user-agent), 'iPhone') WHEN 1 THEN 'iPhone' ELSE 
    case strcnt(cs(user-agent), 'Android') WHEN 1 THEN 'Android' ELSE
        case strcnt(cs(user-agent), 'iPad') WHEN 1 THEN 'iPad' ELSE 
            'Other'
        END
    END
END

我也有同样的问题,但是iPhone在用户代理字符串中被重复。例如:

Mozilla/5.0+(iPhone;+CPU+iPhone+OS+10_2_1+like+Mac+OS+X)+AppleWebKit/602.4.6+(KHTML,+like+Gecko)+Version/10.0+Mobile/14D27+Safari/602.1
我的解决方案是使用该函数,并利用在未找到搜索字符串时返回null的事实:

...     
case REPLACE_IF_NOT_NULL(INDEX_OF(cs(user-agent),'iPhone'),1) when 1 THEN 'iPhone' else
case REPLACE_IF_NOT_NULL(INDEX_OF(cs(user-agent),'iPad'),1) when 1 THEN 'iPad' else
case REPLACE_IF_NOT_NULL(INDEX_OF(cs(user-agent),'Android'),1) when 1 THEN 'Android' else
...

使用这种格式比其他示例中使用strcnt(…)构造的等效查询运行速度慢约10%,但它解决了iPhone的问题,而且我相信它通常更健壮。

第二个选项应该使用什么版本的logparser?我使用的是2.2.10,我已经多次尝试让这样的查询无误地进行解析。两个查询都使用相同的CASE语句语法,因此如果第一个对您有效,第二个也应该有效。你得到的确切错误是什么?说得清楚,我永远无法得到允许任何表达式工作的CASE语句。为了进行测试,我使用了您的测试用例并尝试运行以下命令:
LogParser-I:W3C-o:CSV“当(cs(用户代理),'MSIE')的索引不为空时选择case,然后当(cs(用户代理),'Google')的索引不为空时选择'IE',然后从C:\logs\*”中选择'CHROME'或'UNKNOWN'
这将导致
错误:语法错误::应为WHEN关键字而不是(cs(用户代理)的标记索引,“
我觉得它是将其解析为仅相等的语法,因为它所抱怨的标记前面有一个WHEN。你完全正确,请接受我的道歉。我使用的是一个版本的LogParser,它从未见过光,并且支持第二种形式的CASE。很抱歉。回到你的问题,你可能会请尝试以下内容:
selectcaseindex_of(cs(uri代理),'MSIE')WHEN-1然后'FOO'ELSE'IE'END
感谢您的回复和澄清!我已经用了很多方法解决了这个问题,但每次都试着回到这个问题,看看我是否遗漏了什么或犯了语法错误。我现在知道不要浪费我的时间。我不认为这个版本现在有任何机会看到曙光。是We’不管怎样,我可能会得到或找到一份副本?