Linux应用——简易日志

news/2024/10/5 6:33:54/

1. 日志要求

对于一个日志来说,我们任认为其应该具有以下的内容

1. 日志时间

2. 日志等级

3. 日志内容

4. 文件名称与行号

在此基础上我们对不同的日志做出分级,即

info:        常规信息

warning: 报警信号

error:      严重信号,可能需要立即处理

fatal:       致命信号

Debug:   调试信息 

2. 代码实现

#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;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(nullptr);struct tm *ctime = localtime(&t);// leftbuffer - 存储等级信息与日期信息char leftbuffer[SIZE];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);// 将可变参数中传入的参数写入到rightbuffer中// rightbuffer - 存储用户提示va_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);printLog(level, logtxt);}private:int printMethod;std::string path;
};

3. 使用测试

#include "Log.hpp"int main()
{// 创建Log对象Log lg;lg(Info, "启动成功");sleep(1);lg(Debug, "这是一个调试信息");sleep(1);lg(Warning, "这是一个警告信息");sleep(1);lg(Error, "这是一个错误信息");sleep(1);lg(Fatal, "这是一个致命错误信息");return 0;
}

测试效果


http://www.ppmy.cn/news/1534801.html

相关文章

使用transformers调用owlv2实现开放目标检测

目录 安装Demo 安装 pip install transformersDemo from PIL import Image, ImageDraw, ImageFont import numpy as np import torch from transformers import AutoProcessor, Owlv2ForObjectDetection from transformers.utils.constants import OPENAI_CLIP_MEAN, OPENAI_…

Python办公自动化教程(006):Word添加标题

2.3 word标题 介绍&#xff1a; 在 python-docx 中&#xff0c;您可以使用 add_heading() 方法为文档添加标题。此方法允许您指定标题的文本和级别&#xff08;例如&#xff0c;一级标题、二级标题等&#xff09;。标题级别的范围是从 0 到 9&#xff0c;其中 0 表示文档的主标…

Android源码下载及编译

在分析Android源码前&#xff0c;首先要学会如何下载和编译系统。本章将向读者完整地呈现Android源码的下载流程、常见问题以及处理方法&#xff0c;并从开发者的角度来理解如何正确地编译出Android系统&#xff08;包括原生态系统和定制设备&#xff09;。 Android源码下载指…

Neo4j CQL语句 使用教程

CREATE命令 : CREATE (<node-name>:<label-name>{ <Property1-name>:<Property1-Value>........<Propertyn-name>:<Propertyn-Value>} )字段说明 CREATE (dept:Dept { deptno:10,dname:“Accounting”,location:“Hyderabad” })&#…

0基础学前端 day9--css布局

CSS布局概述 一、引言 CSS布局是Web开发中至关重要的一部分&#xff0c;用于控制网页元素的排列和显示方式。不同的布局技术被应用于网页设计中&#xff0c;以确保其在各种设备和屏幕尺寸上都具有良好的用户体验。CSS布局技术包括浮动&#xff08;float&#xff09;、定位&am…

uniapp在线打包的ios后调用摄像头失败的解决方法

uniapp在线打包的ios后调用摄像头失败的解决方法 解决方法&#xff1a; 由于未选中打包模块的配置 当你在测试时发现能够正常的开启摄像头&#xff0c;但是当你对其进行在线打包后&#xff0c;发现当你点击启用摄像头时&#xff0c;没有反应&#xff0c;或者是打开是黑屏状态…

2c 操作符详解

1. 操作符分类&#xff1a; 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术操作符 - * / % 1除了 % 操作符之外&#xff0c;其他的几个操作符可以作用于整数和浮点数。对于 / 操作…

docker minio进行数据迁移

背景 由于更换minio服务,需要将旧的minio存储的文件迁移到新的minio服务 MinIO的MC(MinIO Client)工具提供了非常便利的方式来迁移数据,无论是从一个MinIO服务器到另一个MinIO服务器,还是从其他对象存储服务(如AWS S3)到MinIO,甚至是本地文件系统到MinIO。以下是使用…