【日志信息管理】管理日志信息的类

 日志用于记录程序的执行记录包括程序的出错记录,程序致命退出原因,程序的正常执行记录。这样我们就可以很快的察觉程序的错误原因、执行状况等等,因此管理日志信息是非常重要的。

日志一般由以下部分组合:

日志时间、日志等级、日志内容、日志文件的名称

日志等级分为5个:Info:常规信息、Warning:报警信息、Error:发生错误,需要立即处理、Fatal:致命信息、Debug:调试信息

学习一下多参数函数相关的c接口:

#include <iostream>
#include <stdarg.h>
int argfunc(int n, ...)//n是要相加的元素个数,...代表要传入的参数
{va_list s;//s相当于一个int*类型的指针va_start(s, n);//s=&n+1int sum=0;while(n--){sum += va_arg(s, int);}va_end(s);//将s置为空return sum;
}
int main()
{int a= argfunc(3,1,2,3);std::cout<<a<<std::endl;return 0;
}

 vsnprintf函数

利用多参数相关接口,就可以实现对函数进行动态参数传参!

time函数

localtime函数

localtime函数的返回值是一个struct tm结构体类型的指针,struct tm结构体里储存了对应时间戳的年月日时分秒,如下就是struct tm结构体:

具体代码实现如下:

log.hpp

#pragma once
#include <iostream>
#include <string>
#include <ctime>
#include <cstdio>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <unistd.h>#define Screen 1    // 表示向显示器上打印日志信息
#define Onefile 2   // 表示向logtxt日志文件里写日志信息(没有该日志文件open函数会自动创建)
#define Classfile 3 // 对向指定等级的日志文件写内容,比如:Fatal等级的日志信息写到logtxt.Fatal日志文件中#define Size 1024
#define Logfile "log.txt"class Log
{
public:Log(int n = 1): printmethod(n), path("./log/"){}void printLogtxt(const std::string &s, const char *logtxt){switch (printmethod){case Screen:std::cout << logtxt;break;case Onefile:printOneFile(Logfile, logtxt);break;case Classfile:printClassFile(s, logtxt);break;default:break;}}void printOneFile(const std::string &Logname, const std::string& logtxt){std::string _s = path + Logname; // 给logtxt文件加上我们路径,方便我们以后再该路径里管理日志文件int fd = open(_s.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666);if (fd < 0){perror("open");return;}write(fd, logtxt.c_str(), logtxt.size());close(fd);}void printClassFile(const std::string &s, const char *logtxt){std::string _s(Logfile);_s+= ".";_s+= s;printOneFile(_s, logtxt);}void operator()(const std::string &str, const char *format, ...){time_t t = time(nullptr);struct tm *ctime = localtime(&t);char str1[Size] = {0};snprintf(str1, sizeof(str1), "[%s][%d-%d-%d:%d:%d:%d]", str.c_str(), ctime->tm_year + 1900,ctime->tm_mon + 1, ctime->tm_mday,ctime->tm_hour, ctime->tm_min, ctime->tm_sec);va_list s;va_start(s, format);char str2[Size] = {0};vsnprintf(str2, sizeof(str2), format, s); // format是格式字符串  s是多参数...的第一个字符串地址va_end(s);char logtxt[2 * Size] = {0};snprintf(logtxt, sizeof(logtxt), "%s %s\n", str1, str2);printLogtxt(str, logtxt);}private:int printmethod;std::string path; // 日志文件将来被创建时所在的路径,更有利于我们管理日志文件
};

testlog.cpp

#include "log.hpp"
#include <errno.h>
#include <cstring>
#include <vector>
int main()
{Log log(3);log("Info", "向%s日志文件里写入内容成功!", "log.txt.Info");std::vector<int> v = {1,2};if(!v.empty())log("Debug", "v.size() is %d", v.size());return 0;
}

在log目录下生成的log.txt.Info文件:

在log目录下生成的log.txt.Debug文件:

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

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

相关文章

Java 基础--File - IO流(2)

I/O流 定义 数据从硬盘流向内存为输入流&#xff0c;数据从内存流向硬盘为输出流。输入也叫读取数据&#xff0c;输出也叫写出数据。 IO分类 1.按照数据的流向分为&#xff1a;输入流和输出流 ①输入流&#xff1a;把数据从其他设备上读取到内存中的流 ②输出流&#xff1…

Qt 基础组件速学 事件过滤器

学习目标&#xff1a;理解事件过滤器 前置环境 运行环境:qt creator 4.12 学习内容和效果演示&#xff1a; Qt 提供了事件过滤器的机制,允许我们在事件到达目标对象之前对事件进行拦截和处理。这在以下情况下非常有用: 全局事件处理: 我们可以在应用程序级别安装一个事件过…

工控人最爱的PLC触摸屏一体机,有多香

PLC触摸屏一体机是什么 PLC触摸屏一体机&#xff0c;听起来可能有点技术化&#xff0c;但简单来说&#xff0c;它就是一个集成了可编程逻辑控制器&#xff08;PLC&#xff09;和触摸屏的智能设备。这种设备不仅能够执行自动化控制任务&#xff0c;还能实时显示和操作设备状态&a…

JVM原理(十九):JVM虚拟机内存模型

1. 硬件的效率与一致性 数据不安全的原因&#xff1a;缓存一致性的问题 共享内存多核系统&#xff1a;在多路处理器系统中&#xff0c;每个处理器都有自己的高速缓存&#xff0c;而他们又共享同一主内存。 线程先后执行结果不一致问题&#xff1a;除了增加高速缓存之外&#…

【Python】已解决:nltk.download(‘stopwords‘) 报错问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;nltk.download(‘stopwords’) 报错问题 一、分析问题背景 在使用Python的自然语言处理库NLTK&#xff08;Natural Language Toolkit&#xff09;时&#xff0c…

后端开发常见错误

1、解析json字符串要考虑格式不正确&#xff0c;空值情况 2、解析时间字符串要考虎格式和空值 3、使用mybatis的foreach的时候要考虑拼接sql的耗时&#xff0c;尤其是超过10条数据 4、表字段长度&#xff0c;在接口层校验字段长度&#xff0c; 调用三方系统的报错要截取报错…

CentOS 7安装Elasticsearch7.7.0和Kibana

一. 准备安装包 elasticsearch和kibana&#xff1a;官网历史版本找到并下载&#xff08;https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff09;ik分词器&#xff1a;GitHub下载&#xff08;https://github.com/infinilabs/analysis-ik/releases/tag/v…

【大模型】衡量巨兽:解读评估LLM性能的关键技术指标

衡量巨兽&#xff1a;解读评估LLM性能的关键技术指标 引言一、困惑度&#xff1a;语言模型的试金石1.1 定义与原理1.2 计算公式1.3 应用与意义 二、BLEU 分数&#xff1a;翻译质量的标尺2.1 定义与原理2.2 计算方法2.3 应用与意义 三、其他评估指标&#xff1a;综合考量下的多元…

设计模式之状态机模式

一、状态机模式介绍 状态机模式&#xff08;State Machine Pattern&#xff09;是一种用于描述对象行为的软件设计模式&#xff0c;属于行为型设计模式。在状态机模式中&#xff0c;对象的行为取决于其内部状态&#xff0c;并且在不同的状态下&#xff0c;对象可能会有不同的行…

STM32F103C8T6核心板原理图和PCB分享

PCB图 原理图 资料下载地址&#xff1a; 原理图PCB库: https://545c.com/d/45573183-61875742-29897c?p7526 (访问密码: 7526)

[go-zero] 简单微服务调用

文章目录 1.注意事项2.服务划分及创建2.1 用户微服务2.2 订单微服务 3.启动服务3.1 etcd 服务启动3.2 微服务启动3.3 测试访问 1.注意事项 go-zero微服务的注册中心默认使用的是Etcd。 本小节将以一个订单服务调用用户服务来简单演示一下&#xff0c;其实订单服务是api服务&a…

Java 使用sql查询mongodb

在现代应用开发中&#xff0c;关系型数据库和NoSQL数据库各有千秋。MongoDB作为一种流行的NoSQL数据库&#xff0c;以其灵活的文档模型和强大的扩展能力&#xff0c;受到广泛欢迎。然而&#xff0c;有时开发者可能更熟悉SQL查询语法&#xff0c;或者需要在现有系统中复用SQL查询…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超优先级中断详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt superpriority超优先级中断的特性和应用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

进程控制-wait和waitpid进程回收

wait 阻塞函数 函数作用&#xff1a; 1. 阻塞并等待子进程退出 2. 回收子进程残留资源 3. 获取子进程结束状态&#xff08;退出原因&#xff09; pid_t wait(int *wstatus); 返回值&#xff1a; ‐1 : 回收失败&#xff0c;已经没有子进程了 >0 : 回收子进程对应的…

一种非凸全变差正则化的信号降噪方法(以模拟信号和轴承振动信号为例,MATLAB)

以旋转机械振动信号为例&#xff0c;由于旋转机械运行中背景噪声较强&#xff0c;振动信号需要进行降噪处理。常用的小波阈值降噪会在信号的不连续处产生虚假的波峰和伪吉布森震荡&#xff0c;而奇异值分解SVD去噪容易产生虚假分量&#xff0c;全变差去噪则不会出现这样的情况&…

美国大选特色

美国总统是间接民选的。选民不直接投票选举总统&#xff0c;而是通过选举一个称为选举人团&#xff08;Electoral College&#xff09;的机构成员来间接决定总统。具体过程如下&#xff1a; 1. **选民投票**&#xff1a;在11月的大选日&#xff0c;选民投票选举他们所在州的选…

深入理解JS逆向代理与环境监测

博客文章&#xff1a;深入理解JS逆向代理与环境监测 1. 引言 首先要明确JavaScript&#xff08;JS&#xff09;在真实网页浏览器环境和Node.js环境中有很多使用特性的区别。尤其是在环境监测和对象原型链的检测方面。本文将探讨如何使用JS的代理&#xff08;Proxy&#xff09…

MySQL之备份与恢复(九)

备份与恢复 从备份中恢复 更高级的恢复技术 复制和基于时间点的恢复使用的是相同的技术:服务器的二进制日志。这意味着复制在恢复时会是个非常有帮助的工具&#xff0c;哪怕方式不是很明显。下面将演示一些可以用到的方法。这里列出来的不是一个完整的列表&#xff0c;但应该…

STM32-USART

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 串口通信协议1.1 通信接口1.2 串口通信1.3 硬件电路1.4 电平标准1.5 串口参数及时序1.6 串口时序 2. USART串口通信2.1 USART简介2.2 USART框图2.3 USART基本结构2.4 数据帧2.5 数据帧-配置停止位2.6 起始位侦测2.…

DP学习——简单工厂模式

学而时习之&#xff0c;温故而知新。 敌人出招&#xff08;使用场景&#xff09; 不同的业务场景下要创建不同的对象&#xff0c;但是这些对象又有共同的特点。如何复用代码呢&#xff1f;你会想到&#xff0c;这些对象可以抽象出一个基类/抽象类就行了&#xff0c;那么随着业…