马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
重要看code
日志:
日志指标/属性
设计模式:策略模式
日志格式:
- [可读性很好的时间] [⽇志等级] [进程pid] [打印对应⽇志的⽂件名][⾏号] - 消息内容,⽀持可
- 变参数
- [2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [16] - hello world
- [2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [17] - hello world
- [2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [18] - hello world
复制代码
code
完整详细代码:https://gitee.com/whb-helloworld/112/blob/master/code/lesson32/
Log
log.hpp
- #pragma once
- #include <iostream>
- #include <cstdio>
- #include <string>
- #include <fstream>
- #include <sstream>
- #include <memory>
- #include <filesystem> //C++17
- #include <unistd.h>
- #include <time.h>
- #include "Mutex.hpp"
- namespace LogMudule
- {
- using namespace LockModule;
- // 获取一下当前系统的时间
- std::string CurrentTime()
- {
- time_t time_stamp = ::time(nullptr);
- struct tm curr;
- localtime_r(&time_stamp, &curr); // 时间戳,获取可读性较强的时间信息5
- char buffer[1024];
- // bug
- snprintf(buffer, sizeof(buffer), "%4d-%02d-%02d %02d:%02d:%02d",
- curr.tm_year + 1900,
- curr.tm_mon + 1,
- curr.tm_mday,
- curr.tm_hour,
- curr.tm_min,
- curr.tm_sec);
- return buffer;
- }
- // 构成: 1. 构建日志字符串 2. 刷新落盘(screen, file)
- // 1. 日志文件的默认路径和文件名
- const std::string defaultlogpath = "./log/";
- const std::string defaultlogname = "log.txt";
- // 2. 日志等级
- enum class LogLevel
- {
- DEBUG = 1,
- INFO,
- WARNING,
- ERROR,
- FATAL
- };
- std::string Level2String(LogLevel level)
- {
- switch (level)
- {
- case LogLevel::DEBUG:
- return "DEBUG";
- case LogLevel::INFO:
- return "INFO";
- case LogLevel::WARNING:
- return "WARNING";
- case LogLevel::ERROR:
- return "ERROR";
- case LogLevel::FATAL:
- return "FATAL";
- default:
- return "None";
- }
- }
- // 3. 刷新策略.
- class LogStrategy
- {
- public:
- virtual ~LogStrategy() = default;
- virtual void SyncLog(const std::string &message) = 0;
- };
- // 3.1 控制台策略
- class ConsoleLogStrategy : public LogStrategy
- {
- public:
- ConsoleLogStrategy()
- {
- }
- ~ConsoleLogStrategy()
- {
- }
- void SyncLog(const std::string &message)
- {
- LockGuard lockguard(_lock);
- std::cout << message << std::endl;
- }
- private:
- Mutex _lock;
- };
- // 3.2 文件级(磁盘)策略
- class FileLogStrategy : public LogStrategy
- {
- public:
- FileLogStrategy(const std::string &logpath = defaultlogpath, const std::string &logname = defaultlogname)
- : _logpath(logpath),
- _logname(logname)
- {
- // 确认_logpath是存在的.
- LockGuard lockguard(_lock);
- if (std::filesystem::exists(_logpath))
- {
- return;
- }
- try
- {
- std::filesystem::create_directories(_logpath);
- }
- catch (std::filesystem::filesystem_error &e)
- {
- std::cerr << e.what() << "\n";
- }
- }
- ~FileLogStrategy()
- {
- }
- void SyncLog(const std::string &message)
- {
- LockGuard lockguard(_lock);
- std::string log = _logpath + _logname; // ./log/log.txt
- std::ofstream out(log, std::ios::app); // 日志写入,一定是追加
- if (!out.is_open())
- {
- return;
- }
- out << message << "\n";
- out.close();
- }
- private:
- std::string _logpath;
- std::string _logname;
- // 锁
- Mutex _lock;
- };
- // 日志类: 构建日志字符串, 根据策略,进行刷新
- class Logger
- {
- public:
- Logger()
- {
- // 默认采用ConsoleLogStrategy策略
- _strategy = std::make_shared<ConsoleLogStrategy>();
- }
- void EnableConsoleLog()
- {
- _strategy = std::make_shared<ConsoleLogStrategy>();
- }
- void EnableFileLog()
- {
- _strategy = std::make_shared<FileLogStrategy>();
- }
- ~Logger() {}
- // 一条完整的信息: [2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [16] + 日志的可变部分(<< "hello world" << 3.14 << a << b;)
- class LogMessage
- {
- public:
- LogMessage(LogLevel level, const std::string &filename, int line, Logger &logger)
- : _currtime(CurrentTime()),
- _level(level),
- _pid(::getpid()),
- _filename(filename),
- _line(line),
- _logger(logger)
- {
- std::stringstream ssbuffer;
- ssbuffer << "[" << _currtime << "] "
- << "[" << Level2String(_level) << "] "
- << "[" << _pid << "] "
- << "[" << _filename << "] "
- << "[" << _line << "] - ";
- _loginfo = ssbuffer.str();
- }
- template <typename T>
- LogMessage &operator<<(const T &info)
- {
- std::stringstream ss;
- ss << info;
- _loginfo += ss.str();
- return *this;
- }
- ~LogMessage()
- {
- if (_logger._strategy)
- {
- _logger._strategy->SyncLog(_loginfo);
- }
- }
- private:
- std::string _currtime; // 当前日志的时间
- LogLevel _level; // 日志等级
- pid_t _pid; // 进程pid
- std::string _filename; // 源文件名称
- int _line; // 日志所在的行号
- Logger &_logger; // 负责根据不同的策略进行刷新
- std::string _loginfo; // 一条完整的日志记录
- };
- // 就是要拷贝,故意的拷贝
- LogMessage operator()(LogLevel level, const std::string &filename, int line)
- {
- return LogMessage(level, filename, line, *this);
- }
- private:
- std::shared_ptr<LogStrategy> _strategy; // 日志刷新的策略方案
- };
- Logger logger;
- #define LOG(Level) logger(Level, __FILE__, __LINE__)
- #define ENABLE_CONSOLE_LOG() logger.EnableConsoleLog()
- #define ENABLE_FILE_LOG() logger.EnableFileLog()
- }
复制代码 Main.cc
- #include "Log.hpp"
- using namespace LogMudule;
- int main()
- {
- ENABLE_FILE_LOG();
- LOG(LogLevel::DEBUG) << "hello file";
- LOG(LogLevel::DEBUG) << "hello file";
- LOG(LogLevel::DEBUG) << "hello file";
- LOG(LogLevel::DEBUG) << "hello file";
- ENABLE_CONSOLE_LOG();
- LOG(LogLevel::DEBUG) << "hello world";
- LOG(LogLevel::DEBUG) << "hello world";
- LOG(LogLevel::DEBUG) << "hello world";
- LOG(LogLevel::DEBUG) << "hello world";
- return 0;
- }
复制代码 ThreadPool
threadpool.hpp
threadpood.cc
- #include "ThreadPool.hpp"
- #include "Task.hpp"
- #include <memory>
- using namespace ThreadPoolModule;
- int main()
- {
- ENABLE_CONSOLE_LOG();
- // ENABLE_FILE_LOG();
- std::unique_ptr<ThreadPool<task_t>> tp = std::make_unique<ThreadPool<task_t>>();
- tp->Start();
- int cnt = 10;
- char c;
- while (true)
- {
- std::cin >> c;
- tp->Equeue(Push);
- // cnt--;
- // sleep(1);
- }
- tp->Stop();
- sleep(3);
- tp->Wait();
- return 0;
- }
复制代码 task.hpp
- #pragma once
- #include <iostream>
- #include <string>
- #include <functional>
- #include "Log.hpp"
- using namespace LogMudule;
- using task_t = std::function<void(std::string name)>;
- void Push(std::string name)
- {
- LOG(LogLevel::DEBUG) << "我是一个推送数据到服务器的一个任务, 我正在被执行" << "[" << name << "]";
- }
复制代码 sigThreadPool
threadpool.hpp
threadpool.cc
- #include "ThreadPool.hpp"
- #include "Task.hpp"
- #include <memory>
- using namespace ThreadPoolModule;
- int main()
- {
- ENABLE_CONSOLE_LOG();
- ThreadPool<task_t>::getInstance()->Start();
- char c;
- int cnt = 5;
- while (cnt)
- {
- // std::cin >> c;
- ThreadPool<task_t>::getInstance()->Equeue(Push);
- cnt--;
- sleep(1);
- }
- ThreadPool<task_t>::getInstance()->Stop();
- ThreadPool<task_t>::getInstance()->Wait();
- // ENABLE_FILE_LOG();
- // std::unique_ptr<ThreadPool<task_t>> tp = std::make_unique<ThreadPool<task_t>>();
- // tp->Start();
- // int cnt = 10;
- // char c;
- // while (true)
- // {
- // std::cin >> c;
- // tp->Equeue(Push);
- // // cnt--;
- // // sleep(1);
- // }
- // tp->Stop();
- // sleep(3);
- // tp->Wait();
- return 0;
- }
复制代码
板书笔记
险些没有,就不展示了
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |