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;也可以编写出高质量的网络通信程序。 …

启动Dockerfile中的环境,开启旧项目编辑

Dockerfile 是用于构建 Docker 镜像的脚本文件&#xff0c;它包含了一系列指令&#xff0c;描述了如何组装镜像。在部署完成后&#xff0c;你可能需要一个简化的 Dockerfile 来仅包含必要的组件&#xff0c;并确保镜像的大小尽可能小。以下是一个简单的示例 Dockerfile # 使用…

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

树的定义 树是一种非线性数据结构&#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…

Runway联合Getty打造AI视频模型RGM,引领广告新革命

近日&#xff0c;纽约市的视频AI创业公司Runway ML宣布&#xff0c;将与全球最大付费图库及编辑图片库之一的Getty Images进行合作&#xff0c;共同开发一种全新的生成性AI视频模型&#xff1a;Runway Getty Images Model&#xff08;RGM&#xff09;。这一消息在科技领域引起了…

假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树b的宽度(即具有结点数最多的那一层的结点个数)。

题目描述&#xff1a;假设二叉树采用二叉链表存储结构&#xff0c;设计一个算法&#xff0c;求非空二叉树b的宽度(即具有结点数最多的那一层的结点个数)。 分析&#xff1a; 每次递归时&#xff0c;如果当前结点不为空&#xff0c;就将当前层数的宽度1&#xff0c;并更新最大宽…

【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;主要的功能模块有注册、登录、物品代购、快递代取、话题管理、任务管理、反馈管理、投诉管理、订单管理等功能模块。 项目 数据库 首页 登录 新增反馈 发布话题 发布任务 接单 我要投诉…

【1day】用友 U8 Cloud系统upload.jsp接口任意文件上传漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现

Java绘图

JAVA绘图 原点在左上角 类似二维数组 单位是像素 像素是密度单位&#xff0c;不是长度单位&#xff0c;不是多少cm&#xff0c;没法比较 分辨率800*600&#xff0c;像素是480000个 定义&#xff1a; 定义一个Mypanel类&#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、…

【1day】用友 U8 Cloud系统TaskTreeQuery接口SQL注入漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现

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

面试的时候经常会被问到在接口自动化测试过程中怎么处理接口依赖&#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;实现其他类…

copilot的使用

Copilot 是由 OpenAI 和 GitHub 共同开发的一款基于 GPT-3 的自动代码补全工具。它是一种先进的代码生成工具&#xff0c;旨在帮助开发人员更快速地编写代码。Copilot 能够通过分析代码上下文并提供代码片段的建议来提高编码效率。 以下是 Copilot 的一些主要特点和用法&#x…

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

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