Linux-实现小型日志系统

目录

一.日志

二.实现任意个数元素求和

三.编写一个日志函数

1.设置日志等级

2.设置日志时间

3.设置日志的打印格式

4.将日志的内容输出到文件


一.日志

日志等级,日志时间,日志内容,文件的名称和行号

日志等级:

Info:常规消息

Warning:报警消息

Error:错误,可能需要立即处理

Fatal:致命的

Debug:调试

二.实现任意个数元素求和

使用可变参数要使用若干个宏定义,这些宏定义在:

cpp 复制代码
//使用可变参数时一定要有一个具体的参数
int Sum(int n, ...)
{
    //用来提取可变参数的一个个参数,其实本质上就是一个char*类型的指针变量
    va_list s;

    //只向可变参数的首地址,内部封装了s = &n + 1;
    va_start(s, n);

    //实现求和
    int sum = 0;
    while(n)
    {
        //根据类型提取参数
        va_arg(s, int);

        n--;
    }

    //s = NULL;
    va_end(s);

    return  sum;
}

主函数调用:

此时我们传入的可变参数都是相同的类型的,如果传入不同的类型的话,就要像printf一样做获取的字符串处理。

三.编写一个日志函数

**1.**设置日志等级
cpp 复制代码
#define Info    0
#define DeBug   1
#define Warning 2
#define Error   3
#define Fatal   4

//实现日志函数
void logmessage(int level, char* formatr, ...)
{
    
}
2.设置日志时间

a.Linux中获取时间戳的函数

b.Linux中转换时间戳的函数

会将得到的时间戳转换为以下形式: 因为年和月都是从0开始计的所以在打印的时候,需要加1900和1。

cpp 复制代码
void logmessage(int level, char* formatr, ...)
{
    //获取时间戳
    time_t t = 0;
    time(&t);

    //转换时间戳
    struct tm* ctime = NULL;
    ctime = localtime(&t);

    //打印获取到的时间
    printf("%d-%d-%d %d:%d:%d\n"
                        , ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday
                        , ctime->tm_hour, ctime->tm_min, ctime->tm_sec);

}
3.设置日志的打印格式

默认部分 + 自定义部分

cpp 复制代码
#define Info            0
#define DeBug           1
#define Warning         2
#define Error           3
#define Fatal           4
#define Log_buffer_SIZE 1024

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 logmessage(int level, char* format, ...)
{
    //获取日志的等级
    string level_str;
    level_str = levelToString(level);

    //获取时间戳
    time_t t = 0;
    time(&t);

    //转换时间戳
    struct tm* ctime = NULL;
    ctime = localtime(&t);

    // //打印获取到的时间
    // printf("%d-%d-%d %d:%d:%d\n"
    //                     , ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday
    //                     , ctime->tm_hour, ctime->tm_min, ctime->tm_sec);

    //整合日志的默认部分
    char leftbuffer[Log_buffer_SIZE];
    snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d] : " ,level_str.c_str()
                                                                          , ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday
                                                                          , ctime->tm_hour, ctime->tm_min, ctime->tm_sec);

    //整合自定义部分
    va_list s;
    va_start(s, format);
    char rightbuffer[Log_buffer_SIZE];
    vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);
    va_end(s);

    //整合默认部分和自定义部分
    char logtxt[Log_buffer_SIZE * 2];
    snprintf(logtxt, sizeof(logtxt), "%s%s\n", leftbuffer, rightbuffer);

    printf("%s", logtxt);
}
4.将日志的内容输出到文件
cpp 复制代码
#include <time.h>
#include <string>
#include <stdio.h>
#include <stdarg.h>
#include <iostream>
#include <cstdio>
#include <cerrno>
#include <cstring>
#include <fcntl.h>
#include <unistd.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

using namespace std;

#define Info 0
#define DeBug 1
#define Warning 2
#define Error 3
#define Fatal 4
#define Log_buffer_SIZE 1024

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";
    }
}

#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;
    }

    void printLog(int level, const string& logtxt)
    {
        switch (printMethod)
        {
        case Screen:
            cout << logtxt.c_str() << endl;
            break;
        case Onefile:
            printOneFile(LogFile, logtxt);
            break;
        case Classfile:
            printClassFile(level, logtxt);
            break;
        default:
            break;
        }
    }

    void printOneFile(const string &logname, const string &logtxt)
    {
        string _logname = path;
        _logname += 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 string &logtxt)
    {
        string filename = LogFile;
        filename += ".";
        filename += levelToString(level); // "log.txt.Debug/Warning/Fatal"

        printOneFile(filename, logtxt);
    }

    ~Log()
    {
    }

    //处理日志等级
    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 operator()(int level, char *format, ...)
    {
        // 获取日志的等级
        string level_str;
        level_str = levelToString(level);

        // 获取时间戳
        time_t t = 0;
        time(&t);

        // 转换时间戳
        struct tm *ctime = NULL;
        ctime = localtime(&t);

        // 整合日志的默认部分
        char leftbuffer[Log_buffer_SIZE];
        snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d] : ", level_str.c_str(), ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec);

        // 整合自定义部分
        va_list s;
        va_start(s, format);
        char rightbuffer[Log_buffer_SIZE];
        vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);
        va_end(s);

        // 整合默认部分和自定义部分
        char logtxt[Log_buffer_SIZE * 2];
        snprintf(logtxt, sizeof(logtxt), "%s%s\n", leftbuffer, rightbuffer);

        // printf("%s", logtxt);
        printLog(level, logtxt);
    }

private:
    int printMethod;

    string path;
};
相关推荐
程序员南飞1 小时前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
StrokeAce1 小时前
linux桌面软件(wps)内嵌到主窗口后的关闭问题
linux·c++·qt·wps·窗口内嵌
热爱嵌入式的小许5 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
韩楚风9 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学9 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO9 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu79 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我9 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、9 小时前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程9 小时前
Linux中环境变量
linux