• 使用变长参数实现简单的日志类


    做项目时候经常需要打印日志来输出一些重要的信息,自己实现了一个简单的日志类,记录下。

    Log.h

     1 #pragma once
     2 
     3 class CVxILog
     4 {
     5 private:
     6     CVxILog();
     7     ~CVxILog();
     8 public:
     9     static    CVxILog*        Instance()
    10     {
    11         static CVxILog    log;
    12         return &log;
    13     }
    14 
    15     void    AddLog(const char* msg);
    16 
    17     void    AddLogEx(const char* format, ...);
    18 private:
    19     static const    char* m_pFileName;
    20 
    21     static CRITICAL_SECTION    s_cs;
    22 };
    23 
    24 #define WRITE_LOG(msg)                    CVxILog::Instance()->AddLog(msg)
    25 #define WRITE_LOG_EX(format,...)    CVxILog::Instance()->AddLogEx(format,__VA_ARGS__)

    Log.cpp

     1 #include "stdafx.h"
     2 #include "Log.h"
     3 #include <fstream>
     4 
     5 CRITICAL_SECTION    CVxILog::s_cs;
     6 
     7 const char* CVxILog::m_pFileName = _T("Test.log");
     8 
     9 #define MAX_LOG_LENGTH        1024        //最大Log长度
    10 
    11 static void    WriteHeadStr(std::ofstream& out)
    12 {
    13     SYSTEMTIME st = {0};
    14     GetLocalTime(&st);
    15     char timeStr[MAX_LOG_LENGTH] = {0};
    16     sprintf_s(timeStr,"[%d-%02d-%02d %02d:%02d:%02d] ",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
    17     out << timeStr;
    18 }
    19 
    20 CVxILog::CVxILog()
    21 {
    22     ::InitializeCriticalSection(&s_cs);
    23 }
    24 CVxILog::~CVxILog()
    25 {
    26     ::DeleteCriticalSection(&s_cs);
    27 }
    28 
    29 void    CVxILog::AddLog(const char* msg)
    30 {
    31     ::EnterCriticalSection(&s_cs);
    32     std::ofstream    out;
    33     out.open(m_pFileName,std::ios_base::app|std::ios_base::out);
    34     if(out.is_open())
    35     {
    36         WriteHeadStr(out);
    37         out << msg << std::endl;
    38         out.close();
    39     }
    40     ::LeaveCriticalSection(&s_cs);
    41 }
    42 
    43 void    CVxILog::AddLogEx(const char* format, ...)
    44 {
    45     ::EnterCriticalSection(&s_cs);
    46     std::ofstream    out;
    47     out.open(m_pFileName,std::ios_base::app|std::ios_base::out);
    48     if(out.is_open())
    49     {
    50         WriteHeadStr(out);
    51 
    52         va_list ap;
    53         va_start(ap,format);
    54         char msg[MAX_LOG_LENGTH];
    55         int size = vsnprintf_s(msg,MAX_LOG_LENGTH-1,format,ap);
    56         if(size > 0)
    57         {
    58             out << msg << std::endl;
    59         }
    60         va_end(ap);
    61         
    62         out.close();
    63     }
    64     ::LeaveCriticalSection(&s_cs);
    65 }

    使用时可以

    1 WRITE_LOG("log test");
    2 WRITE_LOG_EX("[%s],log test",__FUNCTION__);

    基本满足使用,但是还有很多不足,欢迎大家批评指正

  • 相关阅读:
    高德地图API之公交路线
    高德地图API之骑行路线
    高德地图API之货车路线
    高德地图API之步行路线
    高德地图API之驾车路线
    高德地图API常用控件的添加与删除(鹰眼、工具条、比例尺)
    高德地图API,地图类型切换(卫星地图)
    高德地图API之缩放比例尺控件+3D转换
    Laravel 虚拟开发环境 Homestead 密码
    优化mysql
  • 原文地址:https://www.cnblogs.com/huangsitao/p/10551865.html
Copyright © 2020-2023  润新知