两个函数实现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

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每