C/C++错误日志文件读写——LogFile


RT

对于Release版本的程序来说,记录错误通常只能采用读写日志的方法解决(程序自己的日志或者系统日志),毕竟把所有错误信息用对话框(MessageBox)呈现仍然是一件值得商榷的事情

之前KC也写过类似的东西——DebugToFile。但是事实是,这个东西真的可以说是一个鸡肋

需要MFC支持
文件操作需要生成实例对象
架构设计上存在问题

于是,LogFile诞生了

和DebugToFile不同,LogFile采用单一函数接口的方式提供功能,不需要像类一样产生实例对象才能使用

另一个比较好的地方在于,LogFile采用通用/标准的设计哲学,不过很可惜,由于各种编译器间的兼容问题,未能做到100%的通用化(注意点后面说明)

LogFile提供的函数接口如下:

void LogErrorToFile(const wchar_t* lpszFileName, wchar_t* lpszFormat, …);
void ClearFile(const wchar_t* lpszFileName);
void DeleteFile(const wchar_t* lpszFileName);

LogErrorToFile支持不定参数和格式化命令,其实就是类似printf的格式化输出,并且自动在调试信息后增加一行写入时间

ClearFile清空日志文件,DeleteFile删除日志文件

LogFile的.h如下:

/**************************************************

** Project:LogToFile

** File:logfile.h

** Edition:v1.0.0 Demo

** Coder:KingsamChen [MDSA Group]

** Last Modify:2010-8-14

**************************************************/

#if _MSC_VER > 1000
#pragma  once
#endif

#ifndef _LOGFILE_C6A57B5F_C91D_4fc0_9B38_10524313FAE1
#define _LOGFILE_C6A57B5F_C91D_4fc0_9B38_10524313FAE1

const wchar_t ERRLOG_FILE_NAME[] = L"ErrorLog.log";

void LogErrorToFile(const wchar_t* lpszFileName, wchar_t* lpszFormat, ...);
void ClearFile(const wchar_t* lpszFileName);
void DeleteFile(const wchar_t* lpszFileName);

static int WriteFile(const wchar_t* lpszFileName, wchar_t* lpszStr);

#endif

最后做几个比较重要的说明:

1.由于通用性的考虑,不能使用TCHAR等VC Only的东西,所以字符串和相关函数全部采用Unicode版

2.如果你在VC中使用LogFile,那么自动跳过这里

3.如果使用GCC,请删除logfile.cpp中的stdafx.h(VC用于预编译头)、error_t和_get_error(I/O错误设置),并不影响使用

4.如果使用GCC,请删除logfile.cpp中的crtdbg.h引用,然后加入#define _ASSERT assert。原因在于VC中assert对Release也有效果

Download:LogFile_SRC

, , , , ,

  1. #1 by Lieo on 2010 年 08 月 17 日 - 上午 9:17

    55555555
    一个字都看不懂

    [回复]

  2. #2 by dickwinters on 2010 年 08 月 17 日 - 下午 12:18

    KC哥的文章好深奥~~~

    [回复]

  3. #3 by beston on 2010 年 10 月 23 日 - 下午 3:49

    下不了了

    [回复]

    KingsamChen 回复:

    因为UUShare的服务器宕机了
    而我又没法存在自己的Blog主机上.so

    [回复]

(will not be published)