需求来源:记载Application的错误日志,写Event Log到System中。
Event Log机制分析:
解决方案:
1:.NET部署WebService写Event Log到System
.NET中提供了功能强大的EventLog类,可以很方便的写入,WebService集中式部署,管理也很方便。
可是不足的是WebService权限的问题,每次写Event Log需要注册Event Source(因为Source不是固定的,所以无法提前注册)到Application节点,这就要求WebService具有Administrator权限,可以向系统注册表中添加节点以完成Source的注册。这样就需要对ASPNET用户赋Admin权限,安全性就会降低。所以这种方案就流产了。
2:VB写COM组件调用API函数写Event Log到System
如上图所示,是写Event到System的流程图。这里注册Source用到的API函数为advapi32.dll中的RegisterEventSource函数,对应的关闭关联函数为DeregisterEventSource。写日志到System则调用ReportEvent函数实现。
在写COM的过程中,还发现一个比较好玩的东西,就是,Event Log有一个MachineName的属性,将其赋值为同事的电脑名称,结果照样可以写入Log(日志攻击?)。后来测试,不同网域居然也可以写入,怀疑只要是在同一个局域网内都是可以写入的(具体原因还没有搞清楚)。
COM有一个比较好的优点就是:可以被我们现有的几乎所有的语言开发的系统所调用。
VB:将该COM Add Reference到程序,创建EventLog对象,写入相应属性并调用WriteEventLog方法实现Event Log的写入
ASP:注册COM到Web Server,创建COM EventLog对象,其余同VB
.NET:注册COM到Web Server,Add Rerference到Application,就可以象使用其他类的方式去使用了
Store Procedure(SQL Server):可以参考(http://blog.csdn.net/venus0314/archive/2005/07/12/422387.aspx)
Java:目前正在Try的过程中
Unix上Pro*C:初步设想通过FTP将Pro*C生成Log导入到NT中
所以目前,2方案只能说是部分成熟,还有待于进一步研究。
不过这次通过做这个东东,了解了很多关于WebService和COM方面的知识,收获不小