【Linux】日志

日志是记录软件运行过程中发生的事件的一种手段,通常包含以下内容:

  • 时间戳:记录日志条目创建的确切时间。这对于追踪事件发生的时间顺序至关重要。
  • 日志级别:表示日志信息的严重性或重要性,常见的级别包括 DEBUG、INFO、WARNING、ERROR 和 FATAL。
  • 消息:日志条目的主要文本内容,描述了发生了什么事件或情况。
  • 来源:生成日志条目的组件、模块、类或函数名,有助于定位日志信息在代码中的位置。
  • 线程信息:在多线程应用程序中,记录产生日志的线程ID或名称。
  • 进程信息:记录产生日志的进程ID或名称。
  • 用户信息:如果是用户驱动的应用程序,可能需要记录进行操作的用户ID或名称。
  • 主机信息:记录生成日志的服务器或主机的名称或IP地址。
  • 异常信息:如果日志是由于异常情况而产生的,通常包括异常的类型、消息、堆栈跟踪等。
  • 自定义上下文:根据应用程序的需要,可能包括与事件相关的特定上下文信息,如交易ID、会话ID、请求参数等。

在C++标准库中,并没有直接提供专门的日志记录功能,然而,C++标准库中的一些组件可以用来模拟实现日志记录。

需要实现:

  • 日志级别:Debug, Info, Warning, Error, Fatal:这些枚举值定义了不同的日志级别。
  • 日志输出风格:Screen, OneFile, ClassFile:定义了日志消息的输出方式,分别对应控制台输出、单个文件输出和按类别分文件输出。
  • 获取当前时间戳:TimeStampToLocalTime获取当前时间戳并转换为本地时间。
  • 输出日志消息:屏幕、单个文件、多类文件。

Log.hpp如下:

#pragma once#include <iostream>
#include <vector>
#include <string>
#include <cstdarg>
#include <sys/stat.h>
#include <sys/types.h>
#include <ctime>
#include <fcntl.h>
#include <unistd.h>// 日志级别
enum
{Debug = 0,Info,Warning,Error,Fatal
};// 输出风格
enum
{Screen = 10,OneFile,ClassFile
};// 日志级别的字符串输出
std::string LevelToString(int level)
{switch (level){case Debug:return "Debug";case Info:return "Info";case Warning:return "Warning";case Error:return "Error";case Fatal:return "Fatal";default:return "Unknown";}
}// 获取当前时间戳并转换为本地时间
std::string TimeStampToLocalTime()
{time_t curtime = time(nullptr);struct tm *cur = localtime(&curtime);char time_buffer[128];snprintf(time_buffer, sizeof(time_buffer), "%d/%d/%d %d:%d:%d",cur->tm_year + 1900, cur->tm_mon + 1, cur->tm_mday,cur->tm_hour, cur->tm_min, cur->tm_sec);return time_buffer;
}const int default_Style = Screen;
const std::string default_filename = "log.";
const std::string default_logdir = "log"; // 文件的默认存储路径class Log
{
public:Log(): _style(default_Style),_filename(default_filename){mkdir(default_logdir.c_str(), 0775);}// 更改输出风格void ChangeStyle(int style){_style = style;}// 输出消息到单个文件void WriteLogToOneFile(const std::string &logname, const std::string &message){umask(0);int fd = open(logname.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666);if (fd < 0)return;write(fd, message.c_str(), message.size());close(fd);}// 输出消息到多类文件void WriteLogToClassFile(const std::string &levelstr, const std::string &message){std::string logname = default_logdir;logname += "/";logname += _filename;logname += levelstr;WriteLogToOneFile(logname, message);}void WriteLog(const std::string &levelstr, const std::string &message){switch (_style){case Screen:std::cout << message << std::endl;break;case OneFile:WriteLogToOneFile("all", message);break;case ClassFile:WriteLogToClassFile(levelstr, message);break;default:break;}}void LogMessage(int level, const char *format, ...){char leftbuffer[1024];std::string levelstr = LevelToString(level);std::string curtime = TimeStampToLocalTime();std::string pid = std::to_string(getpid());snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%s][%s]  ",levelstr.c_str(),curtime.c_str(),pid.c_str());char rightbuffer[1024];va_list args;   //用于访问可变参数列表va_start(args, format); //使用 va_start 宏初始化 args,使其指向 format 后面的第一个可变参数// args 指向了可变参数部分vsnprintf(rightbuffer,sizeof(rightbuffer),format,args);//使用 vsnprintf 函数将可变参数列表按照 format 格式化后的字符串写入 rightbuffer,同时限制写入的字符数不超过 rightbuffer 的大小va_end(args);   //args = nullptr;std::string loginfo = leftbuffer;loginfo += rightbuffer;WriteLog(levelstr, loginfo);}~Log(){}
private:int _style;            // 输出风格std::string _filename; // 文件名称
};

Main.cc如下:

#include "Log.hpp"int main()
{Log lg;// lg.ChangeStyle(Screen);lg.ChangeStyle(ClassFile);lg.LogMessage(Debug, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Info, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Warning, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Error, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Fatal, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Debug, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Info, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Warning, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Error, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Fatal, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Debug, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Info, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Warning, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Error, "this is a log message: %d, %lf\n", 123, 3.14);lg.LogMessage(Fatal, "this is a log message: %d, %lf\n", 123, 3.14);return 0;
}

虽然C++标准库可以用来实现基本的日志记录功能,但如果需要一个更完整、功能更强大的日志系统,通常会选择使用专门的日志库,如spdlog、Log4cpp、Boost.Log等。这些库提供了更高级的日志管理功能,包括日志级别控制、异步日志记录、日志回滚等

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

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

相关文章

【Linux】Linux背景历史

Linux背景历史 Linux背景Linux是什么&#xff1f;计算机的发展unix发展史Linux发展史开源Linux官网以及版本更替Linux企业应用现状 Linux环境的安装 Linux背景 Linux是什么&#xff1f; Linux(Linux Is Not UniX)&#xff0c;一般指GNU/Linux&#xff0c;是一种免费使用和自由…

Qt QChart 曲线图表操作

学习目标&#xff1a;QChart 曲线图表操作 学习内容 QT中的QChart类提供了一个功能强大的图表绘制框架,可以根据需求方便高效地绘制各种类型的图表,主要特点如下: 支持多种常见图表类型,如线图、条形图、饼图、散点图等各种类型。开发者只需要选择合适的图表类和数据即可绘制…

一键调仓/组合买卖?篮子交易功能,PTrade如何进行篮子交易?

篮子交易&#xff0c;也叫组合交易&#xff0c;是指同时完成一个股票或期货组合的交易。 “篮子交易”功能&#xff0c;通过模板一键导入一篮子股票&#xff0c;可对篮子中的股票进行剔除 或使用持仓替代操作&#xff0c;同时可设定报价方式、单笔超价、交易方式等。并实时显示…

android13 rom 开发总纲说明

1. 这里是文章总纲&#xff0c;可以在这里快速找到需要的文章。 2. 文章一般是基于标准的android13&#xff0c;有一些文章可能会涉及到具体平台&#xff0c;例如全志&#xff0c;瑞芯微等一些平台。 3.系统应用 3.1系统应用Launcher3桌面相关&#xff1a; 3.2系统应用设置S…

深度学习--基础语法

目录 pytorch的tensor与numpy 关系 tensor与numpy的转换&#xff1a; 区别&#xff1a; 创建tensor 一 numpy数组&#xff0c;list列表转换为tensor 二 未初始化创建tensor 创建空的 PyTorch 张量 e&#xff1a; 使用 torch.Tensor() 创建指定大小的张量 f&#xff1a;…

HNU-2024操作系统实验-Lab9-Shell

一、 实验目的 理解Shell程序的原理、底层逻辑和Shell依赖的数据结构等 在操作系统内核MiniEuler上实现一个可用的Shell程序 能够根据相关原理编写一条可用的Shell指令 二、 实验过程 首先从底层出发&#xff0c;实现Shell程序 1.在src/include目录下新建prt_shell.h头文…

产线工控安全怎么做

随着工业自动化的推进&#xff0c;工控系统在现代生产线中的应用越来越广泛&#xff0c;但随着网络安全威胁的不断演变&#xff0c;产线工控系统的安全也面临着前所未有的挑战。面对这种情况&#xff0c;可以使用MCK主机加固&#xff08;深信达&#xff09;解决方案为产线工控安…

ROS基础学习-ROS运行管理

ROS运行管理 目录 1. ROS运行管理简述2. ROS元功能包2.1 概念2.2 作用2.3 实现 3. ROS-launch文件3.1. ROS节点管理launch文件3.1.1 概念3.1.2 作用3.1.3 使用 3.2 launch文件标签 1. ROS运行管理简述 ROS是多进程(节点)的分布式框架&#xff0c;一个完整的ROS系统实现&#x…

C++ 入门08:运算符重载

往期回顾&#xff1a; C 入门05&#xff1a;类和对象-CSDN博客 C 入门06&#xff1a;类的进阶&#xff08;构造函数的重载与拷贝构造函数&#xff09;-CSDN博客 C 入门07&#xff1a;静态成员和常量成员-CSDN博客 一、前言 在前面的文章学习中&#xff0c;我们学习了类和对象的…

在Spring Boot项目中集成分布式追踪系统

在Spring Boot项目中集成分布式追踪系统 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在复杂的分布式系统中&#xff0c;定位和解决问题是一项挑战。分布式追踪系统通过跟踪请求的调用链&#xf…

基于搭载 DJYOS 的 STM32H730 的低空无人驾驶无人机解决方案探究

摘要&#xff1a;本文详细阐述了一种基于搭载 DJYOS 的 STM32H730 开发的低空无人驾驶无人机解决方案。通过对其硬件配置、飞控系统、传感器应用、动力与续航以及操控方式等方面的深入分析&#xff0c;展现了该方案在低空无人驾驶领域的创新性和优势&#xff0c;为相关技术的发…

最新 Kubernetes 集群部署 + Contranerd容器运行时 + flannel 网络插件(保姆级教程,最新 K8S 1.28.2 版本)

资源列表 操作系统配置主机名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…

VScode代码对齐快捷键

解决复制过来代码对齐格式问题。 左对齐&#xff1a;Ctrl[ 右对齐&#xff1a;Ctrl]

always块敏感列表的相关报错,

在综合的时候&#xff0c;报错如下 Synthesis synth_1 [Synth 8-91] ambiguous clock in event control ["E:/FPGA/FPGA_project/handwrite_fft/handwrite_fft.srcs/sources_1/new/reg_s2p.v":140] 猜测报错原因&#xff08;暂时没有时间寻找原因&#xff0c;后续在…

web自动化环境搭建[基于Chrome]+常用元素定位方式

下载chrome&#xff1a;可以使用电脑自带软件[HUES,360等]下载 下载chromedriver&#xff1a; 老版本地址:http://chromedriver.storage.googleapis.com/index.html,选择点击进去&#xff0c;有个notes.txt文件查看支持版本 最新版本:https://googlechromelabs.github.io/chro…

mac python

1. 默认在 /usr/bin/ 目录&#xff0c;安装目录在 /Users/wangjun/Library/Python/3.9/lib/python/site-packages 2. 安装自己的python。 无需理会上面的版本。 访问 Python Release Python 3.12.4 | Python.org 安装即可 使用 python3 pip3 /usr/local/bin

AI虚拟医生重塑医患关系

如今&#xff0c;越来越多的企业开始选择用AI虚拟数字人播报员替代真人出镜&#xff0c;这不仅有助于企业实现降本增效的目标&#xff0c;更能让广告传播趋向多样化和个性化。对于普通人而言&#xff0c;也摆脱了真人出镜的种种烦恼&#xff0c;让表达更加自由与便捷。AI虚拟数…

一个简单的基于Qt的MVC框架

如下是一个简单的基于Qt的MVC框架示例&#xff0c;其中模型&#xff08;Model&#xff09;中的操作会在子线程中处理。这个示例将包括一个基本的视图&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;和模型&#xff08;Model&#xff09;。 1. 项目结…

5,智能合约(react+区块链实战)

5&#xff0c;智能合约&#xff08;react区块链实战&#xff09; 5-1 智能合约5-2 metamask安装及私有链搭建互相联动5-3 solidity数据类型-布尔-数字-地址&#xff08;owner区别&#xff09;5-4 solidity 数组和映射&#xff08;代币转账&#xff09;5-5 solidity结构体与枚举…

视频怎么压缩变小?最佳视频压缩器

即使在云存储和廉价硬盘空间时代&#xff0c;大视频文件使用起来仍然不方便。无论是存储、发送到电子邮件帐户还是刻录到 DVD&#xff0c;拥有最好的免费压缩软件可以确保您快速缩小文件大小&#xff0c;而不必担心视频质量下降。继续阅读以探索一些顶级最佳 免费视频压缩器选项…