c++ 写log

来由:

有时候需要输出一些程序运行的信息,供我们不需要调试就可以直接查看程序运行状态。所以我们需要在程序中加入一些LOG输出。

适合涉及到虚拟机调试一些关于驱动等的程序时,或进行远程调试时。


搜了些log工具,不够轻……还是简单实现下吧

贴上来,可能有用的上:

Log.h

/**  
 * 用于输出log文件的类.  
 */    
  
  
#ifndef LOG_H     
#define LOG_H     
  
  
//log文件路径   
#define LOG_FILE_NAME "log.txt"   
  
//启用开关   
#define LOG_ENABLE   
    
#include <fstream>     
#include <string>     
#include <ctime>     
    
using namespace std;    
    
class CLog    
{    
public:    
    static void GetLogFilePath(CHAR* szPath)  
    {  
        GetModuleFileNameA( NULL, szPath, MAX_PATH ) ;  
        ZeroMemory(strrchr(szPath,_T('\\')), strlen(strrchr(szPath,_T('\\') ) )*sizeof(CHAR)) ;  
        strcat(szPath,"\\");  
        strcat(szPath,LOG_FILE_NAME);  
    }  
    //输出一个内容,可以是字符串(ascii)、整数、浮点数、布尔、枚举   
    //格式为:[2011-11-11 11:11:11] aaaaaaa并换行   
    template <class T>  
    static void WriteLog(T x)  
    {  
        CHAR szPath[MAX_PATH] = {0};  
        GetLogFilePath(szPath);  
  
        ofstream fout(szPath,ios::app);  
        fout.seekp(ios::end);  
        fout << GetSystemTime() << x <<endl;  
        fout.close();  
    }  
  
    //输出2个内容,以等号连接。一般用于前面是一个变量的描述字符串,后面接这个变量的值   
    template<class T1,class T2>   
    static void WriteLog2(T1 x1,T2 x2)  
    {  
        CHAR szPath[MAX_PATH] = {0};  
        GetLogFilePath(szPath);  
        ofstream fout(szPath,ios::app);  
        fout.seekp(ios::end);  
        fout << GetSystemTime() << x1 <<" = "<<x2<<endl;  
        fout.close();  
    }  
  
    //输出一行当前函数开始的标志,宏传入__FUNCTION__   
    template <class T>  
    static void WriteFuncBegin(T x)  
    {  
        CHAR szPath[MAX_PATH] = {0};  
        GetLogFilePath(szPath);  
        ofstream fout(szPath,ios::app);  
        fout.seekp(ios::end);  
        fout << GetSystemTime() << "    --------------------"<<x<<"  Begin--------------------" <<endl;  
        fout.close();  
    }  
  
    //输出一行当前函数结束的标志,宏传入__FUNCTION__   
    template <class T>  
    static void WriteFuncEnd(T x)  
    {  
        CHAR szPath[MAX_PATH] = {0};  
        GetLogFilePath(szPath);  
        ofstream fout(szPath,ios::app);  
        fout.seekp(ios::end);  
        fout << GetSystemTime() << "--------------------"<<x<<"  End  --------------------" <<endl;  
        fout.close();  
    }  
      
      
private:  
    //获取本地时间,格式如"[2011-11-11 11:11:11] ";    
    static string GetSystemTime()    
    {    
        time_t tNowTime;    
        time(&tNowTime);    
        tm* tLocalTime = localtime(&tNowTime);    
        char szTime[30] = {'\0'};    
        strftime(szTime, 30, "[%Y-%m-%d %H:%M:%S] ", tLocalTime);    
        string strTime = szTime;    
        return strTime;    
    }    
  
};    
  
#ifdef LOG_ENABLE   
  
//用下面这些宏来使用本文件   
#define LOG(x)              CLog::WriteLog(x);          //括号内可以是字符串(ascii)、整数、浮点数、bool等   
#define LOG2(x1,x2)     CLog::WriteLog2(x1,x2);   
#define LOG_FUNC        LOG(__FUNCTION__)               //输出当前所在函数名   
#define LOG_LINE        LOG(__LINE__)                       //输出当前行号   
#define LOG_FUNC_BEGIN  CLog::WriteFuncBegin(__FUNCTION__);     //形式如:[时间]"------------FuncName  Begin------------"   
#define LOG_FUNC_END     CLog::WriteFuncEnd(__FUNCTION__);      //形式如:[时间]"------------FuncName  End------------"   
  
#else   
  
#define LOG(x)                 
#define LOG2(x1,x2)        
#define LOG_FUNC           
#define LOG_LINE           
#define LOG_FUNC_BEGIN     
#define LOG_FUNC_END       
  
#endif   
  
#endif    

使用:

直接在需要输出日志的地方使用宏LOG(text)就可以了,记得包含头文件Log.h。

#include "Log.h"

BOOL CTestDlg::OnInitDialog()  
{  
    LOG_FUNC_BEGIN  
  
    LOG_FUNC  
    LOG_LINE  
  
    CDialog::OnInitDialog();  
    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动  
    //  执行此操作  
    SetIcon(m_hIcon, TRUE);         // 设置大图标  
    SetIcon(m_hIcon, FALSE);        // 设置小图标  
  
  
    int   i = 111111;  
    float f = 222.2;  
    BOOL  b = TRUE;  
    enum{  
        ENUM1 = 1,  
        ENUM2,  
        ENUM3  
    };  
    LOG("abcd1234……")  
    LOG(i)  
    LOG(f)  
    LOG(b)  
    LOG(ENUM2)  
  
  
    LOG_FUNC_END  
  
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的spdlog是一个快速、易于使用的日志记录库。它提供了多种日志记录模式,支持多线程,具有灵活的格式化选项,并且在性能上表现出色。你可以使用spdlog来记录应用程序中的各种事件、错误和调试信息。 要使用spdlog,首先你需要在你的C++项目中包含spdlog文件,并将spdlog库链接到你的项目中。你可以通过下载spdlog的源代码并手动添加到你的项目中,或者使用包管理工具(如vcpkg)来安装spdlog。 下面是一个简单的示例,展示了如何在C++中使用spdlog进行日志记录: ```cpp #include <spdlog/spdlog.h> int main() { // 创建一个名为"my_logger"的日志记录器 auto logger = spdlog::stdout_logger_mt("my_logger"); // 设置日志记录级别为调试 spdlog::set_level(spdlog::level::debug); // 记录不同级别的日志信息 logger->info("This is an info message"); logger->warn("This is a warning message"); logger->error("This is an error message"); return 0; } ``` 在上面的示例中,我们创建了一个名为"my_logger"的日志记录器,并将其输出到控制台(stdout)。然后,我们设置日志记录级别为调试(debug),这意味着所有调试级别及更高级别的日志消息都会被记录。 最后,我们使用logger对象记录了一些不同级别的日志消息。日志消息的格式可以根据你的需要进行自定义。 这只是一个简单的示例,你可以根据你的具体需求使用spdlog进行更复杂的日志记录。你可以查看spdlog的文档以获取更多详细信息和示例:https://github.com/gabime/spdlog

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值