介绍
开发过程中日志打印输出是极为重要的,这里记录下一种宏定义方式的日志输出,非常简单实用。如果需要更多功能的输出则需要进一步的二次开发,同时完善不同场景下的条件判断。
效果
直接上效果图。包含时间,日志级别,所在文件名、行数、函数名称,以及对应的具体信息。
具体实现
功能实现均在一个头文件中。
#include <stdio.h>
#include <time.h>
#include <stdarg.h>
#include <string>
//C++
static std::string getTimeString()
{
time_t t = time(nullptr);
char cTime[32];
strftime(cTime, sizeof(cTime), "%Y-%m-%d %H:%M:%S:%Z", localtime(&t));
std::string sTime = cTime;
return sTime;
}
//C环境 不使用string减少依赖
static char *getTimeChar()
{
time_t t = time(nullptr);
static char cTime[32];
strftime(cTime, sizeof(cTime), "%Y-%m-%d %H:%M:%S", localtime(&t));
return cTime;
}
//提升兼容性 默认getTimeChar
#define INFO(format, ...) fprintf(stdout, "%s [INFO] [%s:%d %s()] " format "\n", getTimeChar(), __FILE__, __LINE__, __func__ , ##__VA_ARGS__)
#define ERROR(format, ...) fprintf(stderr, "%s [ERROR] [%s:%d %s()] " format "\n", getTimeChar(), __FILE__, __LINE__, __func__ , ##__VA_ARGS__)
实际调用
简化了代码,调用如下。
#include "customlog.h"
int main()
{
int ret = 5;
char info[] = "test";
char error[] = "an error";
INFO("nihao123");
INFO("result=%d info=%s", ret, info);
ERROR("error=%s", error);
return 0;
}
内容更新
更新:新增一种打印输出方式,使用方法同上。
enum LogLevel
{
Debug = 0,
Info,
Warn,
Error,
Fatal,
LevelCount
};
static const char *logLevel[LogLevel::LevelCount] = {"Debug", "Info", "Warn", "Error", "Fatal"};
static void serialize(int level, const char *file, int line, const char *func, const char *format, ...)
{
time_t t = time(nullptr);
char cTime[32] = {0};
strftime(cTime, sizeof(cTime), "%Y-%m-%d %H:%M:%S", localtime(&t));
//前置信息
char front[256] = {0};
snprintf(front, sizeof(front), "%s [%s] [%s:%d %s()] =>", cTime, logLevel[level], file, line, func);
//具体信息
va_list arglist;
va_start(arglist, format);
char buf[512] = {0};
vsnprintf(buf, sizeof(buf), format, arglist);
printf("%s %s\n", front, buf);
va_end(arglist);
}
#define LogInfo(format, ...) serialize(LogLevel::Info, __FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
#define LogError(format, ...) serialize(LogLevel::Error, __FILE__, __LINE__, __func__, format, ##__VA_ARGS__)