对于日志,大部分人的想法应当和我起初的想法一致,只要写个函数,在这个函数中打开一个文件,把需要记录的事件信息写到这个文件中。然后在需要记录日志的地方调用这个函数。

但此时需要考虑的问题有很多,包括文件名的定义,是每次写日志都创建一个新文件还是在一个文件中写所有的信息。如果是同一个文件如果控制多线程同时写的问题;还有当日志文件过大时,如果删除以前的记录。读日志的方式,包括检索的功能;安全问题等等。所以不要小看了仅是辅助功能的日志机制,但不用担心,windows已经为我们定义了很完善的日志架构。

Windows vista引入的CLFS ( Common Log File System)机制,另外一个就是从NT3.5就支持的Event Logging机制,里面的函数大多是以Elf(Event Log File)开头的,简称为ELF。

Windows XP中定义了3类日志,分别是应用程序日志(Application),安全日志(Security)和系统日志(system),文件名分别为AppEvent.Evt, SecEvent.Evt和SysEvent.Evt.这些文件都用于存储注册表文件和配置信息的CONFIG目录下%SystemRoot%\SYSTEM32\CONFIG\

Windows Vista增加了HardvareEvents和DFS Replication等日志类别,并且为所有的日志文件建立了一个单独的目录,即%SystemRoot%\SYSTEM32\winevt\Logs目录,日志文件的扩展名也由.EVT改为.EVTX。

日志的配置信息都是存储在注册表

HKEY_LOACAL_MACHINE\SYSTEM\CurrentControlSet\Sercices\Eventlog

下面看产生windows日志的API及其执行过程:

1.  在注册表中注册事件源。线介绍一下事件源,事件源都是注册在注册表HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\下的,如果需要自己注册事件源就可以在这个注册表下添加一个新的键,再加两个项就可以了。来看个例子,outlook的事件源

它包含了三个键,EvetMessageFile用来指定这个事件源的消息文件(message file)的位置和名称。消息文件的作用可以使用模板来格式化日志事件或其他消息,与字符串资源和对话框资源差不多。可以使用后面介绍的事件ID(Event ID)来查找对应的显示信息,提供一种模板的支持。TypesSupported表示事件所支持的类型,包括EVENTLOG_ERROR_TYPE(0x0001), EVENTLOG_WARBUBG_TYPE(0x0002)等。Version表示事件源的版本。消息文件可以是DLL,exe等有效地PE文件,编写消息文件的方法这里就不介绍了,这里可以写应用程序本身的路径。

2.  调用RegisterEventSource API来取得事件源句柄,原型为:

HANDLE RegisterEventSource ( LPCTSTR lpUNCServerName, LPCTSTR lpSourceName)

其中lpUNCServerName表示机器名,如果是在本机操作,添NULL就可以了,lpSourceName为事件源的名称,填写前面创建的键名就可以了。如果事件源的名称在注册表中找不到,那么系统会默认使用应用类日志下的Application事件源。

3.  使用ReportEvent API来添加日志记录。原型为:

BOOL ReportEvent ( HANLE hEventLog, WORD wType, WORD wCategory, DWORD dwEventID, PSID lpUserSid, DWORD wNumStrings, DWORD dwDataSize, LPCTSTR* lpStrings, LPVOID lpRawData);

第一参数为hEventLog是使用RegisterEventSource得到的事件源句柄;第二个参数wType用来指定事件的类型,可以为如下的常量:EVENTLOG_SUCCESS,EVENTLOG_AUDIT_FAILURE等。第三个参数wCategory用来指定事件在事件源中的类属号,其分类规则是由应用程序自己定义的。第四个参数dwEventID用来指定事件的ID号,通过这个ID来定位消息文件中所对应的信息。所以ID也是有应用程序自己定义的。第五个参数lpUserSid用来指定用户的安全标识,可以设为NULL。第六个参数wNumStrings用来指定第八个参数lpStrings所指向的字符串数组所包含的字符串指针个数。第八个参数用在事件的Description字段中显示信息,如下图所示:

第七个参数dwDataSize用来指定第九个参数lpRawData所指向的原始数据缓冲区的数据长度。这两个参数一个设为0,另一个设为NULL就行了。

这样就可以写入日子记录了,来看一下代码。

首先是注册事件源的代码:

BOOL AddEventSource(CString csName, DWORD dwCategoryCount)

{

HKEY         hRegKey = NULL;

DWORD   dwError = 0;

TCHAR     szPath[ MAX_PATH ];

_stprintf( szPath, _T("SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s"), csName );

// Create the event source registry key

dwError = RegCreateKey( HKEY_LOCAL_MACHINE, szPath, &hRegKey );

if (dwError != 0)

{

OutMsg("RegCreateKey failed for %d",GetLastError());

return E_FAIL;

}

// Name of the PE module that contains the message resource

GetModuleFileName( NULL, szPath, MAX_PATH );

// Register EventMessageFile

dwError = RegSetValueEx( hRegKey, _T("EventMessageFile"), 0, REG_EXPAND_SZ, (PBYTE) szPath, (_tcslen( szPath) + 1) * sizeof TCHAR );

if (dwError == 0)

{

// Register supported event types

DWORD dwTypes = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;

dwError = RegSetValueEx( hRegKey, _T("TypesSupported"), 0, REG_DWORD, (LPBYTE) &dwTypes, sizeof dwTypes );

// If we want to support event categories, we have also to register     the CategoryMessageFile.

// and set CategoryCount. Note that categories need to have the message ids 1 to CategoryCount!

if(dwError == 0 && dwCategoryCount > 0 )

{

dwError = RegSetValueEx( hRegKey, _T("CategoryMessageFile"), 0, REG_EXPAND_SZ, (PBYTE) szPath, (_tcslen( szPath) + 1) * sizeof TCHAR );

if (dwError == 0)

dwError = RegSetValueEx( hRegKey, _T("CategoryCount"), 0, REG_DWORD, (PBYTE) &dwCategoryCount, sizeof dwCategoryCount );

}

}

RegCloseKey( hRegKey );

return TRUE;

}

来至《软件调试》

接下来是添加记录的过程:

LPCTSTR ppszArgs[]={"I make a trick!!!!!!!"};  // 要显示的信息

HANDLE  hLog = ::RegisterEventSource( NULL, "MyEventSource"); //之前注册的事件源

BOOL bRet = ReportEvent(hLog, EVENTLOG_INFORMATION_TYPE,

0, 1024, NULL, 1, 0, ppszArgs,         NULL);    // 显示记录

除了显示日子记录的功能,当然还有其他的API来实现更多的功能,其他的API如下图所示:

Windows下的日志机制相关推荐

  1. windows下SVN日志反馈中文乱码的解决方法

    windows下SVN日志反馈中文乱码的解决方法 参考文章: (1)windows下SVN日志反馈中文乱码的解决方法 (2)https://www.cnblogs.com/wangkeqin/p/11 ...

  2. windows下tomcat日志输出至catalina.out文件

    问题 windows下的tomcat的日志只输出在控制台下,且日志文件输出只有一些基本信息.如何把所有日志都输出到catalina.out,不过有个弊端就是日志在命令行不输出了. 解决方案 需要修改两 ...

  3. Windows下UAC安全机制笔记

    1. 简介 UAC (User Account Control) 是Windows的一个安全机制,当一些敏感操作发生时,会跳出提示显式要求系统权限. 当用户登陆Windows时,每个用户都会被授予一个 ...

  4. 测试工具:Windows下超强日志工具BareTail

    最近写了一些测试工具,经常希望能动态的查看日志文件,试了好些文本编辑文件如Emeditor.Vim等,一直没找到合适. 我希望支持的功能有: 支持大文件读取,速度要快 自动加载新的内容,直接定位到最后 ...

  5. C++ Windows下Glog日志库安装使用教程

    2018年是我写过一个关于Glog使用的教程(https://blog.csdn.net/qq_27278957/article/details/84648912),但是最近再使用时,发现和当时使用方 ...

  6. Windows下能查看日志命令的工具tail及其下载、使用方法

    Windows下能查看日志命令的工具tail及其下载.使用方法 除了Linux操作系统下,在Windows操作系统下也可实现tail命令来查看程序运行日志,但要借助一个工具:tail.exe 1 ta ...

  7. Windows下x86和x64平台的Inline Hook介绍

    原文链接:https://blog.csdn.net/PeaZomboss/article/details/129095200?spm=1001.2014.3001.5501 前言 我在之前研究文明6 ...

  8. windows下安装awstats来分析apache的访问日志

    一.啰嗦两句 之前在Windows下用Apache时,也曾经配置过Awstats,然后换了工作,改用Linux+nginx,渐渐把Apache忘记了.又换了工作,又得用Apache,这回版本更新到2. ...

  9. Windows下查看Android手机日志(LogView使用)

    Windows下查看Android手机日志 1. 准备环境 2.JDK安装 3.配置JDK环境变量 4.配置Android adb 环境 5.adb 常用命令介绍 电脑无线连接手机设置 1.确保手机连 ...

最新文章

  1. 2022-2028年中国塑料鞋行业市场发展调研及未来前景规划报告
  2. php 删除xls文件,使用PHPExcel将xls文件转换为xlsx时出错
  3. 编解码技术学习网站汇总
  4. iis php5.3 mysql_Win2008 R2配置IIS7.5+PHP Manager+PHP5.3+Mysql5.5+Wincache
  5. 购物车清除的php,php-如何清除废弃的woocommerce购物车
  6. VTK:Snippets之ReadPolyData
  7. Python笔记——Django路由系统
  8. Flowable学习笔记(一、入门)
  9. (数据库系统概论|王珊)第七章数据库设计:习题
  10. JAVA蓝桥杯:高精度算法
  11. APP自动化测试系列之Desired Capabilities详解
  12. Mujoco编程开发-官方文档
  13. java+poodle漏洞修复_SSLv3 Poodle攻击漏洞检测工具
  14. 新冠病毒研究进展:维生素D或许能挽救新冠患者
  15. numpy学习(五)——文件的保存和读写(np.save()、np.load()、np.savez()、np.savetxt()、np.loadtxt())
  16. AD_Copy Room
  17. faster-rcnn.pytorch-1.0的jwyang当前最火版本代码复现与讲解
  18. 千万不要看—思路火花
  19. AD(altium designer)15原理图与PCB设计教程(九)——印制电路板的的后续制作
  20. 小程序behaviors使用笔记

热门文章

  1. 从硬件到软件,苹果一直坚持的造车梦....
  2. 5个增加数据科学学习的技巧
  3. 新意互动董事长兼CEO曲伟海出席2021中国企业家博鳌论坛
  4. Cannot serialize; nested exception is org.springframework.core.serializer
  5. 华为鸿蒙电视v65如何,华为智慧屏V65体验:不谈鸿蒙OS,作为大屏它也足够惊艳...
  6. 2023华为机考刷题指南:八周机考速通车
  7. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.8 域和指示器概述...
  8. oracle 输出全角空格,mac系统中如何切换全角半角?苹果电脑输入法全角半角切换快捷键介绍...
  9. 用 PHP 来刷leetCode 之 电话号码的字母组合
  10. 电子签名生成的图片为空白,以及生成透明底签名图片转为白色底