首页 > 编程语言 >C++日志头文件[gpt]

C++日志头文件[gpt]

时间:2024-07-18 10:23:05浏览次数:12  
标签:头文件 level LogLevel C++ logLevel MODE gpt Logger define

只要include头文件就能使用,单例模式

#ifndef MONITORING_LOGGER_H
#define MONITORING_LOGGER_H

#include <iostream>
#include <string>
#include <sstream>
#include <mutex>
#include <cstdarg>
#include <iomanip>

// Set log level
#define MODE_DEBUG 1
#define MODE_INFO 1
#define MODE_WARN 1
#define MODE_ERROR 1

// Control log prefix
#define LOG_SHOW_LEVEL 1
#define LOG_SHOW_PATH 0
#define LOG_SHOW_FILENAME 1
#define LOG_SHOW_LINE 1

class Logger {
public:
    enum LogLevel {
        DEBUG,
        INFO,
        WARN,
        ERROR
    };

    static Logger& getInstance() {
        static Logger instance;
        return instance;
    }

#if MODE_DEBUG
    Logger(LogLevel level = DEBUG) : logLevel(level) {}
#elif MODE_INFO
    Logger(LogLevel level = INFO) : logLevel(level) {}
#elif MODE_WARN
    Logger(LogLevel level = WARN) : logLevel(level) {}
#elif MODE_ERROR
    Logger(LogLevel level = ERROR) : logLevel(level) {}
#else
    Logger(LogLevel level = DEBUG) : logLevel(level) {}
#endif

    void log(LogLevel level, const char* file, int line, const char* format, ...) {
        std::lock_guard<std::mutex> lock(mtx);
        if (level >= logLevel) {
            // Print log prefix
            printLogPrefix(level, file, line);

            va_list args;
            va_start(args, format);
            vfprintf(stdout, format, args);
            va_end(args);
            std::cout << std::endl;
        }
    }

    void log_no_newline(LogLevel level, const char* file, int line, const char* format, ...) {
        std::lock_guard<std::mutex> lock(mtx);
        if (level >= logLevel) {
            // Print log prefix
            printLogPrefix(level, file, line);

            va_list args;
            va_start(args, format);
            vfprintf(stdout, format, args);
            va_end(args);
        }
    }

    void setLogLevel(LogLevel level) {
        logLevel = level;
    }

private:
    LogLevel logLevel;
    std::mutex mtx;

    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;

    void printLogPrefix(LogLevel level, const char* file, int line) {
#if LOG_SHOW_LEVEL
        std::cout << "[" << getLevelString(level) << "] ";
#endif

#if LOG_SHOW_PATH
        std::cout << file;
#elif LOG_SHOW_FILENAME
        std::cout << getFileName(file);
#endif

#if LOG_SHOW_LINE
        std::cout << ":" << line;
#endif

        if (LOG_SHOW_PATH || LOG_SHOW_FILENAME || LOG_SHOW_LINE) {
            std::cout << " ";
        }
    }

    const char* getFileName(const char* path) {
        const char* fileName = path;
        for (const char* p = path; *p; ++p) {
            if (*p == '/' || *p == '\\') {
                fileName = p + 1;
            }
        }
        return fileName;
    }

    const char* getLevelString(LogLevel level) {
        switch (level) {
            case DEBUG: return "DEBUG";
            case INFO:  return "INFO ";
            case WARN:  return "WARN ";
            case ERROR: return "ERROR";
            default:    return "UNKNOWN";
        }
    }
};

// Helper macros to easily log messages with file and line information
#define LOG_DEBUG(format, ...) Logger::getInstance().log(Logger::DEBUG, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_DEBUG_(format, ...) Logger::getInstance().log_no_newline(Logger::DEBUG, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_INFO(format, ...) Logger::getInstance().log(Logger::INFO, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_INFO_(format, ...) Logger::getInstance().log_no_newline(Logger::INFO, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_WARN(format, ...) Logger::getInstance().log(Logger::WARN, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_WARN_(format, ...) Logger::getInstance().log_no_newline(Logger::WARN, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) Logger::getInstance().log(Logger::ERROR, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_ERROR_(format, ...) Logger::getInstance().log_no_newline(Logger::ERROR, __FILE__, __LINE__, format, ##__VA_ARGS__)

#endif //MONITORING_LOGGER_H

标签:头文件,level,LogLevel,C++,logLevel,MODE,gpt,Logger,define
From: https://www.cnblogs.com/aliving/p/18308867

相关文章

  • 高质量C/C++编程指南总结(八)—— C++高级特性
    1.成员函数重载特征相同的范围(在同一个类中)函数名称相同参数不同virtual关键字可有可无2.覆盖的特征覆盖是指派生类函数覆盖基类函数,所以范围不同(分别位于派生类和基类)函数名称相同参数相同基类函数必须有virtual关键字如下示例中,函数Base::f(int)与Base::f(flo......
  • C++ 数组作为函数参数示例
    C++数组作为函数参数示例:#include<iostream>staticvoidprint(constint*beg,constint*end){while(beg!=end){std::cout<<*beg++<<std::endl;}}staticvoidprint(constint*arr,constsize_tsize){for(size......
  • C/C++ 逻辑表达式的注意事项
    在C/C++中,逻辑表达式是用于控制程序流程的重要工具,尤其是在条件语句(如if、while、for等)中。正确使用逻辑表达式对于编写高效、易于理解的代码至关重要。以下是一些使用C/C++逻辑表达式时的注意事项:运算符优先级:逻辑运算符(&&、||、!)具有不同的优先级。!(逻辑非)具有较高的优......
  • C++之动态内存分配
    目录(1)动态内存分配概述A.C++内存空间模型B.What(什么是动态内存分配)C.Why(为什么要进行动态内存分配)D.How(如何进行动态内存分配)(2)定位new运算符A.What(什么是定位new运算符)B.Why(定位new运算符的作用)C.How(如何使用定位new运算符)(3)重载new和delete(1)......
  • C++--accumulate介绍
    在C++中,accumulate是一个用于对容器中的元素进行累加操作的函数模板,位于头文件中。它允许你对容器(如vector或array)中的元素进行累加运算,并返回累加的结果。源代码展示template<classInputIterator,classType>Typeaccumulate(InputIterator_First,//开始迭代......
  • C++:哈希表特性及开散列哈希表的模拟实现
    目录一、unordered_map1.1特性1.2接口1.21构造函数1.22 iteratorfind(constK& key)1.23 insert1.24 operator[]1.25 erase1.26find1.3哈希概念1.31闭散列哈希表1.32开散列哈希表二、部分功能模拟实现hashtable.hunordered_map.hunordered_set.h......
  • 真的求求点赞+关注+收藏了!!(c++小游戏3)(还有其它的)
    13、球球大作战//奇怪的游戏#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;voidpass(){CONSOLE_CURSOR_INFOcursor_info={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);}intjj......
  • GPT-4和ChatGPT的高级技巧---微调
    文章目录开始微调使用OpenAIAPI进行微调    OpenA提供了许多可直接使用的GPT模型。尽管这些模型在各种任务上表现出色,但针对特定任务或上下文对它们进行微调,可以进一步提高它们的性能。开始微调    假设你想为公司创建一个电子邮件自动回复生成器。......
  • Linux C++ 059-设计模式之备忘录模式
    LinuxC++059-设计模式之备忘录模式本节关键字:Linux、C++、设计模式、备忘录模式相关库函数:概念备忘录模式(MementoPattern),又叫做快照模式(SnapshotPattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获一个......
  • Linux C++ 060-设计模式之单例模式
    LinuxC++060-设计模式之单例模式本节关键字:Linux、C++、设计模式、单例模式相关库函数:概念单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对......