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

成品日志函数

1、可以选择显示时间、日期时间、不显示时间和日期

2、要养成使用define简化代码和当开关的习惯

#include <iostream>
#include <fstream>
#include <chrono>
#include <ctime>
#include <cstdarg>
#include <sstream>
#include <thread>#define LOG_TO_CONSOLE_AND_FILE//时间
//#define LOG_TO_CONSOLE_AND_FILE_WITH_DATE//日期 时间
//都注释掉 就不显示时间和日期了#ifdef LOG_TO_CONSOLE_AND_FILE_WITH_DATE
#define LOG(format, ...) LogToConsoleAndFile(std::to_string(index) + windowName + ".txt", true,  format, __VA_ARGS__)
#elif defined(LOG_TO_CONSOLE_AND_FILE)
#define LOG(format, ...) LogToConsoleAndFile(std::to_string(index) + windowName + ".txt", false, format, __VA_ARGS__)
#else
#define LOG(format, ...) LogToConsole(format, __VA_ARGS__)
#endifvoid LogToConsole(const char* format, ...)
{va_list args;va_start(args, format);vprintf(format, args);va_end(args);
}void LogToConsoleAndFile(const std::string& filename, bool includeDate, const char* format, ...)
{// 打开文件以追加写入日志std::ofstream file(filename, std::ios::app);if (!file.is_open()){std::cerr << "无法打开日志文件:" << filename << std::endl;return;}// 获取时间戳auto now = std::chrono::system_clock::now();std::time_t currentTime = std::chrono::system_clock::to_time_t(now);std::tm timeInfo;
#ifdef _WIN32localtime_s(&timeInfo, &currentTime);
#elselocaltime_r(&currentTime, &timeInfo);
#endifchar timeBuffer[128];if (includeDate){//std::strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %T", &timeInfo);//%T ==%H:%M:%Sstd::strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %H:%M:%S", &timeInfo);}else{//std::strftime(timeBuffer, sizeof(timeBuffer), "%T", &timeInfo);std::strftime(timeBuffer, sizeof(timeBuffer), "%H:%M:%S", &timeInfo);}// 格式化日志消息va_list args;va_start(args, format);char buffer[256];vsnprintf(buffer, sizeof(buffer), format, args);va_end(args);// 在控制台和文件中输出日志消息std::printf("%s %s", timeBuffer, buffer);file << timeBuffer << " " << buffer;
}void ThreadFunction(int index, const std::string& windowName)
{// 设置窗口名字std::string filename = std::to_string(index) + windowName;long x1{3243}, y1{423}, x2{42}, y2{-55};// 在不同线程中写入日志LOG("---%d行------窗口:%s-----------点击羽毛,坐标%d,%d,%d,%d--------\n", 23, filename.c_str(), x1, y1, x2, y2);//甚至简化的只用一个字母//l("---%d行------窗口:%s-----------点击羽毛,坐标%d,%d,%d,%d--------\n", 23, filename.c_str(), x1, y1, x2, y2);
}int main()
{std::thread thread1(ThreadFunction, 0, "窗口1");std::thread thread2(ThreadFunction, 100, "窗口2");thread1.join();thread2.join();return 0;
}

相关文章:

  • Scrapy爬虫异步框架(一篇文章齐全)
  • 插入排序(形象类比)
  • ubuntu修改系统语言
  • Windows系统管理之备份与恢复
  • PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables
  • Hibernate 脏检查和刷新缓存机制
  • 【开源】基于Vue.js的天然气工程运维系统的设计和实现
  • EMG肌肉信号处理合集 (一)
  • 【DP】mobiusp正在创作乐曲
  • ubuntu20.04配置OpenCV的C++环境
  • 深度学习之基于YoloV3杂草识别系统
  • GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件
  • 操作系统 应用题 例题+参考答案(考研真题)
  • 【Ambari】HDFS基于Ambari的常规运维
  • 基于C#实现赫夫曼树
  • 2017前端实习生面试总结
  • 78. Subsets
  • Iterator 和 for...of 循环
  • JavaScript类型识别
  • Java知识点总结(JavaIO-打印流)
  • js继承的实现方法
  • Node + FFmpeg 实现Canvas动画导出视频
  • text-decoration与color属性
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 从伪并行的 Python 多线程说起
  • 力扣(LeetCode)965
  • 利用jquery编写加法运算验证码
  • 排序算法学习笔记
  • 前端之Sass/Scss实战笔记
  • 通信类
  • 线上 python http server profile 实践
  • 详解NodeJs流之一
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 安徽锐锋科技IDMS系统简介
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (¥1011)-(一千零一拾一元整)输出
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)ssm码农论坛 毕业设计 231126
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (四) 虚拟摄像头vivi体验
  • (五)MySQL的备份及恢复
  • ./configure、make、make install 命令
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .htaccess 强制https 单独排除某个目录
  • .NET开发者必备的11款免费工具
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [ solr入门 ] - 利用solrJ进行检索
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [20171101]rman to destination.txt