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]; // 这里打印日志等级,时间  到leftguffer
        snprintf(leftbuffer, sizeof(leftbuffer), "[%s] [%s]", LevelToString(level).c_str(), localTime().c_str());
        
        char rightbuffer[1024];  // 这里打印输入参数的内容  到rightbuffer
        va_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
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UMG绝对坐标与局部空间

在 Unreal Engine 的 UMG&#xff08;Unreal Motion Graphics&#xff09;中&#xff0c;“绝对坐标”和“局部空间”是两个常见的概念&#xff0c;主要用于描述 UI 元素的位置和大小。 概念与区别 绝对坐标&#xff08;Absolute Coordinates&#xff09;&#xff1a;这是指相…

LeetCode1137第N个泰波那契数

题目描述 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 解析 递归应该会超时&#xff0c;可以用循环&#xff0c;或者官方解法的矩阵的幂。 public int tr…

索尼CEO宣布全力推进AI电影制作,《蜘蛛侠》制片人坚称不用AI

原标题&#xff1a;索尼互娱制片人与CEO唱反调 易采游戏网6月3日消息&#xff1a;在最近的一次行业会议上&#xff0c;索尼影业高层首席执行官托尼文西奎拉向媒体透露&#xff0c;索尼正在全力推进人工智能(AI)技术的研发与应用&#xff0c;特别是在电影制作流程中。这一策略旨…

彩光大放异彩!《智慧园区以太全光网络建设技术规程》应用案例征集活动结果公布

近日,中国建筑业协会绿色建造与智能建筑分会正式公布了《智慧园区以太全光网络建设技术规程》应用案例征集活动的结果。本次活动旨在推广和应用该规程,进一步推动智慧园区的数字化、智慧化、绿色化建设。众多优秀项目在征集活动中脱颖而出,展示了规程在实际应用中的显著成效。评…

数据结构--关键路径

事件v1-表示整个工程开始&#xff08;源点&#xff1a;入度为0的顶点&#xff09; 事件v9-表示整个工程结束&#xff08;汇点&#xff1a;出度为0的顶点&#xff09; 关键路径&#xff1a;路径长度最长的路径 求解关键路径问题&#xff08;AOE网&#xff09; 定义四个描述量 …

数青蛙 ---- 模拟

题目链接 题目: 分析: 题目的意思是: 一次蛙鸣是一个完整的字符串"croak", 给你一个字符串, 让你求出最少的青蛙数目 示例一: 两次完整的"croak", 可以由一只青蛙完成, 所以答案为1 示例二: 第一次蛙鸣还没有结束, 又出现了"c", 说明有第二只青…

迪丽热巴与大姐的璀璨友情

迪丽热巴与“大姐”的璀璨友情&#xff1a;星光熠熠&#xff0c;友谊长存在娱乐圈的繁华舞台上&#xff0c;有两位耀眼的女星&#xff0c;她们如同夜空中亮的两颗星&#xff0c;交相辉映&#xff0c;共同谱写着一段段动人的佳话。她们&#xff0c;一个是被亲切称为“迪迪”的迪…

03_初识Spring Cloud Gateway

文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念&#xff1a;路由&#xff08;Route&#xff09;2.2 核心概念&#xff1a;断言&#xff08;Predicate&#xff09;2.3 核心概念&#…

【算法训练记录——Day24】

Day24——回溯算法Ⅰ 77.组合 今日内容&#xff1a; ● 理论基础 ● 77. 组合 理论&#xff1a;代码随想录 77.组合 思路&#xff1a;k层for循环&#xff0c;不会 回溯&#xff0c;将组合问题抽象成n叉树&#xff0c;for循环控制宽度&#xff0c;递归的深度控制二叉树的深度 …

云原生架构案例分析_3.某快递公司核心业务系统云原生改造

名称解释&#xff1a; 阿里云ACK&#xff1a;阿里云容器服务 Kubernetes 版 ACK&#xff08;Container Service for Kubernetes&#xff09;集成Kubernetes网络、阿里云VPC、阿里云SLB&#xff0c;提供稳定高性能的容器网络。本文介绍ACK集群网络及阿里云网络底层基础设施的重要…

抄袭瓜!斯坦福作者已删库跑路!面壁和刘知远老师的最新回应

好家伙&#xff0c;AI大模型圈爆料不断&#xff0c;没想到今天最猛的料还是抄袭的瓜啊。 5月29日&#xff0c;一个斯坦福团队高调宣称&#xff0c;只需要500美元&#xff0c;就可以通过他们的新产品&#xff1a;Llama3-v &#xff0c;就可以通过Llama3&#xff0c;训练出一个全…

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites&#xff0c;通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中&#xff0c;再利用css“background-image”&#xff0c; “background-repeat”,“background-position”的组…

C++命名空间(详解)

C基础语法 C基于C语言的改进&#xff1a;c在C语言的基础上引入并扩充了面向对象的概念 C基础概念&#xff1a;C是基于C语言而产生的,它即可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计 在1998年 出现C98…

文件同步软件,PanguFlow局域网横着走

说到文件同步&#xff0c;它对企业来说及其重要&#xff0c;因为有了文件同步&#xff0c;这个文件数据它才能备份起来&#xff0c;才能用来抵抗自然灾害&#xff0c;比如服务器硬盘损坏了&#xff0c;你要是不备份&#xff0c;这损失可就大了&#xff0c;一款合适的文件同步软…

外星人Alienware X15R1 原厂Windows10系统 oem系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

第三方模块的下载与安装

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在进行Python程序开发时&#xff0c;除了可以使用Python内置的标准模块外&#xff0c;还有很多第三方模块可以被我们所使用。对于这些第三方模块&…

欧佩克+同意集体性减产延长,油价能否稳住?

KlipC报道&#xff1a;欧佩克组织同意将延长目前部分减产协议至2025年&#xff0c;以支撑油价。主要成员国把2023年11月宣布的日均220万桶的自愿减产措施延长至今年9月底&#xff0c;将在10月份根据市场情况开始缩减自愿减产规模。 高盛分析师表示&#xff0c;“我们认为这次欧…

成功案例(IF=12.2)| 肠道代谢组、微生物组和脑功能的综合分析揭示了肠-脑轴在长寿中的作用

研究背景 人类长寿是一种受遗传、环境等多种因素影响的复杂表型。近年来&#xff0c;肠道微生物群被认为是长寿的一个重要因素&#xff0c;如Akkermansia、Alisipes和Parabacteroides已被报道与长寿有关。此外&#xff0c;最近的一项研究表明&#xff0c;百岁老人的肠道微生物群…

【前端】政务服务大数据可视化监控平台(源码+html+css+js)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

以主程序的形式执行

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 这里先来创建一个模块&#xff0c;名称为christmastree&#xff0c;该模块的内容为第6章中编写的实例05的代码。在该段代码中&#xff0c;首先定义一…