我想要设置一个计划任务,每隔十五分钟在工作 Web 服务器上运行一次,该任务将在今天的 IIS 日志文件上运行 LogParser,并将其插入 SQL Server 数据库表中。
我如何确保没有复制任何重复的数据但同时确保所有记录都已被复制?
此外,我如何才能让 LogParser 始终查看今天的日志文件,而无需运行昂贵的查询(例如SELECT * FROM ex*.log
使用日期和时间条件)?
到目前为止我一直在玩的是:
SELECT *
FROM \\Path\To\Logs\ex*.log
WHERE date = SYSTEM_DATE()
AND time > SUB(SYSTEM_TIME(), TO_TIMESTAMP('00:30', 'hh:mm'))
但是,如果我每半小时运行一次,我肯定会得到重复的条目。此外,如果它因某种原因不起作用,我最终会丢失数据,我只需每天早上覆盖前一天的整个文件即可消除这些数据。
有小费吗?
答案1
您检查过“-iCheckPoint”开关吗?它存储上次运行的时间戳,并且仅访问后续记录。
答案2
经过一番尝试后,我实际上可以回答我自己的部分问题。
能够查看今天的 IIS 日志的代码是:
SELECT *
FROM \\Path\To\Logs\ex%date:~8,2%%date:~3,2%%date:~0,2%.log
我不确定这是否适用于非英国标准的日期,但这对我来说是可行的。上面的代码为今天的日期 24/02/2011 生成了以下内容:
SELECT *
FROM \\Path\To\Logs\ex110224.log
答案3
我通过在 SQL 服务器表的 RecordNumber 列上创建 PRIMARY KEY 来解决了这个问题,这有助于阻止重复。
此外,在集群环境中,我通过在(ComputerName,RecordNumber)上创建复合 PRIMARY KEY 来解决这个问题,而且效果非常好,因为它在我的环境中始终是一个唯一的组合。
当在 LOG PARSER 中有意测试重复的日志解析时,它会在 LOG PARSER 屏幕上显示预期的“主键冲突”错误......并且问题已解决。