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

成品日志函数

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__)
#endif

void 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 _WIN32
    localtime_s(&timeInfo, &currentTime);
#else
    localtime_r(&currentTime, &timeInfo);
#endif
    char timeBuffer[128];
    if (includeDate)
    {
        //std::strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %T", &timeInfo);//%T ==%H:%M:%S
        std::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;
}

http://www.kler.cn/a/144612.html

相关文章:

  • SELinux零知识学习二十八、SELinux策略语言之类型强制(13)
  • JAVA之异常详解
  • 从零开始搭建博客网站-----源代码试部署
  • 【C语言】函数(四):函数递归与迭代,二者有什么区别
  • 微服务实战系列之Nginx
  • C# 使用NPOI操作Excel的工具类
  • 图书管理系统源码,图书管理系统开发,图书借阅系统源码二表字段注释说明
  • 接口测试之文件上传
  • Flink 常用物理分区算子(Physical Partitioning)
  • Nacos身份绕过漏洞复现(QVD-2023-6271)
  • C语言矩阵乘积(ZZULIOJ1127:矩阵乘积)
  • 香港证监会再点名,三家“可疑虚拟资产平台交易平台”!
  • 【Docker】Docker与Kubernetes:区别与优势对比
  • selenium的基础语法
  • 百度AI布局:从财报看百度的核心竞争力和未来发展方向
  • 数字孪生智慧校园 Web 3D 可视化监测
  • 模型优化【2】-剪枝[局部剪枝]
  • 【从浅识到熟知Linux】基本指定之find、grep、head和tail
  • 基于Springboot的冬奥会科普平台(有报告),Javaee项目,springboot项目。
  • Debian 12 / Ubuntu 22.04 安装 Docker 以及 Docker Compose 教程