当前位置: 首页 > news >正文

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
在这里插入图片描述

相关文章:

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

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

为什么要保持方差为1

1.数值稳定性&#xff1a; 在机器学习和深度学习中&#xff0c;维持激活函数输入的方差在一个合理范围内&#xff08;如1&#xff09;是很重要的&#xff0c;这有助于防止在训练过程中发生梯度消失或梯度爆炸的问题。如果方差过大或过小&#xff0c;经过多层网络后输出结果的方…...

Wpf 使用 Prism 实战开发Day31

登录数据绑定 1.首先在LoginViewModel 登录逻辑处理类中&#xff0c;创建登录要绑定属性和命令 public class LoginViewModel : BindableBase, IDialogAware {public LoginViewModel(){ExecuteCommand new DelegateCommand<string>(Execure);}public string Title { ge…...

Linux权限提升二

#应用场景&#xff1a; 获取到Web权限或普通用户在Linux服务器上时进行的SUID&SUDO提权 SUID (Set owner User ID up on execution)是给予文件的一个特殊类型的文件权限。在Linux/Unix中&#xff0c;当一个程序运行的时候&#xff0c;程序将从登录用户处继承权限。SUID被定…...

[AI OpenAI] 推出ChatGPT Edu

一种负担得起的解决方案&#xff0c;帮助大学将AI负责任地引入校园。 我们宣布推出ChatGPT Edu&#xff0c;这是一个专为大学设计的ChatGPT版本&#xff0c;旨在负责任地向学生、教职员工、研究人员和校园运营部署AI。ChatGPT Edu由GPT-4o提供支持&#xff0c;能够跨文本和视觉…...

HTML5+CSS3回顾总结

一、HTML5新特性 1.语义化标签 <header> 头部标签<nav> 导航标签<article> 内容标签<section> 定义文档某个区域<aside> 侧边栏标签<footer> 尾部标签 2.多媒体标签 2.1视频标签vedio 》常规写法&#xff08;尽量都使用mp4&#xff0…...

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.05.01-2024.05.10

文章目录~ 1.Pseudo-Prompt Generating in Pre-trained Vision-Language Models for Multi-Label Medical Image Classification2.VLSM-Adapter: Finetuning Vision-Language Segmentation Efficiently with Lightweight Blocks3.Memory-Space Visual Prompting for Efficient …...

Python 点云生成高程模型图(DSM)

点云生成高程模型图 一、什么是DSM?二、python代码三、结果可视化一、什么是DSM? DSM(Digital Surface Model)是一种数字高程模型,通常用于描述地表地形的数字化表示。它是由一系列离散的高程数据点组成的三维地形模型,其中每个点都具有其相应的高程值。   DSM主要用于…...

[第五空间 2021]WebFTP

题目是WebFTP 通过标签可以看出git泄露(git泄露是指开发人员利用git进行版本控制) 通过网上了解WebFTP的源码账号admin 密码admin888 进去之后正常思路是我们利用/.git 在githack里面进行复现 查看log看看有没有flag 但是经过我们查询之后不是这样子 通过一段时间摸索在phpinf…...

SQL—DQL(数据查询语言)之小结

一、引言 在前面我们已经学习完了所有的关于DQL&#xff08;数据查询语言&#xff09;的基础语法块部分&#xff0c;现在对DQL语句所涉及的语法&#xff0c;以及需要注意的事项做一个简单的总结。 二、DQL语句 1、基础查询 注意&#xff1a; 基础查询的语法是&#xff1a;SELE…...

找回xmind文件办法:一切意外均可找回(误删/重启关机等)

我周三编辑完&#xff0c;周四下午评审完用例忘记保存 结果到了快乐星期五&#xff0c;由于是周五我太开心了...早上到公司后觉得电脑卡&#xff0c;直接点了重启啥都没保存啊啊啊啊啊 准备上传测试用例时才想起来我的用例找不见了&#xff01;&#xff01;&#xff01;&…...

微信小程序 npm构建+vant-weaap安装

微信小程序&#xff1a;工具-npm构建 报错 解决&#xff1a; 1、新建miniprogram文件后&#xff0c;直接进入到miniprogram目录&#xff0c;再次执行下面两个命令&#xff0c;然后再构建npm成功 npm init -y npm install express&#xff08;Node js后端Express开发&#xff…...

【LeetCode 63】 不同路径 II

1. 题目 2. 分析 这道题比较典型&#xff0c;跟最小路径和 是同样的思想。比较简单。 3. 代码 class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:row len(obstacleGrid)col len(obstacleGrid[-1]) dp [[0] *(col) f…...

OpenAI助手API接入-问答对自动生成

支持GPT-3.5-Turbo, GPT-4o, GPT-4-Turbo import json import openai from pathlib import Path import os client openai.OpenAI(base_urlbase_url, api_keyapi_key) file client.files.create( fileopen("H3.pdf", "rb"), purposeassistants ) …...

9. C++通过epoll+fork的方式实现高性能网络服务器

epollfork 实现高性能网络服务器 一般在服务器上&#xff0c;CPU是多核的&#xff0c;上述epoll实现方式只使用了其中的一个核&#xff0c;造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。 创建子进程函数–fork( ) 要了解线程我们先来了解…...

【Mac】XMind for mac(XMind思维导图)v24.04.10311软件介绍和安装教程

软件介绍 XMind for Mac是一款功能强大的思维导图软件。它具有以下主要特点&#xff1a; 1.多样化的思维导图功能&#xff1a;XMind for Mac提供了丰富的思维导图编辑功能&#xff0c;用户可以创建各种类型的思维导图&#xff0c;包括组织结构图、逻辑图、时间轴图等&#xf…...

使用 Django ORM 进行数据库操作

文章目录 创建Django项目和应用定义模型查询数据更新和删除数据总结与进阶聚合和注解跨模型查询原始SQL查询 Django是一个流行的Web应用程序框架&#xff0c;它提供了一个强大且易于使用的对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;用于与数据库进行交互。在本文…...

行为型设计模式之模板模式

文章目录 概述原理结构图实现 小结 概述 模板方法模式(template method pattern)原始定义是&#xff1a;在操作中定义算法的框架&#xff0c;将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法中的算法可以理解为广义上的业…...

大泽动力车载柴油发电机的特点和优势有哪些

大泽动力车载柴油发电机具有一系列显著的特点和优势&#xff0c;以下是对其的详细介绍&#xff1a; 低噪音性能&#xff1a;大泽动力车载柴油发电机具备明显的低噪音性能&#xff0c;其噪音限值在距离机组7米处测得为70dB(A)&#xff0c;这为用户提供了一个相对安静的工作环境…...

基于 IP 的 DDOS 攻击实验

一、介绍 基于IP的分布式拒绝服务&#xff08;Distributed Denial of Service, DDoS&#xff09;攻击是一种利用大量受控设备&#xff08;通常是僵尸网络&#xff09;向目标系统发送大量请求或数据包&#xff0c;以耗尽目标系统的资源&#xff0c;导致其无法正常提供服务的攻击…...

NVIDIA Profile Inspector终极指南:解锁显卡隐藏性能的700+高级设置

NVIDIA Profile Inspector终极指南&#xff1a;解锁显卡隐藏性能的700高级设置 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 作为一款开源显卡配置工具&#xff0c;NVIDIA Profile Inspector提供了直…...

Boss-Key终极指南:Windows一键隐藏窗口的完整解决方案

Boss-Key终极指南&#xff1a;Windows一键隐藏窗口的完整解决方案 【免费下载链接】Boss-Key 老板来了&#xff1f;快用Boss-Key老板键一键隐藏静音当前窗口&#xff01;上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 你是否曾在办公室突然需…...

LaserGRBL:5分钟掌握开源激光雕刻控制软件的核心功能

LaserGRBL&#xff1a;5分钟掌握开源激光雕刻控制软件的核心功能 【免费下载链接】LaserGRBL Laser optimized GUI for GRBL 项目地址: https://gitcode.com/gh_mirrors/la/LaserGRBL LaserGRBL是一款专为GRBL控制器优化的开源激光雕刻控制软件&#xff0c;为Windows用户…...

Wwise音频处理完整指南:从游戏音效解包到个性化替换的终极方案

Wwise音频处理完整指南&#xff1a;从游戏音效解包到个性化替换的终极方案 【免费下载链接】wwiseutil Tools for unpacking and modifying Wwise SoundBank and File Package files. 项目地址: https://gitcode.com/gh_mirrors/ww/wwiseutil 还在为游戏音频文件无法编辑…...

在微服务架构中统一接入Taotoken管理所有AI调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在微服务架构中统一接入Taotoken管理所有AI调用 当企业采用微服务架构时&#xff0c;AI能力的调用往往分散在各个独立的服务中。每…...

位图动画技术:用图片驱动NeoPixel灯光特效的嵌入式开发新思路

1. 项目概述与核心思路拆解如果你玩过像Adafruit Circuit Playground这样的开发板&#xff0c;肯定被它周围那一圈炫彩的NeoPixel LED灯珠吸引过。点亮它们很简单&#xff0c;但想做出一个流畅、复杂、带渐变或特定运动轨迹的动画&#xff0c;比如让灯光像水流一样旋转&#xf…...

3大核心优势:为什么GanttProject能让你秒懂项目管理

3大核心优势&#xff1a;为什么GanttProject能让你秒懂项目管理 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 你是否曾经面对复杂的项目计划感到无从下手&#xff1f;GanttProject这款免…...

构建工程化提示词库:提升AI开发效率与代码质量

1. 项目概述&#xff1a;一个面向开发者的提示词库如果你和我一样&#xff0c;在过去的几年里深度参与了AI应用开发&#xff0c;尤其是基于大语言模型&#xff08;LLM&#xff09;的各类项目&#xff0c;那你一定对“提示工程”这个词又爱又恨。爱的是&#xff0c;一段精心设计…...

STM32 HAL库实战:手把手教你用匿名上位机V7显示自定义波形(附完整驱动代码)

STM32 HAL库与匿名上位机V7深度整合&#xff1a;自定义波形显示实战指南 在嵌入式系统开发中&#xff0c;数据可视化是调试和性能分析的关键环节。匿名上位机V7作为一款功能强大的国产调试工具&#xff0c;以其灵活的协议支持和直观的波形显示功能&#xff0c;成为众多工程师的…...

给嵌入式工程师的保姆级ISP图像调试指南:从AE曝光到3DNR降噪的完整流程

嵌入式工程师的ISP图像调试实战手册&#xff1a;从曝光控制到降噪优化的全链路解析 当你第一次拿到一款全新的IPC摄像头模组时&#xff0c;是否曾被复杂的ISP参数搞得手足无措&#xff1f;作为嵌入式工程师&#xff0c;我们往往需要在资源受限的环境中实现专业级的图像质量。本…...