C++ 多线程日志类的使用

#pragma once
/********************************************************************
created:    2014/05/12
created:    12:5:2014   20:27
filename:   d:\MFCUI\Log\Log\Log.h
file path:  d:\MFCUI\Log\Log
file base:  Log
file ext:   h
author:     BJ.y

purpose:
*********************************************************************/



#ifndef LOG_H__
#define LOG_H__



//#ifndef _WINDOWS_
//#include <windows.h>
//
//#endif
#include <afxwin.h>
#include <assert.h>
#include <stdio.h>



#define CONTENT_TITLE 32

#define LOG_INFO(format, ...) do \
{\
    CLog::GetInstance().Logf(""format"  file:"__FILE__", function:"__FUNCTION__",line: %05d", ##__VA_ARGS__, __LINE__); \
} while (0)\



class CLog
{

private:

    // constructor

    CLog(void);


    //destructor

    ~CLog(void);


    // copy constructor

    CLog(const CLog &);


    //overloaded 

    const CLog & operator = (const CLog &);

private:

    CRITICAL_SECTION  m_Lock;


    // file descriptor

    FILE * m_File;


    //create time

    SYSTEMTIME m_Time;


    // content title

    char szContentTitle[CONTENT_TITLE];


private:


    // get file handle

    FILE * GetFileFp();


public:

    // get instance

    static CLog & GetInstance();


    // log a formate string

    void Logf(const char * lpFormat, ...);


};



#endif // Log_h__
#include "Log.h"
#include <stdarg.h>



//************************************
// Method:    CLog
// FullName:  CLog::CLog
// Access:    private 
// Returns:   
// Qualifier:
// Parameter: void
//************************************

CLog::CLog(void)
{
    m_File = NULL;
    ::InitializeCriticalSection(&m_Lock);
}


//************************************
// Method:    ~CLog
// FullName:  CLog::~CLog
// Access:    private 
// Returns:   
// Qualifier:
// Parameter: void
//************************************


CLog::~CLog(void)
{
    ::DeleteCriticalSection(&m_Lock);
}


//************************************
// Method:    GetInstance
// FullName:  CLog::GetInstance
// Access:    public 
// Returns:   CLog &
// Qualifier:
//************************************

CLog & CLog::GetInstance()
{
    static CLog m_Log;
    return m_Log;
}


//************************************
// Method:    Logf
// FullName:  CLog::Logf
// Access:    public 
// Returns:   void
// Qualifier:
// Parameter: const char * lpFormat
// Parameter: ...
//************************************

void CLog::Logf(const char * lpFormat, ...)
{
    __try
    {
        //enter the lock

        ::EnterCriticalSection(&m_Lock);

        GetFileFp();

        assert(m_File != NULL);


        DWORD dwWrite = 0;

        // write the time
        fwrite(szContentTitle, sizeof(char), strlen(szContentTitle), m_File);

        //::WriteFile(m_File, szContentTitle, strlen(szContentTitle), &dwWrite, NULL);

        // write the content

        va_list args;
        va_start(args, lpFormat);
        vfprintf(m_File, lpFormat, args);
        va_end(args);

        // write the enter under windows

        fwrite("\n\r", sizeof(char), 1, m_File);
        //::WriteFile(m_File, "\r\n", 2, &dwWrite, NULL);

        return;
    }
    __finally
    {
        ::LeaveCriticalSection(&m_Lock);
    }
}

FILE * CLog::GetFileFp()
{
    SYSTEMTIME sys;

    GetLocalTime(&sys);

    sprintf_s(szContentTitle, CONTENT_TITLE, "%02d:%02d:%02d %02d:%02d:%02d:%d->", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds);

    if (sys.wDay == m_Time.wDay)
    {
        return m_File;
    }

    if (m_File != NULL)
    {
        fclose(m_File);
    }

    m_Time = sys;

    char szFileName[32] = { 0 };
    sprintf_s(szFileName, sizeof(szFileName), "%02d-%02d-%02d.txt", m_Time.wYear, m_Time.wMonth, m_Time.wDay);

    fopen_s(&m_File, szFileName, "a+");
    //m_File = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS , NULL, NULL);
    //SetFilePointer(m_File, 0, NULL, FILE_END);

    return m_File;
}

原文链接: https://www.cnblogs.com/lobsterIT/p/5654409.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/236613

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午5:06
下一篇 2023年2月13日 下午5:06

相关推荐