当前位置: 首页 > news >正文

C++简单日志系统

需求描述

  1. 日志等级:定义一个枚举类型 LogLevel,包含至少四个等级:DEBUGINFOWARNINGERROR
  2. 日志记录:实现一个 Logger 类,包含以下功能:
    • 一个静态方法 log,接受 LogLevel 和一个字符串作为参数,用于记录日志。
    • 一个静态方法 setLevel,用于设置日志等级,只有当记录的日志等级大于等于设置的等级时,日志才会被输出。
    • 日志输出应包括时间戳、日志等级和日志信息。
  3. 多文件支持Logger 类应该支持将日志输出到不同的文件,例如 debug.loginfo.logwarning.log 和 error.log
  4. 线程安全Logger 类应该是线程安全的,以支持多线程环境下的日志记录。

代码示例:

#include <iostream>
#include <string>
#include <fstream>
#include <mutex>
#include <chrono>
#include <ctime>using namespace std;enum LogLevel
{DEBUG,INFO,WARNING,ERROR,
};class Logger
{
private:static LogLevel m_currentLevel;static mutex mtx;
public:Logger(/* args */);~Logger();public:static void setLevel(LogLevel level);// 记录日志生成文件static void log(LogLevel level, const string &msg);
};Logger::Logger(/* args */)
{
}Logger::~Logger()
{
}void Logger::setLevel(LogLevel level)
{lock_guard<mutex> lock(mtx);m_currentLevel = level;
}// 记录日志生成文件
void Logger::log(LogLevel level, const string &msg)
{// 加锁lock_guard<mutex> lock(mtx);// 根据默认设置的等级屏蔽掉低于该等级的日志,不需要生成对应的文件if(level >= m_currentLevel){string strLevel;switch (level){case DEBUG:strLevel = "DEBUG";break;case INFO:strLevel = "INFO";break;case WARNING:strLevel = "WARNING";break;case ERROR:strLevel = "ERROR";break;default:strLevel = "UNKNOW";break;}// 记录日志的时间time_t now = time(nullptr);tm *currTime = localtime(&now);char buffer[80];strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", currTime);// 创建日志文件名并写入数据string fileName = strLevel + ".log";// 打开文件,以追加的形式写入ofstream file(fileName, ios_base::app);if(!file.is_open()){cerr << "Unable to open log file: " << fileName << endl;}file << buffer << "[" << strLevel << "]" << msg <<endl;file.close();}
}// 初始化静态变量
LogLevel Logger::m_currentLevel = INFO;
std::mutex Logger::mtx;int main()
{Logger::setLevel(INFO); // 默认为INFOLogger::log(DEBUG, "This is a debug message."); // 不输出Logger::log(INFO, "This is an info message."); // 输出到 info.logLogger::log(WARNING, "This is a warning message."); // 输出到 warning.logLogger::log(ERROR, "This is an error message."); // 输出到 error.logreturn 0;
}

http://www.lryc.cn/news/337331.html

相关文章:

  • MySQL基础练习题:习题21-25
  • 全面的网络流量监控
  • 探索网络爬虫:技术演进与学习之路
  • 目标检测——色素性皮肤病数据集
  • Unity3D 打空包与远程资源更新详解
  • 32单片机入门持续更新中
  • 蓝桥杯 每天2题 day6
  • Fast-lio2运行时如何显示轨迹线
  • 2022年全国青少年信息素养大赛Python国赛第1-10题,含解析答案
  • python学习笔记——文件操作
  • 滑动窗口用法
  • 智慧港口整体解决方案(一)
  • ubuntu如何限制系统日志大小?
  • 【Linux】线程概念及线程互斥
  • 测试需求分析
  • Qt 翻译工具:使用 tr() 函数实现多语言支持
  • 使用 kustomize 对 kubernetes 对象进行声明式管理
  • Android Studio开发学习(六)———TableLayout(表格布局)、FrameLayout(帧布局)
  • c++ override关键字
  • 卫星影像联合无人机实现农业保险全生命周期监管监测
  • ChatGLM2-6B_ An Open Bilingual Chat LLM _ 开源双语对话语言模型
  • JAVA的学习日记DAY6
  • Grafana告警(邮件)自定义模板配置
  • 大话设计模式——六大基本设计原则(SOLID原则)
  • Qt | Q_PROPERTY属性和QVariant 类
  • 力扣207.课程表
  • 十五届web模拟题整理
  • ubuntu20.04 安裝PX4 1.13
  • 大型网站系统架构演化
  • 探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)