日志情况分析


日志是用来记录信息的,更多是方便于查看各种出错信息。时间、日志等级、日志内容、文件名称已经行号都会显示出来!日志等级是什么?就是当出问题时,根据问题成都列出等级
Info:常规消息
Debug:t调试信息
Waring:报警信息
Error:错误信息,比较严重了可能需要立即处理,不过解决了还是能够执行
Fatal:致命问题,不给你解决时间,会直接结束掉
日志获取时间,
time系统接口
在这里插入图片描述
时间戳设计!
localtime获取时间,年月日,小时分秒
在这里插入图片描述
localtime参数是time的返回值,然后它的参数是一个时间结构体,struct tm*
在这里插入图片描述
里面包含各种属性字段年月日小时分秒
写一个日志程序,snprintf
在这里插入图片描述
是将…的内容按规定格式写入到str数组中并且打印在显示器上
在这里插入图片描述
可变参数形参参数个数不确定,当实参传递多少个参数,形参就会形成几个形参。
可变参数捕捉,要在被调用的函数中取得参数值的话,在C/C++中有专们的函数来处理接收实参,一般情况下需要三个宏和一个类型来配合使用。
类型为:va_list
宏定义:va_start、va_arg、va_end;
使用情况
在这里插入图片描述
有一个具体形参,然后定义va_list类型变量s。va_list:定义了三个宏定义函数va_start,va_arg,va_end所需要的一些基本信息
va_start:表示的是设置头第一个参数,它的第一个参数是va_list 的变量,第二个参数是函数形参的变量名,函数形参只有一个,而这个形参为可变参数中所能接受实参的最大个数!指向可变部分的开头取第一个形参的首地址,然后取地址再+1。s = &n+1指针向后移动n自身类型字节大小,+1跳过一个类型大小
va_arg:表示从被调函数第二个形参开始获取传过来的实参,它的第一个参数是va_list定义的变量,第二个参数是被调函数第二个参数的类型名称,每调用一次va_arg,就获取到一个被调函数中的形参参数
va_end:表示清理va_list定义的变量

1.定义va_list
2.将第一步定义的va_list变量,传入va_start,获取函数参数的第一个
3.反复调用va_arg,获取可变参数函数未定义在形参内的变量
4.用va_end清理va_list,每一次只要定义了va_list类型的变量,都要调用va_end()清理
可变参数必须要有一个参数因为要找到起始地址
而在使用的时候若是实参个数多于了传入的形参个数,多余的是不会计算的,这个参数只是最多能接受的实参个数!

#pragma once#include <iostream>
#include <time.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>#define SIZE 1024#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4#define Screen 1
#define Onefile 2
#define Classfile 3#define LogFile "log.txt"class Log
{
public:Log(){printMethod = Screen;path = "./log/";}void Enable(int method){printMethod = method;}//日志等级std::string levelToString(int level){switch (level){case Info:return "Info";case Debug:return "Debug";case Warning:return "Warning";case Error:return "Error";case Fatal:return "Fatal";default:return "None";}}//打印出日志等级所对应的日志信息void printLog(int level, const std::string &logtxt){switch (printMethod){case Screen:std::cout << logtxt << std::endl;break;case Onefile:printOneFile(LogFile, logtxt);break;case Classfile:printClassFile(level, logtxt);break;default:break;}}//打印一个文件void printOneFile(const std::string &logname, const std::string &logtxt){std::string _logname = path + logname;int fd = open(_logname.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666); // "log.txt"if (fd < 0)return;write(fd, logtxt.c_str(), logtxt.size());close(fd);}//打印文件类void printClassFile(int level, const std::string &logtxt){std::string filename = LogFile;filename += ".";filename += levelToString(level); // "log.txt.Debug/Warning/Fatal"printOneFile(filename, logtxt);}~Log(){}void operator()(int level, const char *format, ...){time_t t = time(NULL);//设置时间戳struct tm *ctime = localtime(&t);//localtime可以获取当前时间,它的返回值是一个结构体对象char leftbuffer[SIZE];//然后可以根据这个对象获取到当前时间,写到一个Buffer数组中snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d]", levelToString(level).c_str(),ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday,ctime->tm_hour, ctime->tm_min, ctime->tm_sec);//时间是从1900开始的所有要加1900va_list s;va_start(s, format);char rightbuffer[SIZE];vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);va_end(s);// 格式:默认部分+自定义部分char logtxt[SIZE * 2];snprintf(logtxt, sizeof(logtxt), "%s %s\n", leftbuffer, rightbuffer);// printf("%s", logtxt); // 暂时打印printLog(level, logtxt);}private:int printMethod;//打印方式std::string path;
};

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

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

相关文章

单臂路由实验

单臂路由是一种在单个物理接口上配置多个逻辑接口&#xff0c;以实现不同VLAN间通信的技术。它通过在路由器接口上划分子接口&#xff0c;每个子接口对应一个VLAN网段&#xff0c;从而实现了VLAN间的互联互通。单臂路由能够重新封装MAC地址&#xff0c;转换VLAN标签&#xff0c…

基于51单片机的简单风扇控制设计—调速、摇头

基于51单片机的风扇控制设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.步进电机模拟风速、摇头 2.按键可以控制风速、摇头&#xff1b; 3.数码管显示风速档位&#xff1b; 4.LED作摇头提示灯…

<个人笔记>基础算法模板题

1.基础算法 &#xff08;1&#xff09;一维前缀和 #include<iostream>using namespace std;const int N 1e510;int p[N],res[N]; int n,Q,l,r;int main() {cin >> n >> Q;for(int i 1;i<n;i){cin >> p[i];res[i] res[i - 1] p[i];}while(Q--)…

项目篇 | 图书管理系统 | 管理员模块 | 首页

项目篇 | 图书管理系统 | 管理员模块 | 首页 概述 首页的功能非常简单,仅为展示四个核心数据,没有交互逻辑。 函数简介 // admin.h void homepage(); // 首页homepage:功能页,首页,实现核心数据的展示首页 // 首页 void homepage() {book_management_listen

百度AI大会发布的APP Builder和Agent Builder有什么区别

百度在AI大会发布了三款AI工具&#xff0c;包括智能体开发工具AgentBuilder、AI原生应用开发工具AppBuilder、各种尺寸的模型定制工具ModelBuilder 有很多人就问&#xff0c;APP Builder和Agent Builder有什么不一样&#xff0c;怎么那么多builder? 你们就这么理解&#xff…

Java基础之冒泡排序、二分查找、封装

Java基础 1.冒泡排序 public static void main(String[] args) {/*TODO 定义数组的 冒泡排序*/int[] intAr {3, 2, 1, 5, 6, 4, 2, 1, 8};bubbleSort(intAr);System.out.println(getArrStr(intAr)); }public static int[] bubbleSort(int[] intArr) {/*冒泡排序&#xff1a;…

什么是Java中的异常处理机制?

Java中的异常处理机制是一种用于处理运行时错误的强大系统&#xff0c;它允许程序在遇到意外情况时能够优雅地恢复。异常处理是Java语言的一个重要特性&#xff0c;它提供了一种结构化的方法来处理错误条件&#xff0c;而不是让程序崩溃或产生不可预期的行为。 **异常的基本概…

云安全与网络安全:有什么区别?

云计算已经存在了一段时间&#xff0c;但某些术语的正确含义仍然存在混乱。一个例子是区分云安全与网络安全。 首先&#xff0c;让我们看一下网络安全一词 &#xff0c;以了解它的含义。然后&#xff0c;我们将将该术语与云安全进行比较&#xff0c;以了解两者在几个关键领域的…

nginx-ingress详解

一、ingress概述 1、概述 Kubernetes是一个拥有强大故障恢复功能的集群&#xff0c;当pod挂掉时&#xff0c;集群会重新创建一个pod出来&#xff0c;但是pod的IP也会随之发生变化&#xff0c;为了应对这种情况&#xff0c;引入了service&#xff0c;通过service的标签匹配&am…

Java项目引入log4j2

log4j2 单独使用 引入依赖 <dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.0</version></dependency><dependency><groupId>o…

了解 Python 底层的解释器 CPython 和 Python 的对象模型

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、CPython CPython 是 Python 编程语言的官方和最广泛使用的实现。它是用 C 语言编写的&#xff0c;因此得名 “CPython”。作为 Python 生态系统的核心&#xff0c;了解 CPython 的工作原理、主要特…

前端 - 基础 表单标签 - label 标签

# label 标签 其实不属于 表单标签名单经常和 表单标签 搭配使用。 # <label> 标签 为 input 元素 定义 标注&#xff08; 标签 &#xff09; 使用场景 # 其实说白&#xff0c;<label> 标签就是为了方便用户体验的,举例说明 就是说&#xff0c;如上示&am…

如何理解数据库事务

事务的概念起源于数据库系统的设计和实现。在计算机科学领域中&#xff0c;数据库系统被广泛用于存储和管理大量的数据&#xff0c;而事务的概念则是为了解决多用户并发访问数据库时可能出现的一系列问题。 事务的概念最早由 IBM 的科学家 Edgar F. Codd 在 1970 年提出。Codd…

如何在响应头中防治xss

在HTTP响应头中设置一些特定的安全策略可以帮助防止XSS&#xff08;跨站脚本&#xff09;攻击。以下是一些常用的HTTP响应头和它们的作用&#xff1a; Content-Security-Policy&#xff1a;这个响应头可以限制浏览器只加载和执行来自特定来源的脚本。例如&#xff0c;你可以设置…

力扣爆刷第123天之回溯五连刷

力扣爆刷第123天之回溯五连刷 文章目录 力扣爆刷第123天之回溯五连刷一、77. 组合二、216. 组合总和 III三、17. 电话号码的字母组合四、39. 组合总和五、40. 组合总和 II 一、77. 组合 题目链接&#xff1a;https://leetcode.cn/problems/combinations/description/ 思路&…

数据结构——6.4 图的应用

6.4 图的应用 概念 最小生成树 对于一个带权连通无向图G ( E)&#xff0c;生成树不同&#xff0c;每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称为G的最小生成树 (Minimum-Spanni…

【华为OD机试】跳马【C卷|200分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格, 即先横着或者直者走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称"马走日"字。 给定 m…

如何在 Ubuntu 14.04 上更改 PHP 设置

简介 PHP 是一种服务器端脚本语言&#xff0c;被许多流行的 CMS 和博客平台如 WordPress 和 Drupal 所使用。它也是流行的 LAMP 和 LEMP 堆栈的一部分。更新 PHP 配置设置是设置基于 PHP 的网站时的常见任务。定位确切的 PHP 配置文件可能并不容易。通常在服务器上会有多个 PH…

弹性盒子(display: flex)布局

以下文章都可以参考 CSS - 完美解决 flex 布局下&#xff0c;一行显示固定个数&#xff08;平均分布&#xff09;并且强制换行&#xff0c;超出后 “靠左“ 对其&#xff08;详细解决方案&#xff0c;适用于 Web、Vue、React 等任何前端项目&#xff09;_flex设置一行几个-CSD…

linux下使用qt+mpv调用GPU硬件解码

linux下GPU硬件解码接口&#xff0c;常用的有vdpau和vaapi。 mpv是基于mplayer开发的一个播放器。此外&#xff0c;mpv还提供了函数库libmpv&#xff0c;通过使用libmpv可以编写一个简单的播放器。 基于qtlibmpv的demo&#xff0c;官方例子代码如下&#xff1a;https://github.…