对于没有界面的后台服务而言,向操作系统写入日志是一种分析服务运行情况的重要方式。下面就来看看怎么向操作系统写入日志,上代码:
void LogEvent(LPCTSTR pFormat, ...)
{
try
{
TCHAR chMsg[256];
HANDLE hEventSource;
LPTSTR lpszStrings[1];
va_list pArg;
va_start(pArg, pFormat);
_vstprintf_s(chMsg, pFormat, pArg);
va_end(pArg);
lpszStrings[0] = chMsg;
hEventSource = RegisterEventSource(NULL, _T(SERVER_NAME));
if (hEventSource != NULL)
{
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*)&lpszStrings[0], NULL);
DeregisterEventSource(hEventSource);
}
}
catch (...)
{
}
}
首先,我们要注意的是_vstprintf_s这个API,在处理特殊符号(例如%s)时会导致异常,所以要加上异常捕获处理。如果是纯C代码,建议不要使用可变参数的形式来打印日志了。
言归正传,向操作系统写日志最核心的部分就是ReportEvent这个API。在调用ReportEvent之前首先要调用RegisterEventSource来检索指定事件日志的已注册句柄。如果检索到已经注册就可以使用ReportEvent来写入系统日志了。日志写完之后需要调用DeregisterEventSource来关闭指定的事件日志。