C:标准日志函数

C++:标准日志函数

我们写日志函数通常有以下几个要求:

  • 日志等级
  • 自定义输入内容
  • 输入内容可以进行格式控制
  • 可以使用宏定义控制的日志

有关内容已经在我上一篇写的文章中发过了,除了格式控制,已经基本实现了其他功能,这期主要来补全一下格式控制这块:

怎么进行格式控制呢?这里我使用了C语言的vprintf函数:

vprintf 函数是 C 标准库中的一个功能强大的函数,用于将格式化的输出发送到标准输出(stdout)。让我们来详细了解一下 vprintf 的用法:

  • 函数声明

    int vprintf(const char *format, va_list arg);
    
  • 描述
    vprintf 函数使用参数列表发送格式化输出到标准输出(stdout)。它的工作方式类似于 printf,但是使用由 arg 标识的可变参数列表中的元素来替换格式说明符,而不是附加的函数参数。在内部,函数从 arg 标识的列表中检索参数,就好像使用了 va_arg 一样,因此 arg 的状态可能会被调用所改变。

  • 参数

    • format:这是一个字符串,包含要写入到标准输出(stdout)的文本。它可以包含嵌入的格式标签,这些标签会被随后的附加参数中指定的值替换,并按需进行格式化。格式标签的属性包括 %[flags][width][.precision][length]specifier,具体说明如下:
      • specifier:输出的类型,例如字符、整数、浮点数等。
      • flags:标识,例如对齐方式、是否显示正号等。
      • width:输出的最小字符数。
      • .precision:小数点后的位数。
      • length:参数的长度,例如短整型、长整型等。
    • arg:一个表示可变参数列表的对象,应该由 <stdarg.h> 中定义的 va_start 宏初始化。
  • 返回值

    • 如果成功,则返回写入的字符总数,否则返回一个负数。
  • 示例
    下面的示例演示了 vprintf 函数的用法:

    #include <stdio.h>
    #include <stdarg.h>void WriteFormatted(char *format, ...) {va_list args;va_start(args, format);vprintf(format, args);va_end(args);
    }int main() {WriteFormatted("%d variable argument\n", 1);WriteFormatted("%d variable %s\n", 2, "arguments");return 0;
    }
    

    运行上述程序将产生以下输出:

    1 variable argument
    2 variable arguments
    

请注意,vprintf 函数通常与 va_startva_end 配套使用,而在大多数情况下,输出到控制台时直接使用 printf 函数即可。只有在需要自定义 printf 函数时,才需要使用 vprintf 函数。

下面是我的日志函数:

#include <stdio.h>
#include <stdarg.h>#define LOG_LEVEL_INFO 0
#define LOG_LEVEL_WARNING 1
#define LOG_LEVEL_ERROR 2void log_event(int level, const char *filename, const char *format, ...){time_t now = time(NULL);char *level_str;FILE *fp;va_list args;switch(level) {case LOG_LEVEL_INFO: {level_str = "INFO";break;}case LOG_LEVEL_WARNING: {level_str = "WARNING";break;}case LOG_LEVEL_ERROR : {level_str = "ERROR";break;}default: {level_str = "UNKNOWN";break;}}fp = fopen(filename, "a");if(fp == NULL) {perror("Open file ERROR!");return ;}if(fp != NULL) {fprintf(fp, "%s [%s]: ", ctime(&now), level_str);va_start(args, format);vfprintf(fp, format, args);va_end(args);fprintf(fp, "\n");fclose(fp);}return ;
}

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

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

相关文章

Linux:IO多路转接之select

文章目录 selecttimeval结构体fd_set 优缺点分析完整代码 本节要介绍的主题是多路转接式IO select 先说结论&#xff0c;这个select是做什么的呢&#xff1f; select是负责在Linux系统中&#xff0c;让一个人可以有多个鱼竿&#xff0c;可以不停的进行轮询&#xff0c;只要有…

如何成功转入IT行业:针对零相关背景知识者的指南

0基础如何进入IT行业? 在当今数字化时代,IT行业提供了大量的就业机会和职业发展空间。然而,对于没有任何相关背景知识的人来说,成功进入这个行业可能会面临一些挑战。幸运的是,有一些方法和技巧可以帮助他们实现这一目标。 对于没有IT背景的人来说,要进入这个行业,最重…

Trace链异常检测汇总

微服务应用与单块应用完全不同&#xff0c;一个微服务系统少则有几十个微服务组成&#xff0c;多则可能有上百个服务。比如BAT级别的互联网公司&#xff0c;一般都超过上百个服务&#xff0c;服务之间的依赖关系错综复杂&#xff0c;如果没有有效的监控手段&#xff0c;那么出现…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法&#xff1a;将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突&#xff1a;不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突&#xff1a; 1. 开放寻址&#xff1a;产生哈希冲突后&…

2024.3.18力扣每日一题——区域和检索 - 数组不可变

2024.3.18 题目来源我的题解方法一 前缀和 题目来源 力扣每日一题&#xff1b;题序&#xff1a;303 我的题解 方法一 前缀和 先计算前缀和preSum&#xff0c;然后区间[i,j]的和就是preSum[j1]-preSum[i] 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(n) int[] preSu…

Vue - 1( 13000 字 Vue 入门级教程)

一&#xff1a;Vue 导语 1.1 什么是 Vue Vue.js&#xff08;通常称为Vue&#xff09;是一款流行的开源JavaScript框架&#xff0c;用于构建用户界面。Vue由尤雨溪在2014年开发&#xff0c;是一个轻量级、灵活的框架&#xff0c;被广泛应用于构建单页面应用&#xff08;SPA&am…

创建和启动线程

概述 Java语言的JVM允许程序运行多个线程&#xff0c;使用java.lang.Thread类代表线程&#xff0c;所有的线程对象都必须是Thread类或其子类的实例。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的&#xff0c;因此把run()方法体称为线程执行体。…

使用神经网络-遗传算法优化神经网络-风电预测故障(BP,GABP,matlab)

本项目是故障预测&#xff0c;不是时序预测&#xff0c;本质还是分类问题 1 数据集介绍 特征文件&#xff1a; 标签文件&#xff1a;共计4个标签&#xff0c;其中大多数都是正常的&#xff0c;其他是3个不正常的类别 2 使用BP网络 2.1 读取数据&#xff0c;然后选择几个…

【深度学习】图像自然语言描述生成

案例 6&#xff1a;图像自然语言描述生成&#xff08;让计算机“看图说话”&#xff09; 相关知识点&#xff1a;RNN、Attention 机制、图像和文本数据的处理 1 任务目标 1.1 任务和数据简介 ​ 本次案例将使用深度学习技术来完成图像自然语言描述生成任务&#xff0c;输入…

ubuntu强密码支持

接到新需求&#xff0c;欧盟需要ubuntu使用强密码&#xff0c;网络上找到一个包可以增加ubuntu密码增强机制&#xff0c;以下是调试过程。 sudo apt-get install libpam-pwquality 然后&#xff0c;编辑位于/etc/pam.d/目录中的common-password文件&#xff1a; sudo vim /et…

STM32F103C8T6最小系统板是一种基于STM32F103C8T6微控制器的开发板,具有丰富的外设和强大的处理能力,适用于各种嵌入式应用开发

STM32F103C8T6最小系统板是一种基于STM32F103C8T6微控制器的开发板&#xff0c;具有丰富的外设和强大的处理能力&#xff0c;适用于各种嵌入式应用开发。该开发板集成了STM32F103C8T6微控制器的核心部分、时钟电路、复位电路、USB电源管理电路等&#xff0c;非常适合初学者进行…

MySQL复制拓扑2

文章目录 主要内容一.配置基本复制结构1.分别在三台主机上停止mysqld服务&#xff0c;并对状态进行确认&#xff1a;代码如下&#xff08;示例&#xff09;: 2.对三个MySQL服务器的配置文件分别进行编辑&#xff0c;在[mysqld] 选项组中添加以下红色条目&#xff1a;3.在数据目…

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面&#xff0c;异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式&#xff1b; 1.利用trycatchfinaly语句处理异常&#xff0c;优点是分开了处理异常代码和程序正常代码…

深入浅出 -- 系统架构之负载均衡Nginx反向代理

一、Nginx反向代理-负载均衡 首先通过SpringBootFreemarker快速搭建一个WEB项目&#xff1a;springboot-web-nginx&#xff0c;然后在该项目中&#xff0c;创建一个IndexNginxController.java文件&#xff0c;逻辑如下&#xff1a; Controller public class IndexNginxControl…

【放假第3天】幻兽帕鲁 雾锁王国 我的世界 游戏云服务器选购指南 附最新价格对比表 新手、小白秒懂

更新日期&#xff1a;4月6日&#xff08;半年档 价格回调&#xff0c;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 【云服务器推荐】价格对比&#xff01;阿里云 京东云 腾讯云 选购指南视频截图 《最新对比表》已更新在文章头部—腾讯云文档&#xf…

前端三剑客 —— CSS (第四节)

目录 内容回顾&#xff1a; 1.常见样式 2.特殊样式 特殊样式 过滤效果 动画效果 动画案例&#xff1a; 渐变效果 其他效果&#xff1a; 多列效果 字体图标&#xff08;icon&#xff09; 内容回顾&#xff1a; 1.常见样式 text-shadow x轴 y轴 阴影的模糊程度 阴影的…

【话题:工作生活】2022年工作总结--疫情下的上海,疫情中的我。

现在是阳历2023年11月27日星期一&#xff0c;我再次开始撰写自己的年终工作总结。希望再过1、2个月&#xff0c;这份年终总结能够出炉&#xff0c;与大家相遇。 给自己定个小目标&#xff0c;年终的工作生活总结坚持写10年。我2017年毕业&#xff0c;之后就开始写每年的年终总结…

软考117-上午题-【计算机网络】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a; 真题7&#xff1a; 真题8&#xff1a; 真题9&#xff1a; 真题10&#xff1a; 真题11&#xff1a; 真题12&#xff1a; 真题13&#xff1a; 真题14&a…

c# wpf LiveCharts MVVM绑定 简单试验

1.概要 c# wpf LiveCharts MVVM绑定 简单试验 2.代码 <Window x:Class"WpfApp3.Window3"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://s…

Vue 组件的 mixin 函数,用于屏幕适配

// 屏幕适配 mixin 函数// * 默认缩放值 const scale {width: 1,height: 1, }// * 设计稿尺寸&#xff08;px&#xff09; const baseWidth 1920 const baseHeight 1080// * 需保持的比例&#xff08;默认1.77778&#xff09; const baseProportion parseFloat((baseWidth …