概述
最近由于接手了几个小的开发项目,一直苦于寻找一个调用简单,方便调试,占用资源小的日志库,因为我大部分的嵌入式开发项目都是C/C++的开发。就想着做一个小的日志调用接口C/C++库。最近有时间整理一下。
alog 由此而生,目前我几个项目中都用到了这个库,个人觉得非常简单,容易理解,使用简单,能马上融入到小型嵌入式项目中去。
首先看调用示例:
#include "alog_printf.h"
int main(void)
{
alog_printf(ALOG_LVL_DEBUG, TURE,"n************TEST START**************n");
int a = 0;
while (1)
{
alog_printf(ALOG_LVL_DEBUG, TURE, "test a=%d n", a);
a++;
sleep(1);
}
return 0;
}
示例中可以看到,这个日志调用类似于打印函数(其实就是改造的),说是一个日志库文件,不如说就是一个头文件,(这里主要是为了简单-不用去引用其他东西)是不是很简单。
调用原型:
alog_printf(level, outputEnable, ...);
首先这个日志库具备这几个功能:
- 可以设置输出到指定路径下保存成文件-方便导出查看
- 日志文件以创建时间先后命名
- 日志文件的大小和个数可设置,当超出设置限制后根据创建时间循环覆盖
- 日志的保存等级可设置
- 可控制是否打印在终端
- 可输出打印时间、调用函数名和行数,方便定位打印
附一段核心实现:
/**
* @brief : Ari日志打印
* @param {unsigned char} level
* @param {_BOOL} outputEnable
* @param {const char} *func
* @param {const long} line
* @param {const char} *fmt
* @return {*}
* @author: LR
* @Date: 2021-06-25 12:11:49
*/
static void log_printf(unsigned char level, bool outputEnable, const char *file, const long line, const char *fmt, ...)
{
if (level < ALOG_LVL_SET)
return;
pthread_mutex_lock(&alogMutex); /* 日志部分上锁 */
char printf_buf[ALOG_BUF_MAX_SIZE]={0};
va_list args;
int printed;
va_start(args, fmt);
printed = vsnprintf(printf_buf, ALOG_BUF_MAX_SIZE, fmt, args);
va_end(args);
char buf[ALOG_BUF_MAX_SIZE + 200] = {0};
int g_Count = 0;
char temp[256];
char logFileName[50] = {0};
char logFileNameTemp[50] = {0};
char logFileNameLast[50] = {"1580-05-05_00-00-00.log"};
char logFileNameMix[50] = {"3000-05-05_00-00-00.log"};
int iMax = ALOG_MAX_SIZE;
FILE *fp = NULL;
time_t timep;
struct tm *p;
time(&timep);
p = localtime(&timep); //获取当前系统时间
//将要保存的日志信息和时间戳信息整合
memset(buf, 0, sizeof(buf));
sprintf(buf, "▶[%d-%02d-%02d %02d:%02d:%02d -> %s:%ld] : ", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday, (p->tm_hour + 8) % 24, p->tm_min, p->tm_sec, file, line); //星期p->tm_wday
strcat(buf, printf_buf);
//strcat(buf, "