古月不傲 发表于 2020-12-31 06:35

打印日志

本帖最后由 古月不傲 于 2020-12-31 15:33 编辑

#ifndef __WIND_LOG_H__
#define __WIND_LOG_H__

#include <iostream>
#include <cstdarg>
#include <cstring>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>

// 日志相关
namespace wind_log
{
#define wind_cpymem(dst, src, n) (((char *) memcpy(dst, src, n)) + (n))
#define LOG_MAX_ERR_SIZE 1024

        class CLog
        {
                public:
                        CLog() = default;
                        CLog(const CLog &) = delete;
                        CLog &operator =(const CLog &) = delete;

                public:
                        ~CLog()
                        {
                        }

                        static CLog &get_instance()
                        {
                                static CLog obj;
                                return obj;
                        }

                        inline void open_fd()
                        {
                                this->m_fdLog = open("log.txt",O_CREAT | O_WRONLY | O_APPEND, 0644);
                        }

                        inline void close_fd()
                        {
                                close(this->m_fdLog);
                                this->m_fdLog = -1;
                        }

                        void write_log(const char *fmt, ...)
                        {
                                if (fmt == nullptr)
                                        return;

                                char                         errBuf{};
                                char                         strTime{};
                                char                         argsBuf{};
                                char *                        pTemp;
                                struct timevaltv;                         // 时间
                                struct tm                 stTime;                // 时间格式
                                time_t                         seconds;
                                va_list                 args;

                                // 获取经过的时间
                                gettimeofday(&tv, nullptr);
                                seconds = tv.tv_sec;

                                // 把经过的时间转化为本地时间
                                localtime_r(&seconds, &stTime);
                                stTime.tm_mon++;
                                stTime.tm_year += 1900;

                                // 格式化时间
                                sprintf(strTime,
                                                "[%4d/%02d/%02d %02d:%02d:%02d]        ",
                                                stTime.tm_year, stTime.tm_mon,
                                                stTime.tm_mday, stTime.tm_hour,
                                                stTime.tm_min,stTime.tm_sec);

                                va_start(args, fmt);
                                pTemp = wind_cpymem(errBuf, strTime, strlen(strTime));
                                // va_list格式化函数
                                vsprintf(argsBuf, fmt, args);
                                pTemp = wind_cpymem(pTemp, argsBuf, strlen(argsBuf));
                                va_end(args);

                                // 如果没有写 \n的情况
                                if (*--pTemp != '\n')
                                        // 这里不可以pTemp++ 要先++
                                        wind_cpymem(++pTemp, "\n", 1);

                                // 由于上面判断了,所以要跳过 \n
                                pTemp++;
                                write(this->m_fdLog, errBuf, pTemp - errBuf);
                        }
                private:
                        int m_fdLog = -1;
        };
}

#endif

wouimk 发表于 2020-12-31 09:55

谢谢分享,支持原创,局域网的其它计算机使用本机打印机 有记录吗

斗地主专用 发表于 2020-12-31 14:43

开源版本的ilog,日志管理比较方便
页: [1]
查看完整版本: 打印日志