当前位置: 首页 > 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;
}

相关文章:

C++简单日志系统

需求描述 日志等级&#xff1a;定义一个枚举类型 LogLevel&#xff0c;包含至少四个等级&#xff1a;DEBUG、INFO、WARNING、ERROR。日志记录&#xff1a;实现一个 Logger 类&#xff0c;包含以下功能&#xff1a; 一个静态方法 log&#xff0c;接受 LogLevel 和一个字符串作为…...

MySQL基础练习题:习题21-25

这部分主要是为了帮助大家回忆回忆MySQL的基本语法&#xff0c;数据库来自于MySQL的官方简化版&#xff0c;题目也是网上非常流行的35题。这些基础习题基本可以涵盖面试中需要现场写SQL的问题。 列出在部门sales工作的员工的姓名&#xff0c;假定不知道销售部的部门编号 sele…...

全面的网络流量监控

流量监控指的是对数据流进行的监控&#xff0c;通常包括出数据、入数据的速度、总流量。通过网络流量监控&#xff0c;组织可以确保只有业务关键型流量通过网络传输&#xff0c;并限制不需要的网络流量&#xff0c;从而提高网络效率&#xff0c;又可以防止停机、减少 MTTR、帮助…...

探索网络爬虫:技术演进与学习之路

网络爬虫及IP代理池 前言爬虫技术的演进最新的爬虫技术爬虫技术学习路线 前言 在信息时代&#xff0c;网络爬虫技术作为获取和处理网络数据的重要手段&#xff0c;已经成为数据科学、机器学习和许多商业应用的基石。从简单的HTML页面抓取到复杂的动态内容采集&#xff0c;爬虫…...

目标检测——色素性皮肤病数据集

一、重要性及意义 首先&#xff0c;色素性皮肤病变是一类常见的皮肤疾病&#xff0c;其发病率有逐年增高的趋势。这些病变可能由遗传或环境因素导致黑素细胞生成异常&#xff0c;如黑色素瘤等。黑色素瘤具有极高的恶性率和致死率&#xff0c;而且恶化可能性大&#xff0c;容易…...

Unity3D 打空包与远程资源更新详解

前言 在游戏开发过程中&#xff0c;打包和远程资源更新是非常重要的步骤&#xff0c;本文将详细介绍Unity3D中如何进行打空包和远程资源更新。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 一、打空包 …...

32单片机入门持续更新中

配套资料为野火霸道V2 初识 STM32 4.1 什么是 STM32 STM32&#xff0c;从字面上来理解&#xff0c;ST 是意法半导体&#xff0c;M 是 Microelectronics 的缩写&#xff0c;32 表示 32 位&#xff0c;合起 来理解&#xff0c;STM32 就是指 ST 公司开发的 32 位微控制器。在如今…...

蓝桥杯 每天2题 day6

碎碎念&#xff1a;哇咔咔 要不是中间缺勤一天就圆满day7了&#xff01;最后一晚上&#xff01;写题复习哇咔咔 唉&#xff0c;睡了一觉就看不下去了&#xff0c;&#xff0c;&#xff0c;看看之前的笔记洗洗睡觉&#xff0c;&#xff0c;&#xff0c; 记得打印准考证带好东西…...

Fast-lio2运行时如何显示轨迹线

修改对应设备的.yaml文件&#xff0c;以velodyne为例&#xff1a; 将 path_en参数改为true即可&#xff0c;运行其他设备&#xff0c;修改对应的参数...

2022年全国青少年信息素养大赛Python国赛第1-10题,含解析答案

01-分苹果 把一堆苹果分给n个小朋友,每个人拿到的苹果数量不同,并且每个人至少有一个。任意输入小朋友的数量n,问这堆苹果至少应该有多少个。输入描述:任意输入小朋友的数量n输出描述:输出这堆苹果至少应该有多少个 样例输入: 3 样例输出: 6 注意: input()内不添…...

python学习笔记——文件操作

1. 文件操作**** 1.1. open()函数**** 参数&#xff1a; 1. File&#xff1a;需要打开的文件 2. Mode&#xff1a;读、写、读写 (1) r&#xff1a;只读 (2) w&#xff1a;只写文件&#xff08;覆盖&#xff09; (3) a&#xff1a;只写文件&#xff08;追加&#xff09; …...

滑动窗口用法

文章目录 1. 长度最小的子数组&#xff08;模板&#xff09;2. 无重复字符的最长字串3. 最小覆盖字串4. 加油站5. 替换字串得到平衡字符串 1. 长度最小的子数组&#xff08;模板&#xff09; 题目分析 直接用步骤分析示例1&#xff0c;[]表示窗口&#xff0c;min_length表示满…...

智慧港口整体解决方案(一)

前言 智慧港口建设对创新驱动、转型发展具有重要推动作用加快推动第五代港口发展进程,成为当今港口转变发展方式、 提升企业综合竞争力的主潮流。智慧港口是港口未来发展主要方向 物联网、云计算技术发展智慧港口是物联网、移动互联网、云计算、人工智能等高新 技术与港口功能的…...

ubuntu如何限制系统日志大小?

ubuntu中的系统日志文件件如不及时清理&#xff0c;时间长了会占用硬盘的空间&#xff0c;如下所示&#xff1a; /var/log/journal/4321d62ad63d44cbbc4dff3b6e282b26/system9f5b4d5081d24b319f8b4677cf673a97-0000000000184ca6-00061412655a5a79.journal: 128M /var/log/journ…...

【Linux】线程概念及线程互斥

目录 线程概念 线程优点 线程缺点 线程异常 线程系统编程接口 线程创建及终止 线程等待 使用线程系统接口封装一个小型的C线程库并实现一个抢票逻辑 线程互斥 互斥量的接口 线程互斥实现原理 使用系统加锁接口封装LockGuard 实现自动化加锁 线程安全和可重入函数 …...

测试需求分析

测试需求是什么&#xff1f; --需求文档 测试需求主要解决**“测什么”的问题&#xff0c;一般来自需求规格说明书中原始需求 测试需求应全部覆盖已定义的业务流程&#xff0c;以及功能和非功能**方面的需求 功能&#xff1a;基本用户需求–优先 非功能&#xff1a;界面&#…...

Qt 翻译工具:使用 tr() 函数实现多语言支持

引言 在开发跨平台应用程序时&#xff0c;支持多语言是一个常见需求。Qt 提供了一套完整的国际化工具&#xff0c;帮助开发者轻松实现应用程序的本地化。本文将介绍如何在 Qt 中使用 tr() 函数进行翻译&#xff0c;并总结一些常见的困难和解决方法。 使用 tr() 函数进行翻译 …...

使用 kustomize 对 kubernetes 对象进行声明式管理

补丁实战 策略合并补丁 基准文件&#xff1a;/test/bases/deploy.yml apiVersion: apps/v1 kind: Deployment metadata:namespace: sharkname: my-nginx spec:selector:matchLabels:run: my-nginxreplicas: 2template:metadata:labels:run: my-nginxspec:containers:- name:…...

Android Studio开发学习(六)———TableLayout(表格布局)、FrameLayout(帧布局)

目录 前言 一、Tablelayout &#xff08;一&#xff09;Tablelayout的相关简介 &#xff08;二&#xff09;TableLayout使用方法 1. 当TableLayout下面写控件、则控件占据一行的大小。(自适应一行&#xff0c;不留空白) 2.多个组件占据一行&#xff0c;则配合TableRow实现…...

c++ override关键字

在C11及之后的标准中&#xff0c;override是一个关键字&#xff0c;用于表示派生类中的成员函数覆盖了基类中的虚函数。 使用override关键字的好处在于它提供了一种明确的方式来指示编译器&#xff1a;该函数打算覆盖基类中的虚函数。如果使用了override关键字&#xff0c;但该…...

三引脚压电陶瓷片:从自激振荡原理到高效驱动电路设计

1. 三引脚压电陶瓷片为何成为硬件工程师的新宠 第一次接触三引脚压电陶瓷片时&#xff0c;我和大多数工程师一样充满疑惑&#xff1a;为什么要在传统两引脚结构上增加第三个引脚&#xff1f;直到在某个低功耗项目中&#xff0c;传统它激式蜂鸣器耗电量超出预期&#xff0c;我才…...

数字音频抖动抑制技术与DSS™同步方案解析

1. 数字音频系统中的抖动现象解析抖动&#xff08;Jitter&#xff09;是数字音频领域最令人头痛的问题之一&#xff0c;它就像一位不守时的乐队指挥——当每个音符的演奏时机出现微秒级的偏差时&#xff0c;整首乐曲就会失去原有的韵律和质感。在技术层面&#xff0c;抖动被定义…...

从FinFET到3D-IC:2013年预测如何塑造了今天的低功耗与异构计算设计

1. 项目概述&#xff1a;站在2013年初的十字路口十多年前&#xff0c;2013年初的那个冬天&#xff0c;整个半导体与电子设计自动化行业弥漫着一种既兴奋又焦虑的复杂情绪。当时&#xff0c;我作为行业里的一名技术编辑&#xff0c;向数十位来自芯片设计公司、EDA工具供应商、IP…...

文献处理效率暴跌?NotebookLM Agent的3层语义理解架构,让PDF秒变可推理知识图谱!

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;文献处理效率暴跌&#xff1f;NotebookLM Agent的3层语义理解架构&#xff0c;让PDF秒变可推理知识图谱&#xff01; 传统PDF阅读工具仅支持关键词检索与线性浏览&#xff0c;面对百页学术论文或跨领域…...

管理幅度怎样设置才合理?

https://mp.weixin.qq.com/s/aoUgKUmsOUyC7wWOONMIIw...

如何轻松完成ESP8266固件烧录:NodeMCU PyFlasher图形化工具详解

如何轻松完成ESP8266固件烧录&#xff1a;NodeMCU PyFlasher图形化工具详解 【免费下载链接】nodemcu-pyflasher Self-contained NodeMCU flasher with GUI based on esptool.py and wxPython. 项目地址: https://gitcode.com/gh_mirrors/no/nodemcu-pyflasher NodeMCU …...

VESC驱动无刷电机入门避坑:从看不懂ChibiOS源码到5分钟搞定CAN通讯

VESC驱动无刷电机入门避坑&#xff1a;从看不懂ChibiOS源码到5分钟搞定CAN通讯 第一次接触VESC驱动无刷电机时&#xff0c;面对满屏的ChibiOS源码和复杂的CAN通讯协议&#xff0c;很多嵌入式新手都会感到无从下手。特别是当你已经能用VESC Tool让电机转起来&#xff0c;但想通过…...

从零搭建AI增强型第二大脑:NotebookLM+Obsidian+Dataview三体联动,7天知识处理效率提升3.8倍

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM与Obsidian整合的底层逻辑与价值定位 NotebookLM 与 Obsidian 的整合并非简单插件叠加&#xff0c;而是基于“语义增强型知识工作流”的范式迁移。其底层逻辑根植于双引擎协同&#xff1a;No…...

华为eNSP Cloud网卡异常排查指南:从WinPcap兼容性到虚拟网卡同步

1. 华为eNSP Cloud网卡异常排查指南 最近在帮朋友调试华为eNSP Cloud时遇到了网卡异常的问题&#xff0c;折腾了大半天才解决。这个问题其实挺常见的&#xff0c;特别是对于刚接触eNSP Cloud的新手来说。今天我就把完整的排查流程和解决方法分享给大家&#xff0c;希望能帮到遇…...

终极罗技PUBG压枪宏配置指南:从新手到高手的完整教程

终极罗技PUBG压枪宏配置指南&#xff1a;从新手到高手的完整教程 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中经历过这…...