写LOg 生成日志

来源:互联网 发布:北京税控开票软件 编辑:程序博客网 时间:2024/06/05 20:02

1.日志基类

.h文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//---------------------------------------------------------------------------
#ifndef UnitLogWriterH
#define UnitLogWriterH
#include <vcl.h>
#include <time.h>
#include <assert.h>
//---------------------------------------------------------------------------
class LogFile
{
protected:
    CRITICAL_SECTION _csLock;
    char * _szFileName;
    HANDLE _hFile;
    bool OpenFile();//打开文件, 指针到文件尾
    DWORD Write(LPCVOID lpBuffer,DWORD dwLength);
    virtual void WriteLog(LPCVOID lpBuffer,DWORD dwLength);//写日志, 可以扩展修改
    void Lock()   { ::EnterCriticalSection(&_csLock); }
    void Unlock() { ::LeaveCriticalSection(&_csLock); }
public:
    LogFile(const char *szFileName = "Log.log");//设定日志文件名
    virtual ~LogFile();
    const char * GetFileName()
    {
       return _szFileName;
    }
 
    void SetFileName(const char *szName);//修改文件名, 同时关闭上一个日志文件
    bool IsOpen()
    {
       return _hFile != INVALID_HANDLE_VALUE;
    }
 
    void Close();
 
    void Log(LPCVOID lpBuffer,DWORD dwLength);//追加日志内容
 
    void Log(const char *szText)
    {
       Log(szText,strlen(szText));
    }
private://屏蔽函数
    LogFile(const LogFile&);
    LogFile&operator = (const LogFile&);
};
#endif

 

 

基类cpp文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//---------------------------------------------------------------------------
 
 
#pragma hdrstop
 
#include "UnitLogWriter.h"
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
LogFile::LogFile(const char *szFileName)
{
   _szFileName = NULL;
   _hFile = INVALID_HANDLE_VALUE;
   ::InitializeCriticalSection(&_csLock);
 
   SetFileName(szFileName);
}
//-------------------------------------------------------------------------
LogFile::~LogFile()
{
    ::DeleteCriticalSection(&_csLock);
    Close();
 
    if(_szFileName)
        delete []_szFileName;
}
//-------------------------------------------------------------------------
 
bool LogFile::OpenFile()
{
    if(IsOpen())
        return true;
    if(!_szFileName)
        return false;
 
    _hFile = CreateFile(
                        _szFileName,
                        GENERIC_WRITE,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
 
    if(!IsOpen() && GetLastError() == 2)//打开不成功, 且因为文件不存在, 创建文件
        _hFile = CreateFile(
                             _szFileName,
                             GENERIC_WRITE,
                             FILE_SHARE_READ | FILE_SHARE_WRITE,
                             NULL,
                             OPEN_ALWAYS,
                             FILE_ATTRIBUTE_NORMAL,
                             NULL);
 
    if(IsOpen())
        SetFilePointer(_hFile, 0, NULL, FILE_END);
    return IsOpen();
}
//-------------------------------------------------------------------------
DWORD LogFile::Write(LPCVOID lpBuffer,DWORD dwLength)
{
    DWORD dwWriteLength = 0;
    if(IsOpen())
        WriteFile(_hFile, lpBuffer, dwLength, &dwWriteLength, NULL);
    return dwWriteLength;
}
//-------------------------------------------------------------------------
void LogFile::WriteLog(LPCVOID lpBuffer,DWORD dwLength)
{
    time_t now;
    char temp[21];
    DWORD dwWriteLength;
 
    if(IsOpen())
    {
        time(&now);
        strftime(temp, 20, "%Y-%m-%d %H:%M:%S",localtime(&now));
 
        WriteFile(_hFile,"\xd\xa#-----------------------------", 32, &dwWriteLength, NULL);
        WriteFile(_hFile, temp, 19, &dwWriteLength, NULL);
        WriteFile(_hFile,"-----------------------------#\xd\xa", 32, &dwWriteLength, NULL);
        WriteFile(_hFile, lpBuffer, dwLength, &dwWriteLength, NULL);
        WriteFile(_hFile,"\xd\xa", 2, &dwWriteLength, NULL);
 
        FlushFileBuffers(_hFile);
 
    }
}
//-------------------------------------------------------------------------
 
//-------------------------------------------------------------------------
void LogFile::SetFileName(const char *szName)
{
       assert(szName);
 
       if(_szFileName)
        delete []_szFileName;
 
       Close();
 
       _szFileName = new char[strlen(szName) + 1];
       assert(_szFileName);
       strcpy(_szFileName, szName);
}
//-------------------------------------------------------------------------
void LogFile::Close()
{
       if(IsOpen())
       {
        CloseHandle(_hFile);
        _hFile = INVALID_HANDLE_VALUE;
       }
}
//-------------------------------------------------------------------------
void LogFile::Log(LPCVOID lpBuffer,DWORD dwLength)
{
       assert(lpBuffer);
       __try
       {
        Lock();
 
        if(!OpenFile())
         return;
 
        WriteLog(lpBuffer, dwLength);
       }
       __finally
       {
        Unlock();
       }
}
1
  

2.日志派生类

.h文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//---------------------------------------------------------------------------
 
#ifndef LogFileExH
#define LogFileExH
#include <assert.h>
 
#include "UnitLogWriter.h"
 
//---------------------------------------------------------------------------
class LogFileEx : public LogFile
{
protected:
    char *_szPath;
    char _szLastDate[9];
    int _iType;
    void SetPath(const char *szPath);
public:
    enum LOG_TYPE{YEAR = 0, MONTH = 1, DAY = 2};
    LogFileEx(const char *szPath = ".", LOG_TYPE iType = MONTH);
    ~LogFileEx();
    const char * GetPath();
    void Log(LPCVOID lpBuffer,DWORD dwLength);
    void Log(const char *szText);
    void Log(const AnsiString&szText);
private://屏蔽函数
    LogFileEx(const LogFileEx&);
    LogFileEx&operator = (const LogFileEx&);
};
#endif
1
  
1
cpp文件
1
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//---------------------------------------------------------------------------
 
 
#pragma hdrstop
 
#include "LogFileEx.h"
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
//-------------------------------------------------------------------------
 
void LogFileEx::SetPath(const char *szPath)
{
       assert(szPath);
 
       WIN32_FIND_DATA wfd;
       char temp[MAX_PATH + 1] = {0};
 
       if(FindFirstFile(szPath, &wfd) == INVALID_HANDLE_VALUE && CreateDirectory(szPath, NULL) == 0)
       {
            strcat(strcpy(temp, szPath), " Create Fail. Exit Now! Error ID :");
            ltoa(GetLastError(), temp + strlen(temp), 10);
            MessageBox(NULL, temp, "Class LogFileEx", MB_OK);
            exit(1);
       }
       else
       {
            GetFullPathName(szPath, MAX_PATH, temp, NULL);
            _szPath = new char[strlen(temp) + 1];
            assert(_szPath);
            strcpy(_szPath, temp);
       }
}
//-------------------------------------------------------------------------
LogFileEx::LogFileEx(const char *szPath , LOG_TYPE iType)
{
   _szPath = NULL;
   SetPath(szPath);
   _iType = iType;
   memset(_szLastDate, 0, 9);
}
//-------------------------------------------------------------------------
LogFileEx::~LogFileEx()
{
   if(_szPath)
    delete []_szPath;
}
//-------------------------------------------------------------------------
 
const char * LogFileEx::GetPath()
{
   return _szPath;
}
//-------------------------------------------------------------------------
 
void LogFileEx::Log(LPCVOID lpBuffer,DWORD dwLength)
{
    assert(lpBuffer);
 
    char temp[10];
    static const char format[3][10] = {"%Y","%Y-%m","%Y%m%d"};
 
    __try
    {
        Lock();
 
        time_t now = time(NULL);
 
        strftime(temp, 9, format[_iType], localtime(&now));
 
        if(strcmp(_szLastDate, temp) != 0)//更换文件名
        {
            strcat(strcpy(_szFileName, _szPath), "\\");
            strcat(strcat(_szFileName, temp), ".log");
            strcpy(_szLastDate, temp);
            Close();
        }
        if(!OpenFile())
            return;
 
        WriteLog(lpBuffer, dwLength);
    }
    __finally
    {
        Unlock();
    }
}
//-------------------------------------------------------------------------
void LogFileEx::Log(const char *szText)
{
   Log(szText,strlen(szText));
}
//-------------------------------------------------------------------------
void LogFileEx::Log(const AnsiString&szText)
{
    Log(szText.c_str(),szText.Length());
}

 

3.随便测试的代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <conio.h>
#include "LogFileEx.h"
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc,char* argv[])
{
    LogFileExlog;
    log.Log("哈哈");
    AnsiString temp="adsfsadfsadfsaf";
    log.Log(temp);
    log.Log(temp);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
1

原创粉丝点击