linux下的日志编写

embedded/2024/9/23 3:12:13/

 1、日志初始化创建

 2、日志写入

 3、日志关闭

log.c

#include "log.h"static log_t LOG;//初始化日志文件,在当前目录创建日志文件
int log_init(char *pdirname)
{time_t t;struct tm *ptm = NULL;char filepath[64] = {0};int ret = 0;time(&t);ptm = localtime(&t);ret = access(pdirname, F_OK);if (0 != ret){mkdir(pdirname, 0777);}sprintf(filepath, "%s/log_%4d%02d%02d", pdirname, ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);LOG.flog = fopen(filepath, "a");if (NULL == LOG.flog){fprintf(stderr, "logfile open faileed, can not record software information");return -1;}LOG.curtime = ptm;pthread_mutex_init(&LOG.lock, NULL);return 0;
}//写入日志文件
int log_write(LEVEL_T level,const char *pfile, const int line, const char *pfunc, const char *pstr, ...)
{time_t t;struct tm *ptm = NULL;char tmpinfo[1024] = {0};va_list pnext;pthread_mutex_lock(&LOG.lock);if (level < LOG.curlevel){pthread_mutex_unlock(&LOG.lock);return 0;}va_start(pnext, pstr);time(&t);ptm = localtime(&t);if (ptm->tm_year != LOG.curtime->tm_year | ptm->tm_mon != LOG.curtime->tm_mon | ptm->tm_mday != LOG.curtime->tm_mday){   pthread_mutex_unlock(&LOG.lock);log_deinit();log_init("LOG_FILE");pthread_mutex_lock(&LOG.lock);LOG.curtime = ptm;}sprintf(tmpinfo, "%s\n", pstr);fprintf(LOG.flog, "[%4d-%02d-%02d %02d-%02d-%02d] [%s %d %s] ", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, pfile, line, pfunc);vfprintf(LOG.flog, tmpinfo, pnext);va_end(pnext);pthread_mutex_unlock(&LOG.lock);return 0;
}//销毁日志文件
int log_deinit(void)
{//关闭日志文件if (NULL != LOG.flog){pthread_mutex_lock(&LOG.lock);fclose(LOG.flog);LOG.flog = NULL;pthread_mutex_unlock(&LOG.lock);pthread_mutex_destroy(&LOG.lock);}return 0;
}//设置日志级别
void log_setlevel(LEVEL_T level)
{LOG.curlevel = level;return;
}

log.h

#ifndef __LOG_H__
#define __LOG_H__#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <stdarg.h>
#include <pthread.h>typedef struct LOG_DATE 
{int year;int mon;int day;
}DATE_T;typedef enum LOG_LEVEL
{LOG_MASSAGE,LOG_WORNING,LOG_ERROR,
}LEVEL_T;typedef struct log
{FILE *flog;LEVEL_T curlevel;struct tm *curtime;  pthread_mutex_t lock;
}log_t;extern int log_init(char *pdirname);
extern int log_write(LEVEL_T level,const char *pfile, const int line, const char *pfunc, const char *pstr, ...);
extern int log_deinit(void);#endif

main.c

#include "log.h"int main(void)
{int num = 11451;log_init("LOG_FILE");log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "===================================================");log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "             software log record systerm           ");log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "===================================================");log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "hello world %d", num);log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "hello world %d", num);log_deinit();return 0;
}

效果:


http://www.ppmy.cn/embedded/115376.html

相关文章

C++之模板初阶

片头 哈喽&#xff0c;小伙伴们&#xff0c;好久不见~ &#xff0c; 古时候&#xff0c;人们对于文化知识的需求不断增长&#xff0c;手抄书籍的方式已经无法满足这种需求。因此&#xff0c;人们开始探索更高效的复制和传播知识的方法-----印刷术。 在写C程序的时候&#xf…

C#基础(14)冒泡排序

前言 其实到上一节结构体我们就已经将c#的基础知识点大概讲完&#xff0c;接下来我们会讲解一些关于算法相关的东西。 我们一样来问一下gpt吧&#xff1a; Q:解释算法 A: 算法是一组有序的逻辑步骤&#xff0c;用于解决特定问题或执行特定任务。它可以是一个计算过程、一个…

时序预测 | Matlab实现SSA-TCN麻雀搜索算法优化时间卷积网络时序预测-递归预测未来数据(单输入单输出)

时序预测 | Matlab实现SSA-TCN麻雀搜索算法优化时间卷积网络时序预测-递归预测未来数据&#xff08;单输入单输出&#xff09; 目录 时序预测 | Matlab实现SSA-TCN麻雀搜索算法优化时间卷积网络时序预测-递归预测未来数据&#xff08;单输入单输出&#xff09;预测效果基本介绍…

模擬器怎麼多開換IP?

遊戲玩家、行銷人員或者是開發者&#xff0c;都可能需要在同一臺電腦上運行多個實例&#xff0c;並且每個實例使用不同的IP地址。那麼&#xff0c;如何實現這一目標呢&#xff1f;本文將詳細介紹模擬器多開和換IP的原理、方法及注意事項。 模擬器就是在同一臺電腦上運行多個安…

4.提升客户服务体验:ChatGPT在客服中的应用(4/10)

本文大纲旨在指导撰写一篇全面探讨ChatGPT如何通过优化客户服务流程、提供实际应用案例和用户反馈&#xff0c;以提升客户服务体验的深入博客文章。 引言 在当今竞争激烈的商业环境中&#xff0c;客户服务已成为企业成功的关键因素。优质的客户服务不仅能够增强客户满意度和忠…

c++primer第九章内存模型和名称空间学习笔记

单独编译 程序分为三步 函数定义和变量声明不能放在头文件中。 头文件经常包括的内容 结构声明可以放在头文件中。 头文件coordin.h代码 #ifndef COORDIN_H_ #define COORDIN_H_struct polar {double distance;double angle; }; struct rect {double x;double y; }; polar …

五、CAN总线

目录 一、基础知识 1、can介绍 2、CAN硬件电路 3、CAN电平标准 4、CAN收发器芯片介绍 5、CAN帧格式 ① CAN帧种类 ② CAN数据帧 ③ CAN遥控帧​编辑 ④ 位填充 ⑤ 波形实例 6、接收方数据采样 ① 接收方数据采样遇到的问题 ② 位时序 ③ 硬同步 ④ 再同步 ⑤ 波…

深度学习-从零基础快速入门到项目实践,这本书上市了!!!

此书地址&#xff1a; 《【2024新书】深度学习 从零基础快速入门到项目实践 文青山 跟我一起学人工智能 机器学习算法原理代码实现教程 深度学习项目分析 深度学习 从零基础快速入门到项目实践》【摘要 书评 试读】- 京东图书 除深度学习外我还写了一本软件测试书。我大概是国…