Linux学习笔记:日志文件的编写

日志文件Log.hpp

  • 日志文件的作用
  • 简单的日志文件编写

日志文件的作用

日志文件可以很好的帮我们显示出程序运行的信息,例如,进程pid,运行时间,运行状况等,通过日志记录程序的执行路径、变量值、函数调用等,可以帮助我们快速定位和修复代码中的错误。

简单的日志文件编写

下面是用C/C++编写的一段日志文件: Log.hpp

#pragma once //日志文件#include<iostream>
#include<cstdio>
#include<stdarg.h>
#include<ctime>
#include<fstream>
#include <sys/stat.h>
#include <sys/types.h>enum  //日志等级设置 
{ Debug = 0,  //调试等级Info,  //常规Warning,  Error,Fatal  //服务器 
};enum   //设置打印风格
{Screen = 0,  //打印到显示器OneFile,    //打印到一个文件里ClassFile   //分文件打印
};const int defauleStyle = Screen;  //默认打印到屏幕上
const std::string defaultFilename = "log.";
const std::string logdir = "log";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 "Unknow";}
}std::string localTime()
{time_t curtime = time(0);struct tm *t = localtime(&curtime);char time_buffer[128];snprintf(time_buffer,sizeof(time_buffer),"%d-%d-%d %d:%d:%d",\t->tm_year+1900,t->tm_mon+1,t->tm_mday,\t->tm_hour,t->tm_min,t->tm_sec);return time_buffer;
}class Log
{
public:Log():style(defauleStyle),filename(defaultFilename){mkdir(logdir.c_str(),0775); //创建log目录用以记录日志文件}//设置打印风格,默认打印到屏幕void Enable(int sty){style = sty;}void WriteOnefile(const std::string& logname, const std::string &message){std::ofstream out(logname,std::ios::app); //创建文件,并以追加的方式打印内容if(!out.is_open()) return;out.write(message.c_str(),message.size()); //向目标文件中输出内容out.close();}void WriteClassfile(const std::string& level,const std::string &message){std::string logname = logdir;  //写入文件名的时候加上路径,就会直接在所写路径下进行输出logname += '/';logname += filename;logname += level;WriteOnefile(logname,message);}   void Writelog(const std::string &level,const std::string &message){switch (style){case Screen: //默认打印到屏幕std::cout<<message<<std::endl;break;case OneFile:  //默认打印到log.all文件中WriteClassfile("all",message);break;case ClassFile:  //默认打印到各类日志文件中WriteClassfile(level,message);break;default:break;}}//使用可变参数void LogMessage(int level,const char* format,...){char leftbuffer[1024]; // 这里打印日志等级,时间  到leftguffersnprintf(leftbuffer, sizeof(leftbuffer), "[%s] [%s]", LevelToString(level).c_str(), localTime().c_str());char rightbuffer[1024];  // 这里打印输入参数的内容  到rightbufferva_list args;va_start(args,format); //初始化可变参数列表 //此时args指向了可变参数部分 , 将参数中的信息输入到字符串mess中vsnprintf(rightbuffer,sizeof(rightbuffer),format,args);va_end(args);//将信息合体std::string message(leftbuffer);message += rightbuffer;//打印内容Writelog(LevelToString(level),message);}~Log(){}
public:int style;//打印风格  上面默认设置为打印到屏幕std::string filename;   //文件名默认为: log.};

调试代码:
test.cc

#include<iostream>
#include"Log.hpp"
#include <unistd.h>using namespace std;void testLog()
{Log log;log.Enable(ClassFile);log.LogMessage(Debug," i am %d \n",getpid());log.LogMessage(Info," i am %d \n",getpid());log.LogMessage(Warning," i am %d \n",getpid());log.LogMessage(Error," i am %d \n",getpid());log.LogMessage(Fatal," i am %d \n",getpid());log.LogMessage(Debug," i am %d \n",getpid());log.LogMessage(Info," i am %d \n",getpid());log.LogMessage(Warning," i am %d \n",getpid());log.LogMessage(Error," i am %d \n",getpid());log.LogMessage(Fatal," i am %d \n",getpid());log.LogMessage(Debug," i am %d \n",getpid());log.LogMessage(Info," i am %d \n",getpid());log.LogMessage(Warning," i am %d \n",getpid());log.LogMessage(Error," i am %d \n",getpid());log.LogMessage(Fatal," i am %d \n",getpid());
}int main()
{testLog();return 0;
}

测试结果:
在这里插入图片描述
可以看到,log目录下有各个日志文件,每个日志文件中有不同的内容
如:log.Debug
在这里插入图片描述

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

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

相关文章

磁盘配额的具体操作

磁盘配额&#xff1a; linux的磁盘空间有两个方面&#xff1a;第一个是物理空间&#xff0c;也就是磁盘的容量 第二个inode号耗尽&#xff0c;也无法写入 linux根分区&#xff1a;根分区的空间完全耗尽&#xff0c;服务程序崩溃&#xff0c;系统也无法启动了。 为了防止有人…

JavaWeb 请求响应路径调试

在使用mvc时&#xff0c;或许会遇到请求的页面响应不了&#xff0c;这种情况要对站下径。 站点根目录 启动服务器时&#xff0c;通常要知道哪个是站点根目录。相应在网页端的url的跟站点通常为http://localhost:8080/ &#xff0c;前端解析时用的是站点根目录。 <form act…

【嵌入式DIY实例】-OLED显示网络时钟

OLED显示网络时钟 文章目录 OLED显示网络时钟1、硬件准备与接线2、代码实现在上一个ESP8266 NodeMCU文章中,我们用DS3231 RTC芯片和SSD1306 OLED制作了一个简单的实时时钟,时间和日期显示在SSD1306屏幕上,并且可以通过两个按钮进行设置。 在本中,我们将使用ESP 8266 NodeMC…

【Gradle】Gradle的本地安装和使用

目录 1、Gradle 的安装 2、集成 IntelliJ IDEA 3、使用 Gradle Gradle 完全兼容 Maven 和 Ivy 仓库&#xff0c;你可以从中检索依赖也可以发布你的文件到仓库中&#xff0c;Gradle 提供转换器能把 Maven 的构建逻辑转换成 Gradle 的构建脚本。 1、Gradle 的安装 Gradle 的…

Python 将Word、Excel、PDF、PPT文档转为OFD文档

OFD&#xff08;Open Fixed-layout Document &#xff09;是我国自主制定的一种开放版式文件格式标准。OFD文档具有不易被篡改、格式独立、版式固定等特点&#xff0c;目前常用于政府公文、金融、电子发票等领域。 如果想要通过Python将Office文档&#xff08;如Word、Excel或…

Android 车载 Audio 中 有关系统按键无声的问题排查小结

本文简单记录一下&#xff0c;车载中系统按键音的问题排查从 App --> FrameWork --> HAL层 的问题排查。 通过日志分析&#xff1a; AudioStreamOutSink 这个有数据写入到 HAL 中&#xff08;方式一&#xff09; 查看 dump 文件。&#xff08;方式二&#xff09; 先 …

SAP 物料的与压缩库存数据不一致

在测试系统中进行501和561增加库存的时候,系统提示物料的预压缩库存数据不一致的报错。 如下图所示: 首先想到的就是搜SAP的NOTES,找到了相关的两个note:293356 note:2197042 表示:数据库表 ACDOCA 和 ACDOCA_M_EXTRACT 之间的差异。 经过查询发现是由于物料分类账中的…

Docker 图形化界面管理工具 Portainer | 让你更轻松的管理 Docker

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Portainer 是一个 Docker 图形化管理工具&#xff0c;可以通过 Web UI 轻松的管理容器、镜像、网络、卷。与 Dockge 相比功能更加的完善&#xff0c;同时上手难度也更大一些 Portainer 分为社区版和商业版…

你是否正确地编写了 Git 提交信息?

介绍 在版本控制方面&#xff0c;Git 是一个非常有效的工具。然而&#xff0c;像任何其他工具一样&#xff0c;你必须正确使用它才能充分发挥其作用。你需要考虑不同的方面。本文着重介绍如何按照传统提交规范&#xff08;Conventional Commits specification&#xff09;编写…

线上商城API接口再次升级||电商API接口对接线上商城搭建

功能更新 商城对接【蚂蚁搬客】应用 API接口产品上传及订单状态修改 01 商城对接API应用 ▼ 使用场景 适用于多个电商平台&#xff08;如淘宝、京东、天猫、1688、苏宁、唯品会、当当等&#xff09;的产品搬家&#xff0c;包括产品标题、主图等信息&#xff0c;轻松完成商…

NFTScan 获 Google Cloud 战略支持!

近日&#xff0c;NFT 数据基础设施服务商 NFTScan 获得全球领先云计算服务提供商 Google Cloud 战略支持。未来&#xff0c;双方将在链上数据和区块链领域展开战略合作&#xff0c;高效联动&#xff0c;共同探索区块链技术的更多可能性&#xff0c;为用户和行业带来更多惊喜与成…

束测后台实操文档2-OpenWrt

束测后台实操文档1-PVE、PBS 上面文&#xff0c;把proxmox装好并添加好PBS上的镜像存储空间后&#xff0c;还原已经做好的镜像基本上就可以在已有的镜像下开展工作了。 调试的PVE环境一般两个网口&#xff0c;一个外网wan&#xff0c;一个子网lan&#xff0c;虚拟机一般在lan…

【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (上)

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 移动平台上…

【Python】解决Python报错:AttributeError: ‘module‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

flink 操作mongodb的例子

简述 该例子为从一个Collection获取数据然后插入到另外一个Collection中。 Flink的基本处理过程可以清晰地分为以下几个阶段&#xff1a; 数据源&#xff08;Source&#xff09;&#xff1a; Flink可以从多种数据源中读取数据&#xff0c;如Kafka、RabbitMQ、HDFS等。Flink会…

21 厂商考证介绍(华为 华三 锐键 深信服)+AI 解析

一 认识考证体系 二 明确考证的大致方向 锐键 职业资格证书等级介绍 职业资格证书是由国家职业资格鉴定机构或相关行业主管部门颁发的&#xff0c;用于证明一个人在特定职业领域具备一定技能和知识水平的证明文件。职业资格证书的等级分为初级、中级、高级、技师、高级技师、…

【Python】解决Python报错:AttributeError: ‘NoneType‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

谢宁DOE培训的课程大纲分享

谢宁DOE培训旨在深入讲解谢宁问题解决方法在质量管理中的重要作用&#xff0c;学会如何利用谢宁问题解决方法工具&#xff0c;在不中断生产过程的前提下&#xff0c;找出生产中碰到的复杂而顽固的问题的原因&#xff0c;从而彻底地解决问题。 【课程内容】 第一部分&#xff1…

GEE 10m近实时 LULC 数据集Dynamic World

Google Earth Engine 和 Dynamic World Google 利用其地球引擎&#xff08;Earth Engine&#xff09;和人工智能&#xff08;AI&#xff09;平台技术&#xff0c;推出了 Dynamic World 数据库&#xff0c;能够提供接近实时的全球土地环境数据。Dynamic World 是基于 Google Ear…

c++ QT 实现QMediaPlayer播放音频显示音频级别指示器

文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了&#xff0c;就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针&#xff0c;用于监控音频流。当音频流被捕获或播放时&#xff0c;QAudioProbe 可以接收到音频数据。这个类在需要访问…