C++ log日志库

#ifndef nlog_h__
#define nlog_h__

/*
*    nlog
*    Email:<728297725@qq.com>

*    异步
*    多线程安全

*    Example:
*    #include "nlog.h"                                             //包含头文件, 并连接对应的lib
*    ...
*    _NLOG_ERR("Hello, %s", "nlog") << " Now Time:" << nlog::time; //c,c++风格混搭格式化输出
*    ...
*    _NLOG_SHUTDOWN();                                             //最后执行清理
*/

#include <map>
#include <sstream>

#define  WIN32_LEAN_AND_MEAN 
#include <windows.h>

/* export */
#ifdef  NLOG_STATIC_LIB
# define NLOG_LIB 
#else

#pragma warning( push )
#pragma warning( disable : 4251 ) 

#ifdef  NLOG_SHARE_LIB
# define NLOG_LIB __declspec(dllexport)
#else
# define NLOG_LIB __declspec(dllimport)
#endif // NLOG_SHARE_LIB
#endif // NLOG_STATIC_LIB

class CIOCP;
class CSimpleLock;

namespace nlog{

/*
*    日志等级
*/
enum LogLevel
{
    LV_ERR = 0,
    LV_WAR = 1,    
    LV_APP = 2,    
    LV_PRO = 3
};

/*
*   日志配置数据结构
*/
struct Config 
{
    /*
    *    日志存储目录      default: "{module_dir}\\log\\"
    *   可选变量:
    *   {module_dir}      当前可执行模块目录, 默认是程序的当前目录
    *    %Y,%m,%d,%H ...  时间日期格式化
    */
    std::wstring logDir;

    /*
    *    文件名格式        default: "log-%m%d-%H%M.log"    如(log-0805-2348.log)
    *   可选变量:
    *   %Y,%m,%d,%H ...   时间日期格式化
    */
    std::wstring fileName;

    /*
    *    日期格式          default: "%m-%d %H:%M:%S"       如(08-05 23:48:06)
    *   可选变量:
    *   %Y(%y),%m,%d,%H,%M,%S 时间日期格式化 分别是 年,月,日,时,分,秒
    */
    std::wstring dateFormat;

    /*
    *    前缀格式          default: "[{time}][{level}][{id}]: " 
    *                            如([08-05 23:48:06][ERR][2F84    ]: )
    *   可选变量:
    *   {module_dir}      当前可执行模块目录
    *   {level}           当前打印日志的等级
    *   {time}            当前打印日志的时间 格式由dateFormat指定
    *   {id}              当前打印日志的线程id
    *   {file}            当前打印日志的源文件名
    *   {line}            当前打印日志的源文件行
    */
    std::wstring prefixion;
};

/*
*   日志类
*/
class NLOG_LIB CLog
{
    CLog();
    ~CLog();

    CLog(const CLog&);
    CLog operator=(const CLog&);

    friend class CLogHelper;
    friend NLOG_LIB CLogHelper& time(CLogHelper& slef);

    static std::map<std::string, CLog*> __Instances;
    static std::auto_ptr<CSimpleLock>   __pLock;
public:
    /*
    *   获得一个Log的实例, 允许存在多个Log实例, guid代表实例的唯一Id
    *   每一个实例独占一个日志文件, 若它们之间具有相同的文件名称格式
    *   那么后一个被实例化的Log将指向一个具有"_1"的名称
    */
    static CLog& Instance(std::string guid = "");
    static bool  Release (std::string guid = "");
    static bool  ReleaseAll();

    /* 
    *   Log配置, 输出文件名称格式, 打印格式等...
    *   要注意的是, 设置必须在打印第一条日志之前完成否则可能不起任何作用 
    */
    bool    SetConfig(const Config& setting);
    Config  GetConfig() const;

    /* 在任何时候都可以指定日志打印的等级 */
    void    SetLevel(LogLevel level); 
protected:
    bool    InitLog();
    bool    CompleteHandle(bool bClose = false);

    struct  LogInfomation
    {
        LogLevel level;
        unsigned int line;
        std::wstring  file;
    };
    std::wstring Format (const std::wstring& strBuf, const LogInfomation& info = LogInfomation());
    CLog& FormatWriteLog(const std::wstring& strBuf, const LogInfomation& info = LogInfomation());
    CLog& WriteLog      (const std::wstring& strBuf);
private:
    CIOCP*   __pIocp; 
    HANDLE   __hFile;
    Config   __config;
    bool     __bAlreadyInit;
    LogLevel __filterLevel;

    unsigned int __count;
    LARGE_INTEGER __liNextOffset;
};

/*
*   日志格式化辅助类
*/
class NLOG_LIB CLogHelper
{
public:
    CLogHelper(LogLevel level, const char* file, const unsigned int line, const std::string& guid = "");
    ~CLogHelper();

    CLogHelper& Format();
    CLogHelper& Format(const wchar_t * _Format, ...);
    CLogHelper& Format(const char    * _Format, ...);

    template<class T> 
    CLogHelper& operator<<(T info);
    CLogHelper& operator<<(const std::string& info);
    CLogHelper& operator<<(CLogHelper&(__cdecl* pfn)(CLogHelper &));

    friend NLOG_LIB CLogHelper& time(CLogHelper& slef);
    friend NLOG_LIB CLogHelper& id  (CLogHelper& slef);

private:
    std::string __sessionId;
    std::wstringstream  __strbuf;
    CLog::LogInfomation __logInfo;
};

template<class T> 
CLogHelper& CLogHelper::operator<<(T info){
    __strbuf << info;
    return *this;
}

NLOG_LIB CLogHelper& time(CLogHelper& slef);
NLOG_LIB CLogHelper& id  (CLogHelper& slef);

}// namespace nlog

#ifndef  NLOG_STATIC_LIB
#pragma warning( pop )
#endif

/*
*    使用默认Log实例, 格式化输出一条信息
*   example:
*   _NLOG_ERR("hello") << "nlog";
*/
#define _NLOG_ERR  nlog::CLogHelper(nlog::LV_ERR, __FILE__, __LINE__).Format
#define _NLOG_WAR  nlog::CLogHelper(nlog::LV_WAR, __FILE__, __LINE__).Format
#define _NLOG_APP  nlog::CLogHelper(nlog::LV_APP, __FILE__, __LINE__).Format
#define _NLOG_PRO  nlog::CLogHelper(nlog::LV_PRO, __FILE__, __LINE__).Format

/*
*    使用指定的Log实例, 格式化输出一条信息
*   example:
*   #define LOG_UID    "custom log id"
*   #define LOG_ERR    _NLOG_ERR_WITH_ID(LOG_UID)   
*   ...
*   LOG_ERR("hello") << "nlog";     
*/
#define _NLOG_ERR_WITH_ID(id) nlog::CLogHelper(nlog::LV_ERR, __FILE__, __LINE__, id).Format
#define _NLOG_WAR_WITH_ID(id) nlog::CLogHelper(nlog::LV_WAR, __FILE__, __LINE__, id).Format
#define _NLOG_APP_WITH_ID(id) nlog::CLogHelper(nlog::LV_APP, __FILE__, __LINE__, id).Format
#define _NLOG_PRO_WITH_ID(id) nlog::CLogHelper(nlog::LV_PRO, __FILE__, __LINE__, id).Format

/*
*   设置初始配置
*   example:
*      
*   _NLOG_CFG cfg = {
*       L"",
*       L"nlog-%m%d%H%M.log",
*       L"",
*       L"[{time}][{level}][{id}][{file}:{line}]: "
*   };
*
*   _NLOG_SET_CONFIG(cfg);
*/

#define _NLOG_CFG                            nlog::Config
#define _NLOG_SET_CONFIG(cfg)                nlog::CLog::Instance().SetConfig(cfg)
#define _NLOG_SET_CONFIG_WITH_ID(id, cfg)    nlog::CLog::Instance(id).SetConfig(cfg)

/*
*    设置实时打印等级
*   example: - 设置只打印警告及以上的日志
*   
*   _NLOG_SET_LEVE(LV_WAR); 
*/
#define _NLOG_SET_LEVE(lev)                  nlog::CLog::Instance().SetLevel(lev)
#define _NLOG_SET_LEVE_WITH_ID(id, lev)      nlog::CLog::Instance(id).SetLevel(lev)
/*
*    执行清理工作, 销毁所有存在的nlog实例
*   example: - 初始配置与自动销毁
*
*   struct _NLogMgr 
*   {
*        _NLogMgr() 
*        {
*            _NLOG_CFG cfg = {
*                L"",
*                L"nlog-%m%d%H%M.log",
*                L"",
*                L"[{time}][{level}][{id}][{file}:{line}]: "
*            };
*    
*            _NLOG_SET_CONFIG(cfg);
*        }
*    
*        ~_NLogMgr() {
*            _NLOG_SHUTDOWN();
*        }
*    };
*
*    static _NLogMgr _NLog;
*/
#define _NLOG_SHUTDOWN  nlog::CLog::ReleaseAll

#endif // nlog_h__

https://download.csdn.net/download/u011269801/12379124

若想免费获取库文件:请关注微信公众号【春蕾夏荷】,公众号里面的【文件获取】中可得到下载链接。

公众号二维码:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spdlog是一个快速、异步的C++日志,支持多线程和跨平台,具有简单易用的接口和高性能的日志记录能力。以下是spdlog的一些主要特点: 1. 快速:spdlog使用高效的缓冲区实现快速的日志记录,可以轻松处理高负载的日志记录场景。 2. 异步:spdlog支持异步日志记录,可以将日志写入缓冲区后立即返回,不会阻塞主线程。 3. 多线程:spdlog可以安全地在多个线程中使用,支持多个线程同时进行日志记录,且不需要额外的同步机制。 4. 跨平台:spdlog可以在多个平台上运行,包括Windows、Linux、OS X等。 5. 简单易用:spdlog提供简洁明了的API,可以轻松地实现日志记录功能。 以下是spdlog的使用示例: ```cpp #include "spdlog/spdlog.h" void log_example() { // 创建一个控制台日志记录器 auto console = spdlog::stdout_color_mt("console"); // 创建一个文件日志记录器 auto file = spdlog::basic_logger_mt("file_logger", "logs/mylogfile.txt"); // 设置日志记录级别 console->set_level(spdlog::level::info); file->set_level(spdlog::level::trace); // 记录日志 console->info("Hello, spdlog!"); file->trace("This is a trace message."); } ``` 以上代码演示了如何创建一个控制台日志记录器和一个文件日志记录器,并设置不同的日志记录级别,最后分别记录了一条信息和一条跟踪信息。 更多关于spdlog的使用说明,请参考spdlog的官方文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值