Linux-实现小型日志系统

目录

 一.日志

二.实现任意个数元素求和        

三.编写一个日志函数

        1.设置日志等级        

        2.设置日志时间

        3.设置日志的打印格式

        4.将日志的内容输出到文件             


 一.日志

                日志等级,日志时间,日志内容,文件的名称和行号

                日志等级:

                        Info:常规消息

                        Warning:报警消息

                        Error:错误,可能需要立即处理

                        Fatal:致命的

                        Debug:调试

二.实现任意个数元素求和        

                使用可变参数要使用若干个宏定义,这些宏定义在:        

//使用可变参数时一定要有一个具体的参数
int Sum(int n, ...)
{//用来提取可变参数的一个个参数,其实本质上就是一个char*类型的指针变量va_list s;//只向可变参数的首地址,内部封装了s = &n + 1;va_start(s, n);//实现求和int sum = 0;while(n){//根据类型提取参数va_arg(s, int);n--;}//s = NULL;va_end(s);return  sum;
}

        主函数调用:      

        此时我们传入的可变参数都是相同的类型的,如果传入不同的类型的话,就要像printf一样做获取的字符串处理。 

三.编写一个日志函数

        1.设置日志等级        
#define Info    0
#define DeBug   1
#define Warning 2
#define Error   3
#define Fatal   4//实现日志函数
void logmessage(int level, char* formatr, ...)
{}
        2.设置日志时间

                a.Linux中获取时间戳的函数                     

                b.Linux中转换时间戳的函数

                会将得到的时间戳转换为以下形式:               因为年和月都是从0开始计的所以在打印的时候,需要加1900和1。

void logmessage(int level, char* formatr, ...)
{//获取时间戳time_t t = 0;time(&t);//转换时间戳struct tm* ctime = NULL;ctime = localtime(&t);//打印获取到的时间printf("%d-%d-%d %d:%d:%d\n", ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec);}
        3.设置日志的打印格式

                默认部分 + 自定义部分

                

#define Info            0
#define DeBug           1
#define Warning         2
#define Error           3
#define Fatal           4
#define Log_buffer_SIZE 1024string 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 logmessage(int level, char* format, ...)
{//获取日志的等级string level_str;level_str = levelToString(level);//获取时间戳time_t t = 0;time(&t);//转换时间戳struct tm* ctime = NULL;ctime = localtime(&t);// //打印获取到的时间// printf("%d-%d-%d %d:%d:%d\n"//                     , ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday//                     , ctime->tm_hour, ctime->tm_min, ctime->tm_sec);//整合日志的默认部分char leftbuffer[Log_buffer_SIZE];snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d] : " ,level_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 rightbuffer[Log_buffer_SIZE];vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);va_end(s);//整合默认部分和自定义部分char logtxt[Log_buffer_SIZE * 2];snprintf(logtxt, sizeof(logtxt), "%s%s\n", leftbuffer, rightbuffer);printf("%s", logtxt);
}
        4.将日志的内容输出到文件             
#include <time.h>
#include <string>
#include <stdio.h>
#include <stdarg.h>
#include <iostream>
#include <cstdio>
#include <cerrno>
#include <cstring>
#include <fcntl.h>
#include <unistd.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>using namespace std;#define Info 0
#define DeBug 1
#define Warning 2
#define Error 3
#define Fatal 4
#define Log_buffer_SIZE 1024string 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";}
}#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;}void printLog(int level, const string& logtxt){switch (printMethod){case Screen:cout << logtxt.c_str() << endl;break;case Onefile:printOneFile(LogFile, logtxt);break;case Classfile:printClassFile(level, logtxt);break;default:break;}}void printOneFile(const string &logname, const string &logtxt){string _logname = path;_logname += 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 string &logtxt){string filename = LogFile;filename += ".";filename += levelToString(level); // "log.txt.Debug/Warning/Fatal"printOneFile(filename, logtxt);}~Log(){}//处理日志等级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 operator()(int level, char *format, ...){// 获取日志的等级string level_str;level_str = levelToString(level);// 获取时间戳time_t t = 0;time(&t);// 转换时间戳struct tm *ctime = NULL;ctime = localtime(&t);// 整合日志的默认部分char leftbuffer[Log_buffer_SIZE];snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d] : ", level_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 rightbuffer[Log_buffer_SIZE];vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);va_end(s);// 整合默认部分和自定义部分char logtxt[Log_buffer_SIZE * 2];snprintf(logtxt, sizeof(logtxt), "%s%s\n", leftbuffer, rightbuffer);// printf("%s", logtxt);printLog(level, logtxt);}private:int printMethod;string path;
};

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

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

相关文章

写论文焦虑?No,免费AI写作大师来帮你

先来看1分钟的视频&#xff0c;对于要写论文的你来说&#xff0c;绝对有所值&#xff01; 还在为写论文焦虑&#xff1f;免费AI写作大师来帮你三步搞定 第一步&#xff1a;输入关键信息 第二步&#xff1a;生成大纲 稍等片刻后&#xff0c;专业大纲生成&#xff08;由于举例&am…

Java的第二十一章:网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络支持&#xff0c;也可以编写出高质量的网络通信程序。 …

二叉树的基本概念(详解)

树的定义 树是一种非线性数据结构&#xff0c;由n&#xff08;n>1&#xff09;个节点以及n-1条边组成&#xff0c;其中有且仅有一个节点作为根节点。树的定义具有以下特点&#xff1a; 每个节点具有零个或多个子节点。除了根节点外&#xff0c;每个节点有且仅有一个父节点…

【Pytorch使用自制数据集,Dataloader】

数据集结构 话不多说&#xff0c;直接上核心代码 myDataset.py from collections import Counter from torch.utils.data import Dataset import os from PIL import Imageclass MyDataset(Dataset):"""读取自制的数据集args:- image_dir: 图片的地址- labe…

【ETL】Kettle清洗任务异常提醒,Spoon作业异常通知

清洗作业如果挂在第三方任务平台或比较多的任务&#xff0c;执行失败无法跟踪&#xff0c;需要给任务添加异常提醒&#xff0c;这里用钉钉的群消息机器人。 钉钉机器人文档 自定义机器人接入 - 钉钉开放平台 作业示例 通过请求触发告警消息

谈一谈C++的类对象的存储方式

在C的类中&#xff0c;有成员变量和成员函数。当类经过实例化后&#xff0c;便有了类对象&#xff0c;C示例对象中的成员变量和成员函数是分开存储的。 成员变量 : 普通成员变量 : 在 对象 指针指向的内存中存储 , 存储方式与 C 语言中的 struct 结构体 存储变量的 内存结布局 …

Python图像处理利器解密:Pillow库使用指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 引言 Pillow库是Python编程中用于图像处理的重要工具。作为Python Imaging Library&#xff08;PIL&#xff09;的一个分支&#xff0c;Pillow库提供了丰富的功能和易用的API&#xff0c;用于处理图像的各种操作…

基于SpringBoot的校园互助网站

简介 本系统分为三个角色&#xff0c;分别是普通用户和管理员、以及超级管理员&#xff0c;主要的功能模块有注册、登录、物品代购、快递代取、话题管理、任务管理、反馈管理、投诉管理、订单管理等功能模块。 项目 数据库 首页 登录 新增反馈 发布话题 发布任务 接单 我要投诉…

华为无线配置模板 一

华为无线配置模板 一 拓扑图1.配置SwitchA和AC&#xff0c;使AP与AC之间能够传输CAPWAP报文2.配置AC作为DHCP服务器&#xff0c;为STA和AP分配IP地址3.配置AP上线4.配置WLAN业务参数5.验证配置结果 拓扑图 采用如下的思路配置小型网络的WLAN基本业务&#xff1a;1.配置AP、AC、…

接口自动化测试过程中怎么处理接口依赖?

面试的时候经常会被问到在接口自动化测试过程中怎么处理接口依赖&#xff1f; 首先我们要搞清楚什么是接口依赖。 01. 什么是接口依赖 接口依赖指的是&#xff0c;在接口测试的过程中一个接口的测试经常需要依赖另一个或多个接口成功请求后的返回数据。 那怎么处理呢&#x…

2023年【A特种设备相关管理(锅炉压力容器压力管道)】考试内容及A特种设备相关管理(锅炉压力容器压力管道)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试内容根据新A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将A特种设备相关管理…

Rust的From与Into Trait

Into的本质是调用了From Trait 的方法。 From是底层的方法&#xff0c;把From实现了&#xff0c;Into的实现&#xff0c;编译器会自动根据From Trait生成Into Trait的代码 编译器自动类型推导出Into Trait的U的类型&#xff0c;调用了U类型的From的方法&#xff0c;实现其他类…

【多线程】-- 12 线程协作之生产者消费者问题及解决办法

多线程 9 线程协作 “生产者消费者问题” ——并非二十三种设计模式之一 9.1 生产者消费者问题 “线程通信” 应用场景&#xff1a;生产者和消费者问题 假设仓库中只能存放一件产品&#xff0c;生产者将生产出来的产品放入仓库&#xff0c;消费者将仓库中产品取走消费如果…

JDK8升级11常见问题

JDK8升级11常见问题 1. 使用rt.jar/jce.jar情况 原代码&#xff1a; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><targe…

vue el-select多选封装及使用

使用了Element UI库中的el-select和el-option组件来构建多选下拉框。同时&#xff0c;也包含了一个el-input组件用于过滤搜索选择项&#xff0c;以及el-checkbox-group和el-checkbox组件用于显示多选项。 创建组件index.vue (src/common-ui/selectMultiple/index.vue) <tem…

生成式 AI 应用落地小结:高估的模型能力,低估的工程实施

虽然 ChatGPT 已经诞生了一周年&#xff0c;但是大量的人依旧对于生成式 AI 没有足够的认识。在研发领域&#xff0c;Thoughtworks 一直在与不同的大型企业合作&#xff0c;保持开放性的探索。 在我负责的 Thoughtworks 开源社区&#xff0c;我们与外部的几家大型企业一起探索和…

OpenCV-python:图像像素类型转换与归一化

目录 1.图像像素类型转换 2. 图像像素转换适用情形 3.图像归一化 4.归一化方法支持 5.归一化函数 6.知识笔记 1.图像像素类型转换 图像像素类型转换是指将图像的像素值从一种类型转换为另一种类型。常见的像素类型包括无符号整数类型&#xff08;如8位无符号整数、16位无符…

leetCode 37.解数独 + 回溯算法 + 图解

编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数独部分空…

c语言指针详解(上)

目录 一、指针的基本概念和用法 二、指针运算 2.1 指针的自增和自减运算 2.2 指针的自增和自减运算 三、数组和指针 四、指针和函数 4.1 在函数中使用指针作为参数和返回值 4.1.1 使用指针作为函数参数 4.1.2 使用指针作为函数返回值 4.2 指针参数的传值和传引用特性 4.2.1 指针…

SIT75176B:3.0~5.5V 供电,32 节点,10Mbps 半双工 RS485/RS422 收发器

SIT75176B 是一款 3.0V~5.5V 电源供电、总线端口 ESD 保护能力 HBM 达到 15kV 以上、总 线耐压范围达到 15V 、半双工、低功耗&#xff0c;功能完全满足 TIA/EIA-485 标准要求的 RS-485 收发器&#xff0c; 最多允许 32 个节点同时连接到总线。 SIT75176B 包…