天天看点

C++ 查询系统日志

坑! 有一个大坑,浪费我整整8个小时。最开始的思路是使用 Windows API 来操作日志,但是发现过程非常繁琐,而且到最后还有很多数据读不全,看了一天的 MSDN,最后放弃了。

于是采用另一个思路,20分钟解决。

使用 C++ 操作命令行,并接收命令行返回信息,通过 Dos 命令获取 Windows 系统日志。

​​​Wevtutil 命令介绍​​

文档上介绍的很全,我就不一一列举了,这里只说下我用到的一行命令:

C++ 查询系统日志

意思就是打印最近三条系统日志

下面是接收命令行返回信息的代码:

// Test_Console.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int execmd(char* cmd, char* result) {
    char buffer[128];                         // 缓冲区                        
    FILE* pipe = _popen(cmd, "r");            // 管道 
    
    // 管道打开失败
    if (!pipe){return 0;}

    // 检测管道中的结束符,0表示没有结束
    while(!feof(pipe)){
        // 从管道中读取数据
        if (fgets(buffer, 128, pipe)) {             
            // 拼接 char
            strcat(result, buffer);
        }
    }

    //关闭管道 
    _pclose(pipe);           

    return 1;                                 
}

int main()
{
    char result[0x7ffff] = "";        // 存放结果
    
    // 获取命令行返回值(保险起见这里获取 300 条日志信息)
    if (execmd("wevtutil qe System /c:300 /rd:true /f:text", result) == 1) {
        cout << result << endl;
    }

    // 查找关键数据
    string s = result;
    while ((s.find("igfx")) != -1) {
        cout << "找到了 igfx " << endl;
        break;
    }

    system("pause");   
    return 0;
}      

效果图:

C++ 查询系统日志