linux:
#pragma once #include <chrono> static std::time_t getTimeStamp() { std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); auto tmp=std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()); std::time_t timestamp = tmp.count(); return timestamp; } static std::tm* gettm(uint64_t timestamp) { uint64_t milli = timestamp; milli += (uint64_t)8*60*60*1000;//add to beijing time zone. auto mTime = std::chrono::milliseconds(milli); auto tp=std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds>(mTime); auto tt = std::chrono::system_clock::to_time_t(tp); std::tm* now = std::gmtime(&tt); return now; } static std::string getTimeStr() { time_t timep; timep = getTimeStamp(); struct tm *info; info = gettm(timep); char tmp[27] = {0}; sprintf(tmp, "%04d-%02d-%02d %02d:%02d:%02d.%06ld", info->tm_year+1900, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec, timep%1000000); return tmp; } #define DEBUG_FLAG #ifdef DEBUG_FLAG #define MY_LOGD(format, ...) {printf("%s: D/%s[%s]: ", getTimeStr().c_str(), basename(__FILE__), __func__);printf(format, ##__VA_ARGS__);printf("\n");} #else #define MY_LOGD(format, ...) #endif #define MY_LOGE(format, arg...) {printf("%s: E/%s[%s]: ", getTimeStr().c_str(), basename(__FILE__), __func__);if(strlen(format)>0){printf(format, ##arg);}printf("\n");} #define FUNCTION_NAME MY_LOGD(" "); #define FUNCTION_IN MY_LOGD("+") #define FUNCTION_OUT MY_LOGD("-")
windows:
#pragma once #include <chrono> #ifdef WIN32 #include <ctime> #include <filesystem> #endif static std::time_t getTimeStamp() { std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()); std::time_t timestamp = tmp.count(); return timestamp; } static std::tm* gettm(uint64_t timestamp) { uint64_t milli = timestamp; milli += (uint64_t)8 * 60 * 60 * 1000;//add to beijing time zone. auto mTime = std::chrono::milliseconds(milli); auto tp = std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>(mTime); auto tt = std::chrono::system_clock::to_time_t(tp); std::tm* now = std::gmtime(&tt); return now; } static std::string getTimeStr() { time_t timep; timep = getTimeStamp(); struct tm *info; info = gettm(timep); char tmp[27] = { 0 }; sprintf_s(tmp, "%04d-%02d-%02d %02d:%02d:%02d.%06ld", info->tm_year + 1900, info->tm_mon + 1, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec, (long)timep % 1000000); return tmp; } static void string_replace(std::string &strBig, const std::string &strsrc, const std::string &strdst) { std::string::size_type pos = 0; std::string::size_type srclen = strsrc.size(); std::string::size_type dstlen = strdst.size(); while ((pos = strBig.find(strsrc, pos)) != std::string::npos) { strBig.replace(pos, srclen, strdst); pos += dstlen; } } static std::string GetPathOrURLShortName(std::string strFullName) { if (strFullName.empty()) { return ""; } string_replace(strFullName, "/", "\\"); std::string::size_type iPos = strFullName.find_last_of('\\') + 1; return strFullName.substr(iPos, strFullName.length() - iPos); } #define DEBUG_FLAG #ifdef DEBUG_FLAG #define MY_LOGD(format, ...) {printf("%s: D/%s[%s]: ", getTimeStr().c_str(), GetPathOrURLShortName(__FILE__).c_str(), __func__);printf(format, ##__VA_ARGS__);printf("\n");} #else #define MY_LOGD(format, ...) #endif #define MY_LOGE(format, ...) {printf("%s: E/%s[%s]: ", getTimeStr().c_str(), GetPathOrURLShortName(__FILE__).c_str(), __func__);if(strlen(format)>0){printf(format, ##__VA_ARGS__);}printf("\n");} #define FUNCTION_NAME MY_LOGD(" "); #define FUNCTION_IN MY_LOGD("+") #define FUNCTION_OUT MY_LOGD("-")
save file:
#include <ctime> #include <iostream> #include <fstream> #include <stdio.h> #include <stdarg.h> #include <direct.h> #include <string> #include <io.h> #include <stdlib.h> #include <sys/timeb.h> #include <time.h> #include <fcntl.h> /****************************** * 初始化日志 ******************************/ static FILE *logFile; void initLogFile(const char* dir="e:/") { time_t seconds = time(NULL); //获取时间 struct tm *p; p = localtime(&seconds);//获取本地时间 char filePath[100] = {0}; sprintf_s(filePath,"%s/log%04d-%02d-%02d_%02d%02d%02d.log",dir,1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec); logFile = fopen(filePath, "w"); if ( logFile == NULL ) { printf("can not open log file: %s/n", filePath); } } /****************************** * 打印日志 ******************************/ void log(const char *fmt ...) { if(logFile == NULL) { initLogFile(); } //获取本地时间 time_t seconds = time(NULL); struct tm *p; p = localtime(&seconds); // 毫秒 struct timeb tb; ftime(&tb); char prefix[100] = {0}; sprintf_s(prefix, "[%04d-%02d-%02d %02d:%02d:%02d.%03d] >> ",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec, tb.millitm); fprintf(logFile, "%s", prefix); va_list vp; va_start(vp, fmt); vfprintf(logFile, fmt, vp); //fprintf(logFile, "\n"); va_end(vp); fflush(logFile); } /****************************** * 打印日志(无前缀) ******************************/ void logNoPrefix(const char *fmt ...) { if(logFile == NULL) { initLogFile(); } va_list vp; va_start(vp, fmt); vfprintf(logFile, fmt, vp); va_end(vp); fflush(logFile); }
相关推荐
6. **日志格式化**:为了让日志更易读,可以添加前缀、颜色编码、换行符等。例如,使用`std::stringstream`来构造格式化的日志字符串。 以下是一个简单的C++日志类框架示例: ```cpp class Logger { public: ...
c、c++如果在日志中查看某个结构字段信息,只能通过printf逐个格式化,工作量大; 该dll库通知pdb文件分析结构体字段位置,并根据类型格式一个完整字符串,极大降低了开发者工作量。 1、可通过cdump\Release\...
而第三方库则提供了更丰富的功能,比如日志级别、日志目标(文件、控制台、数据库等)、格式化输出等。 描述中提到的"C# 日志Log打印类"可能是一个自定义的日志管理类,通常会包含以下几个核心功能: 1. **日志...
总之,这个C++实现的单例模式日志类结合了多种高级特性,包括多线程支持、日志等级控制、毫秒级时间戳和灵活的参数及格式化输出。这样的设计对于任何需要记录系统事件或调试的项目都是一个强大的工具。
**C++ Log4z日志打印库** 在C++编程中,日志记录是一个至关重要的环节,它能够帮助开发者在程序运行过程中跟踪错误、调试代码和优化性能。Log4z是一个专门为C++设计的日志记录库,其设计理念源于Java中的Log4j。Log...
总结起来,“C++ 控制台日志类”是一个自定义的日志模块,它允许在MFC应用中打开控制台窗口并实时打印日志信息。通过这个类,开发者能够方便地管理和分析程序运行时的数据,提高调试和维护效率。
1. **日志级别控制**:定义一个枚举类型或常量来表示日志级别,并在打印日志时根据设定的级别筛选信息。例如: ```c enum LogLevel {DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY}; ``` 2....
- **格式化输出**:包括时间戳、线程ID、日志级别标识符、日志消息等,使日志信息易于阅读和解析。 - **日志过滤**:允许根据日志级别或关键词过滤日志输出,避免过多的无关信息。 - **异常处理**:在捕获到异常时,...
- **日志存储(Storage)**:日志可以被存储在内存中、文件系统中或其他任何形式的持久化存储介质上。 ### 二、C++标准库中的日志输出方法 #### 使用`<fstream>`进行日志输出 在给出的部分代码示例中,我们看到了一...
这些库提供了丰富的功能,包括日志级别控制、日志格式化、日志目标(如文件、控制台、数据库)的配置等。自定义日志类时,需要考虑到线程安全、日志文件大小限制、回滚策略等问题。 C++的日志打印也类似,虽然C++...
- 格式化日志条目,例如包括时间、线程ID、日志级别标识符、源文件和行号,以提高可读性和分析性。 - 使用`strftime`函数格式化时间,确保日志文件易于阅读和分析。 6. **日志文件管理** - 限制单个日志文件大小...
"多线程调试打印日志类"是一个专门设计用于在多线程环境中记录和打印日志的C++类。此类实现了一个单例模式,确保在整个应用程序中只有一个实例存在,从而避免了资源竞争和日志混乱的问题。 首先,单例模式是一种...
3. **格式化输出**:日志信息应以一种清晰、易读的方式呈现,包括日志等级、时间、源文件、行号以及具体的日志消息。 4. **输出目标**:日志可以写入控制台、文件、网络或者其他的持久化存储。 在VC6 MFC环境中,...
这一主题可能包括如何使用标准输出流对象`std::cout`进行文本输出,以及如何格式化输出内容。 描述中的“显示 打印 显示 打印 显示 打印”进一步强调了输出操作的重要性,可能意味着这个压缩包包含了一些示例代码或...
为了保持日志的可读性,通常会按照一定的格式(如JSON、CSV或自定义格式)来组织这些信息。 3. **CloseLog()**:在程序结束或不再需要日志时,调用此函数关闭日志文件。这有助于释放系统资源,并确保所有待写入的...
- 日志格式化:根据需求定制日志的输出格式,如时间戳、线程ID、日志级别标识等。 - 文件操作:打开、关闭日志文件,确保安全写入。 3. **多线程支持**: 在多线程环境中,日志记录需要确保线程安全。Qt提供互斥...
在`EasyLog.h`头文件中,定义了各种日志级别(如DEBUG、INFO、WARN、ERROR和FATAL)以及打印日志的宏,这些宏使得在代码中插入日志语句变得非常方便。 例如,要记录一条INFO级别的日志,我们可以使用`LOG(INFO) 这...
本文将介绍如何在C++软件中添加dump调试打印日志,以便在遇到异常时捕获并记录程序状态,这对于排查复杂问题尤其有用。下面我们将深入探讨相关知识点。 首先,我们需要包含`<DbgHelp.h>`头文件,该文件提供了用于...
C++谷歌日志框架,全称为Google Glog,是一个开源的日志系统,广泛应用于C++项目中,尤其在大规模分布式系统中,它提供了强大的错误处理和日志记录功能。Glog是基于Google的log服务,它不仅实现了基本的日志记录,还...
可以使用C++的字符串格式化库,如`std::stringstream`或第三方库如`fmtlib`来实现。 3. **日志输出**:日志可以输出到标准输出(终端)、文件或者通过网络发送到远程服务器。在Linux中,可以使用`ofstream`类写入...