可变参数模板日志类

  • Post author:
  • Post category:c++
  • Post comments:0评论

下面是一个可变参数模板日志类的例子,示例代码中定义了一个名为Logger的类模板,它接受任意数量和类型的参数,并将它们格式化为可读的消息字符串,然后将它们写入日志文件。

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <ctime>
#include <sstream>

class Logger {
public:
    explicit Logger(const std::string& filename) {
        m_file.open(filename, std::ios::out | std::ios::app);
    }

    ~Logger() {
        m_file.close();
    }

    template <typename... Args>
    void log(const char* level, Args... args) {
        auto now = std::time(nullptr);
        auto tm = *std::localtime(&now);

        std::ostringstream oss;
        oss << "[" << std::put_time(&tm, "%Y-%m-%d %H:%M:%S") << "] [" << level << "] ";
        format(oss, args...);
        oss << "\n";

        m_file << oss.str();
    }

private:
    std::ofstream m_file;

    template <typename T>
    void format(std::ostringstream& oss, T value) {
        oss << value;
    }

    template <typename T, typename... Args>
    void format(std::ostringstream& oss, T value, Args... args) {
        format(oss, value);
        format(oss, args...);
    }
};

int main() {
    Logger log("test.log");

    log.log("INFO", "This is a test log message.");
    log.log("WARNING", "The value of pi is approximately ", 3.14159);
    log.log("ERROR", "Failed to open file: ", "test.txt");

    return 0;
}

在这个示例中,我们首先定义了一个名为Logger的类模板,它有一个模板参数包,其中包含各种参数类型和数量。然后,我们定义了一个名为log的可变参数模板函数,它接受一个表示消息级别的字符串以及任意数量和类型的参数。这个函数使用现有的C++库函数(如std::time和std::put_time)获取当前时间并将其作为字符串的一部分打印到日志消息中。然后,它使用ostringstream实例格式化传递的所有参数,并将结果附加到日志文件中。最后,我们在main函数中使用这个日志记录器记录三条不同的日志消息,每个消息都有不同数量和类型的参数。

文章作者: 张拓
文章链接: http://www.xssl.online/%e5%8f%af%e5%8f%98%e5%8f%82%e6%95%b0%e6%a8%a1%e6%9d%bf%e6%97%a5%e5%bf%97%e7%b1%bb/
版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明来自 张拓的博客
浏览次数: 794

张拓

陕西西安蓝田张拓QQ1070410059。一生所求不过“心安”二字。 然,尘世多纷扰。

发表回复