日志
日志就是软件为自己写的日记,每一条日志记录用来记叙一件事。
日志包含的元素一般有(有点像写记叙文的几大元素=.=):
- 时间:所记录时间的发生时间,通常至少精确到分钟级别。
- 地点:用来定位所记录事件发生时的“位置信息”,通常包括机器名(本机记录的话可以省略),进程ID、线程ID等。
- 主题(来源):即该事件的实施者,根据需要可以是服务名称、模块名称或类名和函数名。
- 事件:对所发生的事件的描述
- 类型(严重程度):该事件的严重程序,可以分为信息(information)、警告(warning)、错误(error)等,根据需求可划分更详细的等级。
ELF服务
- 在Windows系统默认启动的服务中,该服务负责事件日志的服务,其名称为Event Log,简称为ELF服务。
- 日志服务是自动启动的,并且是不可停止的。在任务管理器中也不允许杀掉Services.EXE。如果强行杀掉它,那么系统检测到就会自动关机(罢工啦︿( ̄︶ ̄)︿)
- ELF是以表格的形式来存储日志记录的,表格的每一行对应一条日志记录,存储着这条记录的基本信息和复数信息的偏移地址。
添加日志记录到ELF
- 在注册表中注册事件源
- 调用ELF的API来取的事件源句柄:RegisterEventSource
HANDLE RegisterEventSource(
LPCSTR lpUNCServerName, //用来指定按UNC规范表示的机器名,如果是操作本机的日志文件,那么只要指定NULL
LPCSTR lpSourceName //用来指定事件源名称,与第一步中注册的子键名一致。如果事件源名称在指定机器的注册表中不存在,那么系统会使用默认的应用类日志下的Application事件源。
);
- 添加日志记录API:ReportEvent,这个API不会直接去写日志文件,而是将日志记录发送给ELF服务
BOOL ReportEvent(
HANDLE hEventLog, //事件源句柄,第2步获取到的那个
WORD wType, //指定事件的类型
WORD wCategory, //用来指定事件在事件源中的类属号,其分类规则是应用程序所定义的
DWORD dwEventID, //用来指定事件的ID号,ELF通过这个ID值定位这条日志所对应的格式信息。由应用软件定义的
PSID lpUserSid, //指定用户的安全标识,可以为NULL
WORD wNumStrings, //用来指定lpStrings所指向的字符串数组所包含的字符串指针个数
DWORD dwDataSize, //用来指定lpRawData所指向的原始数据缓冲区的长度
LPCSTR *lpStrings,
LPVOID lpRawData
);
事件类型常量定义:
宏 | 值 | 含义 |
---|---|---|
EVENTLOG_SUCCESS | 0x0000 | Information event |
EVENTLOG_AUDIT_FAILURE | 0x0010 | Failure Audit event |
EVENTLOG_AUDIT_SUCCESS | 0x0008 | Success Audit event |
EVENTLOG_ERROR_TYPE | 0x0001 | Error event |
EVENTLOG_INFORMATION_TYPE | 0x0004 | Information event |
EVENTLOG_WARNING_TYPE | 0x0002 | Warning event |
CLFS
CLFS是Common Log File System的简称,与ELF相比,CLFS的速度更快,可靠性也更高。
CLFS是对文件系统的扩展,其支持来源于Windows内核和驱动程序,因此具有更好的可靠性和更高的性能。