【Linux】记录错误信息日志的实现

这篇具有很好参考价值的文章主要介绍了【Linux】记录错误信息日志的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

linux打印错误日志,linux,运维,服务器

我们这个设计的日志可以自定以输出的方向,可以向显示器打印错误信息,也可以向指定目录写入,或者是分类写入

一、 目录实现(log.hpp)

#pragma once

#include <iostream>
#include <time.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

#define SIZE 1024

//对错误等级进行分级
#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4

//将错误信息打入到什么位置
#define Screen 1
#define Onefile 2
#define Classfile 3

//存储错误信息的文件默认名字
#define LogFile "log.txt"
using namespace std;


class Log{
public:
Log(){
    //默认打印方式往显示屏
    //规定好默认路径
    printMethod=Screen;
    path="./log/";
}


//自己改变默认答应方式
void Enable(int method){
    printMethod=method;
}


//将错误等级转换为字符串的形式
string levelTostring(int level){
    switch(level){
        case Info:
            return "Info";
        case Debug:
            return "Debuf";
        case Warning:
            return "Warning";
        case Error:
            return "Error";
        case Fatal:
            return "Fatal";
        default:
            return "None";
    }
}


//根据传出的信息,生成字符串logtxt,这个字符串中就是错误信息

void operator()(int level, const char *format, ...)
    {
        //报错信息 格式:默认部分+自定义部分
        time_t t = time(nullptr);
        struct tm *ctime = localtime(&t);
        char leftbuffer[SIZE];
        snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d]", levelTostring(level).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);
        //leftbuffer为获取的报错时间字符串,为默认部分

        //rightbuffer为我们的自定义部分
        char rightbuffer[SIZE];
        vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);
        va_end(s);

         
         //将leftbuffer 与rightbuffer合并成字符串logtxt
         //这就是我们的报错的错误信息
        char logtxt[SIZE * 2];
        snprintf(logtxt, sizeof(logtxt), "%s %s\n", leftbuffer, rightbuffer);

        
        //将错误信息按指定方式打印到指定地方
        printLog(level, logtxt);
    }

//将错误信息按指定方式打印到指定地方
void printLog(int level,const string &logtxt){
    switch(printMethod){
        case Screen://打印到屏幕
            cout<<logtxt<<endl;
        case Onefile://打印到一个文件
            printOnefile(LogFile,logtxt);
            break;
        case Classfile://分错误信息打印到不同文件
            printClassfile(level,logtxt);
            break;
        default :
            break;
    }
}



void printOnefile(const string logname,const string logtxt){
    // printOnefile(LogFile,logtxt);
    string _logname=path+logname;  // ./log/log.txt
    int fd=open(_logname.c_str(),O_WRONLY|O_CREAT|O_APPEND,0666);
    if(fd<0)
        return;
    write(fd,logtxt.c_str(),logtxt.size());
    close(fd);
}

void printClassfile(int level,const string logtxt){
    // printClassfile(level,logtxt);
    string filename=LogFile;
    filename+=".";
    filename+=levelTostring(level);
    //  log.txt. (string)level

    //设置好文件名字后,再用单文件的打印方式写入文件
    printOnefile(filename,logtxt);
}

private:
int printMethod;//打印方法
string path;//打印路径
};

二、目录的具体使用

这里我们以命名管道之间两个进程传递信息为场景使用这个日志功能文章来源地址https://www.toymoban.com/news/detail-752920.html

1.comm.hpp(管道初始化)

 #pragma once
 #include<iostream>
 #include<string>
 #include<sys/types.h>
 #include<sys/stat.h>
#include<unistd.h>
#include<cerrno>
#include<string.h>
#include<fcntl.h>

//命名管道的名字与路径
 #define FIFO_FILE "./myfifo"
 #define MODE 0664

//返回的错误码
 enum{
    FIFO_CREAT_ERR=1,
    FIFO_DELETE_ERR,
    FIFO_OPEN_ERR
 };

//采用Init类,类似智能指针,我们在析构函数中调用删除命名管道的函数
//程序结束会自动调用析构函数
class Init{
public:
    Init(){
        int n=mkfifo(FIFO_FILE,MODE);
        if(n==-1){
            perror("mkfifo");
            exit(FIFO_CREAT_ERR);
        }

    }

    ~Init(){
        int m=unlink(FIFO_FILE);
        if(m==-1)
        {
            perror("unlink");
            exit(FIFO_DELETE_ERR);
        }
    }


};

2.sever.cpp(为读端且令其创建命名管道)

#include "comm.hpp"
#include "log.hpp"

using namespace std;

// 管理管道文件
int main()
{
    Init init;//创建命名管道
    Log log;
    
    log.Enable(Onefile);//重定向错误信息打入位置

    // 打开管道
    int fd = open(FIFO_FILE, O_RDONLY);  
    if (fd < 0)
    {
        //如果有错就打印错误信息
        log(Fatal, "error string: %s, error code: %d", strerror(errno), errno);
        exit(FIFO_OPEN_ERR);
    }

    log(Info, "server open file done, error string: %s, error code: %d", strerror(errno), errno);
    log(Warning, "server open file done, error string: %s, error code: %d", strerror(errno), errno);
    log(Fatal, "server open file done, error string: %s, error code: %d", strerror(errno), errno);
    log(Debug, "server open file done, error string: %s, error code: %d", strerror(errno), errno);


    // 开始通信
    while (true)
    {
        char buffer[1024] = {0};
        int x = read(fd, buffer, sizeof(buffer));
        if (x > 0)
        {
            buffer[x] = 0;
            cout << "client say# " << buffer << endl;
        }
        else if (x == 0)
        {
            log(Debug, "client quit, me too!, error string: %s, error code: %d", strerror(errno), errno);
            break;
        }
        else
            break;
    }

    close(fd);
    return 0;
}

3.client.cpp(为写端)

 #include <iostream>
#include "comm.hpp"

using namespace std;

int main()
{
    int fd = open(FIFO_FILE, O_WRONLY);//打开管道
    if(fd < 0)
    {
        perror("open");
        exit(FIFO_OPEN_ERR);
    }

    cout << "client open file done" << endl;

    string line;
    while(true)
    {
        cout << "Please Enter@ ";
        getline(cin, line);//因为可能有空格,cin不读入空格

        write(fd, line.c_str(), line.size());
    }

    close(fd);
    return 0;
}

到了这里,关于【Linux】记录错误信息日志的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux重装系统步骤 包含raid【主要针对服务器重装】,腾讯Linux运维开发面试记录

    8 、查看网关主机名: cat /etc/sysconfig/network 9 、查看单条网卡信息: ethtool 物理网卡名 比如有很多网卡 ,不知道 使用哪个网卡的时候,就用这个方法。 (万兆网Link为yes就是使用的网卡) ​​ 10、查看cpu内存 查看cpu 最简单方法:输入 top 后按 1 即可查看。 查看CPU信息(型号

    2024年04月12日
    浏览(43)
  • 查看linux ssh登陆日志记录

    要查看Linux用户是使用密钥登录还是密码登录,可以通过检查系统日志文件来获取相关信息。在CentOS 7系统中,系统日志通常存储在/var/log目录下,主要包括secure日志文件。 以下是通过查看secure日志文件来确定用户是使用密钥登录还是密码登录的步骤: 打开终端或SSH连接到C

    2024年02月13日
    浏览(71)
  • linux系统重启 查看相关日志和历史记录

    last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名,而且还可以列出指定日期和时间登录的用户。输出到终端的每一行都包括用户名、会话终端、主机名、会话开始和结束的时间、会话持续的时间. 使用 last 命令来查询最近登录到系统的用户和系

    2024年02月13日
    浏览(50)
  • python中如何打印日志信息

    日志打印方式 常见的Python日志打印方式为使用内置函数 print() 或者 logging 模块打印日志。 print() 只能将日志打印至控制台,不推荐此方式 logging 模块默认将日志打印至控制台,也可以配置打印到指定日志文件,推荐使用此方式 logging模块 日志等级 logging提供了函数来做日志处

    2024年02月06日
    浏览(49)
  • 【移植Ardupilot的日志记录方法到linux上】

    采用二进制文件记录,可在mission planer查看 支持所有数据类型记录 精巧移植方便 可直接在地面站绘制曲线查看 可导出生成mat文件在matlab上分析 提供的日志目标结构 日志头 日志消息类型 消息长度 日志消息名称 数据类型标识 数据标签 数据单位 数据格式 数据结构体定义:

    2024年02月01日
    浏览(52)
  • Mybatis-Plus详解(新建maven项目、查询所有信息、打印SQL日志、实现CRUD(增删改查)、分页、条件查询且分页,前后端分离式开发)

    MyBatis-Plus(opens new window) (简称MP) 是一个MyBatis(opens new window)的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。想查看官网相关内容的化我这里提供了官网地址:https://baomidou.com/ 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般

    2024年02月04日
    浏览(63)
  • 运维记录 会产生无用日志的服务器

    创建linux定时任务 crontab -e cron表达式 文件名.sh 查看linux定时任务 crontab -l 确认创建完成后重启cron service crond restart

    2024年04月11日
    浏览(39)
  • Linux 更加优雅地运行 JAR 文件,并将日志文件输出到本地目录,并优雅的查看日志文件信息

    方式一:直接运行jar包,最常用的启动jar包命令,特点:当前ssh窗口被锁定,CTRL + C或关闭窗口,将打断程序运行,程序退出 方式二:代表在后台运行 ,CTRL + C后程序不会被终止,关闭SSH客户端连接,将终止程序 使用 nohup 命令将进程放入后台运行,并使用 符号使命令立即返

    2024年02月16日
    浏览(41)
  • Linux系统的历史记录添加时间和IP信息

    对于linux系统,默认情况下,系统记录的历史命令比较简单。某些历史记录可能也无法正常保存,因此当服务器出现异常,希望通过历史命令来了解曾经做了哪些操作时,往往非常被动,下面就给大家介绍如何通过系统内置的变量来优化历史记录,使得查看历史记录更加方便

    2024年02月19日
    浏览(42)
  • MySql运维篇---008:日志:错误日志、二进制日志、查询日志、慢查询日志,主从复制:概述 虚拟机更改ip注意事项、原理、搭建步骤

    错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中 发生任何严重错误时的相关信息 。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认存放目录 /var/log/,默认的日志文件名为 mysq

    2024年02月04日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包