主机位于 EDT 时区。事件日志使用 EDT 记录。IIS 日志使用 UTC 记录,我不确定哪个日志解析器构造有助于解释 UTC。
例如,Windows事件日志,以当地时间登录,可以使用以下方式检索过去 20 分钟登录的条目:
>logparser "SELECT * FROM Application WHERE TimeGenerated >= TO_LOCALTIME( SUB( SYSTEM_TIMESTAMP(), TIMESTAMP( '20', 'mm' ) ) )"
如何检索前 3 分钟记录的 IISW3C 格式的日志条目?
经过进一步审查,我在 SYSTEM_TIME() 的帮助条目中找到了此示例,即检索当前小时内记录的 IIS 日志条目:
logparser -i:IISW3C "SELECT * FROM <1> WHERE date = SYSTEM_DATE() AND time >= QUANTIZE( SYSTEM_TIME(), 3600 )" -o:NAT
当前尝试检索过去 180 秒(我想是吧?),仍在尝试理解它...;-)
logparser -i:IISW3C "SELECT Time, Date, cs-uri-stem FROM <1> WHERE date = SYSTEM_DATE() AND time >= QUANTIZE( SYSTEM_TIME(), 180 )" -RTP:-1
您还能推荐其他建议或方法吗?
答案1
好的,我意识到我正在回复一篇一年多前的帖子,但我知道有些谷歌用户会发现这些信息很有用。下面是我查询过去 X 分钟(或几小时或几秒)的 IIS 条目的方法。
"select TO_LOCALTIME(time), c-ip, cs-method, sc-status, cs-uri-stem from <1> where TIME > SUB(SYSTEM_TIME(), TO_TIMESTAMP('00:05:00','hh:mm:ss'))"
通过将 SYSTEM_TIME() 更改为 SYSTEM_TIMESTAMP() 并编辑 TO_TIMESTAMP() 中指定的格式,可以将其扩展为最后一天、月份、年份(假设您没有对 logparser 使用 -mindatemod 选项)。
记住日志解析器的时间格式也很有帮助:“yyyy-MM-dd hh:mm:ss”
—MBB
答案2
例子:
TO_LOCALTIME(TO_TIMESTAMP(date, time)) AS [LocalTime]
然后你应该能够抓取 3 分钟后的所有内容,为此我会SYSTEM_TIMESTAMP()
在你的 中使用它QUANTIZE
。
例子:
logparser "select top 10 TO_LOCALTIME(SYSTEM_TIMESTAMP()), SUB(TO_LOCALTIME(SYSTEM_TIMESTAMP()), TIMESTAMP('0000-01-01 00:03', 'yyyy-MM-dd HH:mm')) from \\192.168.1.104\wwwroot\ex*.log"
这将返回当前系统时间和 3 分钟前的时间。因此,您的 WHERE 子句大致如下LocalTime > SUB(TO_LOCALTIME(SYSTEM_TIMESTAMP()), TIMESTAMP('0000-01-01 00:03', 'yyyy-MM-dd HH:mm'))
logparser "select top 10 TO_LOCALTIME(TO_TIMESTAMP(date, time)) AS [LocalTime], * FROM \\192.168.1.104\wwwroot\ex*.log WHERE LocalTime > SUB(TO_LOCALTIME(SYSTEM_TIMESTAMP()), TIMESTAMP('0000-01-01 00:03', 'yyyy-MM-dd HH:mm'))"
请记住,日期和时间将采用 UTC,因此请确保在与它们进行比较之前将每个实例转换为本地时间。
当然,您可以只在日志文件的时区内工作,这将从TO_LOCALTIME
您的最终 WHERE 子句中删除。