两个函数实现C语言日志记录(Linux/Ubuntu 24.04环境)

2024-06-23 16:44

本文主要是介绍两个函数实现C语言日志记录(Linux/Ubuntu 24.04环境),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

日志记录的结果如下所示:

------------ 2024_06_23_15_12_48.txt ------------

[2024-06-23 15:12:48][0.258337] web server root path: /home/buda/code/buda/vue/dist
[2024-06-23 15:12:48][0.91629] web server listen port: 8888
[2024-06-23 15:12:48][0.55383] create server listen socket succeed
[2024-06-23 15:12:48][0.27657] bind server listen socket to port 8888 succeed
[2024-06-23 15:12:48][0.30240] server socket starts listening ...

其中[0.258337]表示距离上一条Log的间隔时间是0秒+258337纳秒。

下面是实现上面日志记录的两个函数,一个函数创建日志文件,另一个函数往日志文件里写一条日志。


static const char *log_dir = "../../../log/"; // ~/code/log
static FILE* log_file = NULL;
static struct timespec last_log_time = {0, 0};
#define BudaWriteStep2(c, len, remain) c += len; remain -= len;int log_start()
{clock_gettime(CLOCK_MONOTONIC, &last_log_time);char relative_path[PATH_MAX], real_path[PATH_MAX], *c=relative_path; int remain=PATH_MAX_1, len; len = snprintf(c, remain, "%s", log_dir); BudaWriteStep2(c, len, remain);*c=0; c = realpath(relative_path, real_path); if(c!=real_path) { printf("get log dir real path error: %s\n", relative_path); goto fail; }c=real_path; remain=PATH_MAX_1; len=strlen(c); BudaWriteStep2(c, len, remain);len = snprintf(c, remain, "/"); BudaWriteStep2(c, len, remain);  len = time_text_filename(c, remain); BudaWriteStep2(c, len, remain); len = snprintf(c, remain, ".txt"); BudaWriteStep2(c, len, remain);  *c=0; log_file = fopen(real_path, "ab"); if (log_file == NULL) { printf("Failed to open file: %s\n", real_path); goto fail; }printf("created log file: %s\n", real_path);succeed: return 0;fail: return -1;
}void log(const char *format, ...)
{char buf[TIME_BUF_SIZE]; long len, sep_sec, sep_nsec; len = time_text(buf, TIME_BUF_SIZE1); buf[len]=0; struct timespec log_time; clock_gettime(CLOCK_REALTIME, &log_time); sep_sec=log_time.tv_sec-last_log_time.tv_sec; sep_nsec=log_time.tv_nsec-last_log_time.tv_nsec; if(sep_nsec<0) { sep_nsec+=1000000000; sep_sec--; }last_log_time = log_time;fprintf(log_file, "[%s][%ld.%ld] ", buf, sep_sec, sep_nsec); va_list args; va_start(args, format); vfprintf(log_file, format, args); va_end(args); fflush(log_file);va_start(args, format); vprintf(format, args); va_end(args);fprintf(log_file, "\n"); printf("\n");succeed: return;fail: printf("log failed\n"); return;
}int time_text(char *r, int max_len)
{  time_t now; time(&now); struct tm parts, *p = &parts; localtime_r(&now, p);int len = (int)strftime(r, max_len, "%Y-%m-%d %H:%M:%S", p); r[len]=0; return len;
}int time_text_filename(char *r, int max_len)
{  time_t now; time(&now); struct tm parts, *p = &parts; localtime_r(&now, p);int len = (int)strftime(r, max_len, "%Y_%m_%d_%H_%M_%S", p); r[len]=0; return len;
}

作者寄语

以上如有错漏之处,敬请大家指正。我是主修C/C++、Vue3开发的程序员,我的联系方式:
微信:TobeBuda
Email/Paypal: jinmin.si@outlook.com
邀请您加入「社区资讯服务」创业微信群,共同探讨打造社区资讯服务的美好未来。

参考资料

chatgpt

gemini

这篇关于两个函数实现C语言日志记录(Linux/Ubuntu 24.04环境)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087717

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

UnrealScriptIDE调试环境部署

先安装vs2010   再安装VSIsoShell.exe, 下载地址 https://pan.baidu.com/s/10kPNUuDGTbWXbz7Nos-1WA       fd3t   最后安装unside,下载地址 https://archive.codeplex.com/?p=uside  安装中间有一步选择Binary文件夹要选对路径。   安装好以后,启动 UDKDe