MFC 환경에서 Log 파일 생성 및 Log 기록 남기기

MFC 환경에서 Log 파일 생성 및 Log 기록하기


이번 장에서는 MFC 환경에서 Log 파일을 어떻게 생성하고 또 사용자가 원하는 Log들을 어떻게 기록하는지에 대한 내용을 알아보도록 하겠습니다.

 



먼저 MFC 대화상자 기반의 프로젝트를 생성하여 주시고 그 안에 Button 하나를 아래와 같이 배치시켜 주십시오.

그리고 stdafx.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

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

 

// stdafx.h : 자주 사용하지만 자주 변경되지는 않는

// 표준 시스템 포함 파일  프로젝트 관련 포함 파일이 

// 들어 있는 포함 파일입니다.

 

#pragma once

 

#ifndef VC_EXTRALEAN

// 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.

#define VC_EXTRALEAN            

#endif

 

#include "targetver.h"

 

// 일부 CString 생성자는 명시적으로 선언됩니다.

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      

 

// MFC 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.

#define _AFX_ALL_WARNINGS

 

#include <afxwin.h>         // MFC 핵심  표준 구성 요소입니다.

#include <afxext.h>         // MFC 확장입니다.

 

 

#include <afxdisp.h>        // MFC 자동화 클래스입니다.

 

 

#ifndef _AFX_NO_OLE_SUPPORT

// Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다.

#include <afxdtctl.h>           

#endif

#ifndef _AFX_NO_AFXCMN_SUPPORT

// Windows 공용 컨트롤에 대한 MFC 지원입니다.

#include <afxcmn.h>             

#endif // _AFX_NO_AFXCMN_SUPPORT

 

 // MFC 리본  컨트롤 막대 지원

#include <afxcontrolbars.h>    

 

 

 

extern CCriticalSection g_criticalLog;

extern CCriticalSection g_criticalDbg;

extern CCriticalSection g_criticalExe;

 

//가변인수함수로 Log라는 함수 선언

void Log(int nType, const char* fmt, ...); 

CString GetFilePath();

 

//로그 타입 사용자가 원하는 대로 정의

enum LogType

{

    Debug = 0//디버그

    Normal,    //정상

    End,       //

    Error

};

 

 

 

 

 

Colored by Color Scripter

cs

 

 

 

그리고 나서 stdafx.cpp 에 앞서 선언한 함수들을 정의해줍니다.


cs

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

// stdafx.cpp : 표준 포함 파일만 들어 있는 소스 파일입니다.

// Log.pch 미리 컴파일된 헤더가 됩니다.

// stdafx.obj에는 미리 컴파일된 형식 정보가 포함됩니다.

 

#include "stdafx.h"

 

CCriticalSection g_criticalLog;

CCriticalSection g_criticalExe;

 

void Log(int nType, const char* fmt,...)

{

    g_criticalLog.Lock();

 

    static _TCHAR szLog[5096];

 

    FILE *fp = NULL;

    CTime tm = CTime::GetCurrentTime();

 

    CString strLog = _T("");

    CString strPath = _T("");

 

    va_list args; //가변 변수를 읽기 위한 포인터 변수를 선언

    SYSTEMTIME cur_time;

 

    if(fmt == NULL)

    {

        g_criticalLog.Unlock();

        return;

    }

 

    ZeroMemory(szLog, 5096);

 //va_start(args, 마지막 고정인수) -  가변 인수를 읽기 위한 준비 (초기화 해주는 과정이다.)

    va_start(args, fmt);

    wvsprintf(szLog, fmt, args);

    va_end(args);

 

    strPath.Format( "%s\\MainLog\\%s", GetFilePath(), tm.Format( "%Y_%m_%d_%H.log" ) );

 

    fopen_s( &fp, (LPSTR)(LPCSTR)strPath, "a+" );

 

    GetLocalTime( &cur_time ); //현재 시간을 가져온다.

 

    strLog.Format("%04d-%02d-%02d %02d:%02d:%02d:%03ld : ",

        cur_time.wYear,

        cur_time.wMonth, 

        cur_time.wDay, 

        cur_time.wHour, 

        cur_time.wMinute, 

        cur_time.wSecond, 

        cur_time.wMilliseconds); //날짜 형식에 맞게 받는다.

 

    if ( fp != NULL )

    {

        switch ( nType )

        {

        case Normal        : strLog += _T( "[NORMAL    ] : " );    break;

        case Debug        : strLog += _T( "[DEBUG     ] : " );    break;

        case End        : strLog += _T( "[End        ] : " );    break;

        case Error        : strLog += _T( "[Error       ] : " );    break;

        }

 

        strLog += szLog;

 

        fprintf( fp, "%s\r\n", ( LPSTR )( LPCSTR )strLog );

        fflush( fp );

        fclose( fp );

    }

    else

    {

        CString strErrorMsg;

        DWORD    dwErrNo  = GetLastError(); //DWORD - Unsigned Long

 

        strErrorMsg.Format( "LOG FILE Open Fail : Code = [ %d ], ", dwErrNo );

    }

 

    g_criticalLog.Unlock();

}

 

CString    GetFilePath()

{

    g_criticalExe.Lock();

 

    static TCHAR pBuf[ 256 ] = { 0, };

 

    memset( pBuf, NULLsizeof( pBuf ) );

 

//현재 자신의 실행 경로를 가져오는 함수 ->  GetModuleFileName

    GetModuleFileName( NULL, pBuf, sizeof( pBuf ) ); 

 

    CString strFilePath;

 

    strFilePath.Format( _T( "%s" ), pBuf );

 

    strFilePath = strFilePath.Left( strFilePath.ReverseFind( _T( '\\' ) ) );

 

    g_criticalExe.Unlock();

 

    return strFilePath;

}

Colored by Color Scripter

 

 

 

 

 

Colored by Color Scripter

cs

 

그리고 나서 맨 처음에 만들었던 버튼을 클릭했을 때 Log를 기록하도록 하겠습니다. MainDlg.cpp에서 버튼 클릭 이벤트를 만들어 주시고 아래와 같이 내용을 입력하여 주세요.

 

1

2

3

4

5

6

void CLogDlg::OnBnClickedButtonLogWrite()

{

    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

    Log(Normal, "버튼 클릭 이벤트가 정상적으로 발생되었습니다.");

}

 

Colored by Color Scripter

cs

 

그리고 실행을 시켜 주시면 아래와 같이 Log 파일이 생성되어 안에 내용이 제대로 기록 된다는 것을 확인하실 수 있습니다.

 




728x90

이 글을 공유하기

댓글

Designed by JB FACTORY