在一个纯Win32项目中进行应用程序日志记录

4
在Web开发中,我有自己的框架,使用日志文件来帮助我进行开发并监控错误或生产过程。这个Web框架几乎总是在*nix上运行,使用简单的纯文本作为日志文件,并使用logrotate和tail。
今天我正在创建一个win32应用程序,它将充当TCP/IP服务器(这是一个桌面应用程序,但嵌入了一些服务),我需要记录事件以便知道什么时候出现问题(在开发和生产中都需要,以便在创建时进行调试)。
我记得MFC有TRACE宏,这对于开发调试很好。在纯Win32开发中是否有类似TRACE的东西?
对于生产日志,事件日志和简单的纯文本文件哪种方法最好?如何在Windows中旋转它?
谢谢, 丹尼尔·科赫

你可以用自己的C/C++宏替换TRACE...至于要记录哪种类型的日志,这真的取决于你——我见过两种方式。 - Robert
标准解决方案是使用Windows事件跟踪(ETW)。当您需要从实时生产服务获取诊断信息时,它特别有帮助,因为它可以在运行时启用/禁用,并提供远程访问诊断信息的方式。 - IInspectable
5个回答

2

对于开发人员来说,通常只需要使用类似以下的OutputDebugString包装器:

inline void logA(const char* format, ...)
{
    char buf[1024];
    wvsprintfA(buf, format, ((char*)&format) + sizeof(void*));
    OutputDebugStringA(buf);
}

#define DEBUG_LOG_A(format, ...) logA( \
        "(#" BOOST_PP_STRINGIZE( __LINE__ ) ") "__FUNCTION__ " : " \
        format, __VA_ARGS__)

使用DebugView来查看它。


不错的函数,但我需要使用DebugView来查看日志吗?还是可以使用Visual Studio的控制台?生产模式呢? - Daniel Koch
@Daniel Koch:是的,你可以使用MSVS输出窗口。 - Abyx
Abyx,非常感谢!我将在我的DEBUG_LOG宏中使用OutputDebugString来跟踪DEV模式下的应用程序。在生产环境中,我将使用SQLite文件,这比ReportEvent更好导出和使用(事件日志太复杂了)。 - Daniel Koch

2

log4c是广泛使用的log4j框架的C语言版本(请参见上面的log4cxx,它是为C ++设计的)。您可以将其定制为在任何地方输出数据。

它必须使用GCC编译,但一旦构建完成,您应该能够从使用Microsoft工具链编译的程序中使用库。

这个之前的问题涵盖了一些其他的C选项。


嗨,史蒂夫,我喜欢log4c。但是我不知道如何在生产环境中进行日志轮换。你知道怎么做吗?对于开发,我想我可以遵循Abyx的建议,使用OutputDebugString,那很好。 - Daniel Koch
当你说旋转时,是指定制吗?您可以在生产/开发环境中在运行时配置库,以便输出仅到达您想要的位置。文档不是很好,但下载的默认配置文件应该是有指示性的。 - Steve Townsend

0

当时,我成功地使用了log4cxx


0
如果您的项目可以使用ATL,我建议您这样做,如果您不害怕一些C++模板的话 :-)
它是一个相当轻量级的库,但对于基本操作非常有用,您还可以决定静态链接到它,这在您不想要部署问题时非常酷。
并且,回到跟踪问题上来,它具有一个ATLTRACE宏,非常有帮助。

谢谢Simon,但我不会在这里使用C++。 - Daniel Koch

-1

在开发部分(相当于“TRACE”)时,不仅可以实现,而且您还可以设置颜色和字体样式。首先,您需要调用:

#include <conio.h>
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

要设置文本颜色,我使用:

inline void setcolor(int textcol, int backcol)
{
    if ((textcol % 16) == (backcol % 16))textcol++;
    textcol %= 16; backcol %= 16;
    unsigned short wAttributes = ((unsigned)backcol << 4) | (unsigned)textcol;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    SetConsoleTextAttribute(hConsole, wAttributes);
}

然后,只需使用wprintf()来显示文本。 如果您希望清除显示区域,只需调用:

system("cls");

同时通过调用以下方法刷新显示:

void refresh()
{
    HWND hwnd = FindWindowEx(NULL, NULL, L"CabinetWClass", NULL);
    while (hwnd != NULL)
    {
        PostMessage(hwnd, WM_COMMAND, 41504, 0);
        hwnd = FindWindowEx(NULL, hwnd, L"CabinetWClass", NULL);
    }
}

"这是如何将格式化输出写入Windows控制台的方法(假设您理解魔法值,并且可以正确猜测缺失的细节),但这并不是回答“如何实现可用于生产环境的监控”的问题。" - IInspectable
你可能误读了问题。这里与监控无关,而是涉及日志记录和跟踪。 - Michael Haephrati
那只是背景,不是问题。他需要类似于TRACE的东西。请仔细阅读。 - Michael Haephrati
我编辑了我的答案。它(像大多数其他答案一样)回答了问题的第一部分:“我记得MFC,它有TRACE宏。这对于开发调试很好。在纯Win32开发中是否有类似TRACE的东西?” - Michael Haephrati
TRACE 写入调试日志,而这个提议的答案坚持要写入控制台(可能不存在)。这并不实用。 - IInspectable
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接