asp.net中C++日志记录类笔记

作者:袖梨 2022-06-25

Log.h

 代码如下 复制代码


#ifndef __LOG_H__
#define __LOG_H__

#include
#include
#include
#include
#include
#include

class CLog {
public:
    ~CLog();
    static CLog* get(TCHAR* path = NULL);
    void printf(const char* format, ...);

private:
    CLog(FILE* handle);

private:
    static CLog* _log;
    FILE* _handle;
};

enum {
  LOG_DEBUG,
  LOG_INFO,
  LOG_WARN,
  LOG_ERROR,
  LOG_FATAL
};

#ifdef _DEBUG
static unsigned int log_level = LOG_DEBUG;
#else
static unsigned int log_level = LOG_INFO;
#endif

#define PRINT_LINE(type, format, datetime, ms, ...)                    
    printf("%lu::%s::%s,%.3d::%s::" format "n", GetCurrentThreadId(), type, datetime, ms,
           __FUNCTION__, ## __VA_ARGS__);

#define LOG(type, format, ...) do {                                    
    if (type >= log_level && type <= LOG_FATAL) {                      
        CLog* log = CLog::get();                                     
        const char *type_as_char[] = { "DEBUG", "INFO", "WARN", "ERROR", "FATAL" };
        struct _timeb now;                                             
        struct tm today;                                               
        char datetime_str[20];                                         
        _ftime_s(&now);                                                
        localtime_s(&today, &now.time);                                
        strftime(datetime_str, 20, "%Y-%m-%d %H:%M:%S", &today);       
        if (log) {                                                     
            log->PRINT_LINE(type_as_char[type], format, datetime_str, now.millitm, ## __VA_ARGS__);
        } else {                                                       
            PRINT_LINE(type_as_char[type], format, datetime_str, now.millitm, ## __VA_ARGS__);
        }                                                              
    }                                                                  
} while(0)


#define log_printf(format, ...) LOG(LOG_INFO, format, ## __VA_ARGS__)
#define LOG_INFO(format, ...) LOG(LOG_INFO, format, ## __VA_ARGS__)
#define LOG_WARN(format, ...) LOG(LOG_WARN, format, ## __VA_ARGS__)
#define LOG_ERROR(format, ...) LOG(LOG_ERROR, format, ## __VA_ARGS__)

#define DBGLEVEL 1000

#define DBG(level, format, ...) do {           
    if (level <= DBGLEVEL) {                   
        LOG(LOG_DEBUG, format, ## __VA_ARGS__);
    }                                          
} while(0)

#define ASSERT(x) _ASSERTE(x)
#endif

log.cpp

#include "Log.h"
#include
#include
#include

#define LOG_ROLL_SIZE (1024 * 1024)

CLog* CLog::_log = NULL;

CLog::CLog(FILE* handle)
    : _handle(handle)
{
    _log = this;
}

CLog::~CLog()
{
    if (_log && _handle) {
        fclose(_handle);
        _log = NULL;
    }
}

CLog* CLog::get(char* path)
{
    if (_log) {
        return _log;
    }
 if(!path)
 {
  path = "dll.log";
 }
    DWORD size = 0;
    HANDLE file = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
                             NULL);
    if (file != INVALID_HANDLE_VALUE) {
        size = GetFileSize(file, NULL);
        CloseHandle(file);
    }
    if (size != INVALID_FILE_SIZE && size > LOG_ROLL_SIZE) {
        TCHAR roll_path[MAX_PATH];
        sprintf(roll_path, "%s.1", path);
        if (!MoveFileEx(path, roll_path, MOVEFILE_REPLACE_EXISTING)) {
            return NULL;
        }
    }
    FILE* handle = fopen(path, "a+");
    if (!handle) {
        return NULL;
    }
    _log = new CLog(handle);
    return _log;
}

void CLog::printf(const char* format, ...)
{
    va_list args;

    va_start(args, format);
    vfprintf(_handle, format, args);
    va_end(args);
    fflush(_handle);
}

相关文章

精彩推荐