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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/32914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django 模版转义

1&#xff0c;模版转义的作用 Django模版系统默认会自动转义所有变量。这意味着&#xff0c;如果你在模版中输出一个变量&#xff0c;它的内容会被转义&#xff0c;以防止跨站脚本攻击&#xff08;XSS&#xff09;。例如&#xff0c;如果你的变量包含HTML标签&#xff0c;这些…

长亭谛听教程部署和详细教程

PPT 图片先挂着 挺概念的 谛听的能力 hw的时候可能会问你用过的安全产品能力能加分挺重要 溯源反制 反制很重要感觉很厉害 取证分析 诱捕牵制 其实就是蜜罐 有模板直接爬取某些网页模板进行伪装 部署要求 挺低的 对linux内核版本有要求 需要root 还有系统配置也要修改 …

网络编程篇:HTTP协议

一.预备知识 在客户端访问服务端时&#xff0c;要用ipport&#xff0c;但是在日常用户访问服务端的时候&#xff0c;并不会直接使用ip&#xff0c;而是使用域名&#xff0c;比如&#xff1a;百度(www.baidu,com)。 …

智能优化算法改进策略之局部搜索算子(八)--Powell方法

1、原理介绍 Powell方法[1]是一种无约束优化算法&#xff0c;又称为方向加速法&#xff0c;用于寻找多变量函数的极小值。其基本思想是在迭代中逐次产生Q共轭方向组&#xff0c;本质上它属于不需计算导数的共轭方向法。每次迭代后&#xff0c;算法会更新搜索方向&#xff0c;并…

Java内存泄漏检测和分析介绍

在Java中&#xff0c;内存泄漏检测和分析是一个重要的任务&#xff0c;可以通过以下几种方式进行&#xff1a; 1. 使用VisualVM VisualVM是一个可视化工具&#xff0c;可以监控、分析Java应用程序的内存消耗。它可以显示堆内存、垃圾收集、线程等信息&#xff0c;并且可以对内…

英伟达下一代DLSS或利用人工智能

英伟达的黄仁勋在2024年Computex展会上的问答环节中&#xff0c;提前透露了公司未来几代深度学习超采样&#xff08;DLSS&#xff09;技术的发展方向。在回答有关DLSS的问题时&#xff0c;黄仁勋表示&#xff0c;未来我们将看到通过纯粹的人工智能生成的纹理和对象。他还提到&a…

构建下一代数据解决方案:SingleStore、MinIO 和现代 Datalake 堆栈

SingleStore 是专为数据密集型工作负载而设计的云原生数据库。它是一个分布式关系 SQL 数据库管理系统&#xff0c;支持 ANSI SQL&#xff0c;并因其在数据引入、事务处理和查询处理方面的速度而受到认可。SingleStore 可以存储关系、JSON、图形和时间序列数据&#xff0c;以满…

SaToken系列--指定token存储的数据源

一、背景 由于特殊需求&#xff0c;需要在一个项目里面使用两个redis数据源&#xff0c;一个是本项目A的使用的&#xff0c;另一个数据源是用于satoken使用的。相当于需要使用其他项目B的登录校验&#xff0c;因此需要接入B的satoken&#xff0c;而B的satoken使用的token存储的…

快速排序.

给定你一个长度为 n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n 。 第二行包含 n 个整数&#xff08;所有整数均在 1∼109 范围内&#xff09;&#xff0c;表示整个数…

c#调用dll

动态调用dll 调用dll&#xff0c;通常是在c# 的项目中&#xff0c;的引用上点右键–添加引用。在弹出的窗口中点浏览&#xff0c;定位到dll上。但是c#要调用的dll要是c#写的&#xff0c;如果是c等写的&#xff0c;会提示不是有效的程序集或com组件。 因此&#xff0c;不能通过…

AI 大模型企业应用实战(13)-Lostinthemiddle长上下文精度处理

1 长文本切分信息丢失处理方案 10检索时性能大幅下降相关信息在头尾性能最高检索 ->> 排序 ->使用 实战 安装依赖&#xff1a; ! pip install sentence-transformers 演示如何使用 Langchain 库中的组件来处理长文本和检索相关信息。 导入所需的库使用指定的预训…

(4) cmake编译静态库和动态库

文章目录 静态库整体代码动态库编译整体代码执行结果(静态) 静态库整体代码 static.h #pragma onecevoid static_demo();static.cpp #include "static.h" #include <iostream>void static_demo(){std::cout<<"static demo"<<std::end…

CesiumJS【Basic】- #007 绘制直线段以避免地球曲率的影响

文章目录 绘制直线段以避免地球曲率的影响1 目标2 实现绘制直线段以避免地球曲率的影响 1 目标 绘制直线段以避免地球曲率的影响 2 实现 在CesiumJS中,直线的弯曲是由地球曲率引起的,因为地球是一个球体而不是一个平面。因此,如果您要在地球上绘制两点之间的直线,它将会…

Posix多线程编程总结

Posix在线文档&#xff1a; The Single UNIX Specification, Version 2 (opengroup.org) 本文主要参考这位大神的文章&#xff1a; Posix多线程编程学习笔记 - 凌峰布衣 - 博客园 (cnblogs.com) 线程安全问题 多线程编程中&#xff0c;经常遇到的就是线程安全问题&#xff0c;或…

PINN解偏微分方程实例4

PINN解偏微分方程实例4 一、正问题1. Diffusion equation2. Burgers’ equation3. Allen–Cahn equation4. Wave equation 二、反问题1. Burgers’ equation3. 部分代码示例 本文使用 PINN解偏微分方程实例1中展示的代码求解了以四个具体的偏微分方程&#xff0c;包括Diffusio…

第T2周:彩色图片分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 &#x1f449; 要求&#xff1a; 学习如何编写一个完整的深度学习程序了解分类彩色图片会灰度图片有什么区别测试集accuracy到达72% &#x1f9be;我的环境&am…

测试测量-DMM直流精度

测试测量-DMM直流精度 最近去面试&#xff0c;发现了自己许多不足&#xff0c;比如我从未考虑过万用表准或者不准&#xff0c;或者万用表有多准&#xff1f; 在过去的实验室中&#xff0c;常用的DMM有KEYSIGHT 34401A以及 KEITHLEY THD2015&#xff0c;就以这两台为例&#x…

Leetcode 3195. Find the Minimum Area to Cover All Ones I

Leetcode 3195. Find the Minimum Area to Cover All Ones I 1. 解题思路2. 代码实现 题目链接&#xff1a;3195. Find the Minimum Area to Cover All Ones I 1. 解题思路 这一题还是挺简单的&#xff0c;只要找到所有1所在的元素的上下左右4个边界&#xff0c;作为目标矩形…

线程C++

#include <thread> #include <chrono> #include <cmath> #include <mutex> #include <iostream> using namespace std;mutex mtx; void threadCommunicat() {int ans 0;while (ans<3){mtx.lock();//上锁cout << "ans" <…

预制直埋聚氨酯保温管

&#x1f600;宝子们&#xff0c;今天来给大家介绍一下预制聚氨酯直埋保温管&#x1f389;&#xff01; 它可是个好东西&#x1f44d;&#xff0c;具有超强的保温性能&#x1f9ca;&#xff0c;能够有效保持管道内的温度&#x1f60e;。 而且它还很耐用&#x1f4aa;&#xff0…