linux c之LOG文件的存储
#成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。
因为之前从事嵌入式单片机工作,单片机性能与存储都是很低的,所以基本不会应用到LOG存储,调试就靠printf。
但现在步入嵌入式GPU阶段需要摒弃一些单片机开发的固有思想,适当的存储关键LOG信息,能够在有问题的时候,及时定位问题,所以有了下面的示例代码。
需求:
如何编写以日期为文件名称的log文件呢?
分析:
- 需要拿到当前的时间
- 需要建立文件
- 需要将时间转换成文件名称
当我们能够根据需求梳理出代码思路,完成只是时间问题。
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
/*
*1.Coordinated Universal Time(UTC):世界标准时间,格林威治标准时间,中国UTC+8
*2.Calendar Time:日历时间
*3.epoch:时间点
*4.clock tick:时钟计时单元
*
*常用time()函数,用来计算1970-01-01 00:00:00到现在的秒数,常配合localtime使用
*localtime()函数,返回以tm结构表达式的时间。
*ctime()函数,
*gettimeofday()函数,获取精确时间,最高精度可达到微秒,一般用于计算函数运行耗时等
*
*日志文件常用strftime()函数,将时间格式化为字符串。
*/
int main(int argc, char **argv)
{
struct timeval tv_begin, tv_end; //定义gettimeofday的timeval结构体
//函数原型time_t time(time_t *timer)
time_t currTime;
unsigned long T;
T = time(&currTime); //time()获取的是从1970-01-01 00:00:00到现在的秒数,返回值是unsigned long类型。
printf("%ld \n", T);
struct tm *Now; //定义localtime函数的tm结构体指针
Now = localtime(&currTime);
printf("本地时间:%s \n", asctime(Now));
printf("当前时间: %s \n", ctime(&currTime));
/* 用来精确程序运行时间 */
gettimeofday(&tv_begin, NULL);
printf("测试打印语句的时间\n");
gettimeofday(&tv_end, NULL);
printf("毫秒:%d\n", (tv_end.tv_sec - tv_begin.tv_sec));
printf("微秒:%ld\n", (tv_end.tv_usec - tv_begin.tv_usec));
/* 利用strftime()将存储地址与日期格式化为字符串 */
char name[256] = {0};
strftime(name, sizeof(name),
"/home/racobit/jiafeng/racobit/time/LOG/%Y.%m.%d.txt",
localtime(&currTime));
printf("name : %s \n", name);
/* 调用文件读写创建日志文件 */
FILE *fp = NULL;
fp = fopen(name, "a");
fputs("我想要写log: ", fp);
fprintf(fp, "%s\n", asctime(Now));
fclose(fp);
return 0;
}
运行输出:
可以在LOG文件夹看到,输出的文件(昨天输出了一些)
我们需要了解的是
fp = fopen(name, "a"); // "a"是没有该文件,创建文件
所以,当我们只要以年月日为文件名称,每天就会创建一个新的log文件。
LOG文件每天独立存储到此就完成了!可一直存储,内存总有满的一天,所以最好还是要写一个shell脚本,用来管理log文件。
预知shell脚本,请看下次分解。
End 2021/7/5 21:57
转载请注明:XAMPP中文组官网 » linux c之LOG文件的存储