当前位置: 首页 > news >正文

网站建设等级定级企业网站快速排名

网站建设等级定级,企业网站快速排名,wordpress meta slider,程序员开发软件被拿去违法Rpc异步日志模块作用 在一个大型分布式系统中,任何部署的分布式节点都可能发生崩溃,试想如果用普通的办法,即先排查哪个节点down掉了,找到down掉的节点后采取调试工具gdb调试该节点,进而排查宕机的原因。这中排查方法…

Rpc异步日志模块作用

在一个大型分布式系统中,任何部署的分布式节点都可能发生崩溃,试想如果用普通的办法,即先排查哪个节点down掉了,找到down掉的节点后采取调试工具gdb调试该节点,进而排查宕机的原因。这中排查方法对于人力物力都是无法接受的。
那么由此记录日志就变得至关重要,分布式RPC框架必定存在一个异步日志模块,用于记录所有分布式站点的调试信息。通过日志分析就能很容易排查出哪个节点出了问题

Rpc异步日志模块实现思路

一个日志模块必须是异步的,不能影响主程序的运行,例如在RPC框架中显然不能阻塞了RPCProvider(服务提供者)和RPCConsumer(服务调用者)的运行
RPCProvider是一个能接受高并发rpc请求的高性能服务器(epoll+多线程),那么存在多个线程同时写日志的情况,这里的“写日志”并不是真正意义上的写磁盘文件的操作,因为磁盘IO会严重拖累该线程原本执行的其他任务。所以这里的写日志 只是多个线程将日志写入一个异步缓冲队列(这个操作是在内存进行的非常快),并且这个队列必须是线程安全的。
此外,应该另起一个线程来读取队列里面的日志数据进行真正的磁盘写文件操作,这样写日志线程是单独工作的,它只是依赖于异步缓冲队列里面的数据,不会影响RPC服务线程和其他IO线程。
在这里插入图片描述

Rpc异步日志模块实现

下面提供一个简单版本的实现
异步缓冲队列类:

#pragma once#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>//异步写日志的日志队列
template<typename T>
class LockQueue
{public://多个work线程都会写日志queuevoid Push(const T& data){std::lock_guard<std::mutex> lock(m_mutex);m_queue.push(data);m_condvariable.notify_one();}//一个线程读日志queue,写日志文件T Pop(){std::unique_lock<std::mutex> lock(m_mutex);while(m_queue .empty()){//日志队列为空, 线程进入wait状态m_condvariable.wait(lock);}T data = m_queue.front();m_queue.pop();return data;}
private:std::queue<T> m_queue;std::mutex m_mutex;std::condition_variable m_condvariable;};

Logger.h类:

#pragma once#include "lockqueue.h"
#include <utility>//日志级别
enum LogLevel{INFO = 1, //普通信息ERROR  //错误信息
};//Mprpc框架提供的日志系统
class Logger
{
public://获取日志的单例static Logger& GetInstance();//写日志void Log(std::pair<LogLevel,std::string> msg);private:LockQueue<std::pair<LogLevel,std::string>> m_lckQue; //日志缓冲队列Logger();Logger(const Logger&) = delete;Logger(Logger&& ) = delete;Logger& operator=(const Logger&) = delete;
};//定义宏  LOG_XXX("xxx %d %s", 20, "sdasd");
#define LOG_INFO(logmsgformat, ...) \do \{ \Logger &logger = Logger::GetInstance(); \char c[1024] = {0};           \snprintf(c, 1024, logmsgformat, ##__VA_ARGS__); \std::pair<LogLevel,std::string> pr = std::make_pair(INFO, std::string(c)); \logger.Log(pr); \} while (0);#define LOG_ERR(logmsgformat, ...) \
do \
{ \Logger &logger = Logger::GetInstance(); \char c[1024] = {0};           \snprintf(c, 1024, logmsgformat, ##__VA_ARGS__); \std::pair<LogLevel,std::string> pr = std::make_pair(ERROR, std::string(c)); \logger.Log(pr); \
} while (0);

Logger.cc

#include "logger.h"
#include <time.h>
#include <iostream>//获取日志的单例
Logger& Logger::GetInstance()
{static Logger logger;return logger;
}Logger::Logger()
{//启动专门的写日志线程std::thread writeLogTask([&](){for(;;){//获取当前的日期,然后取日志信息,写入相应的日志文件当中 a+time_t now = time(nullptr);tm *nowtm = localtime(&now);char file_name[128];sprintf(file_name, "%d-%d-%d-log.txt", nowtm->tm_year + 1900, nowtm->tm_mon + 1, nowtm->tm_mday);FILE* pf = fopen(file_name, "a+");if(pf == nullptr){std::cout<<"logger file:" << file_name <<"open error" << std::endl;exit(EXIT_FAILURE);}std::pair<LogLevel,std::string> msg = m_lckQue.Pop();char time_buf[128] = {0};sprintf(time_buf, "%d-%d-%d => [%s]", nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec,(msg.first == INFO ? "info" : "error"));msg.second.insert(0, time_buf);msg.second.append("\n");fputs(msg.second.c_str(), pf);fclose(pf); }});//设置分离线程, 守护线程writeLogTask.detach();}//写日志,把日志信息写入到lockqueue缓冲区当中
void Logger::Log(std::pair<LogLevel,std::string> msg)
{m_lckQue.Push(msg);
}

使用:

...
LOG_INFO("NotifyService UserService success");
LOG_ERR("eeeeeerrror%d", 9999999);
LOG_INFO("NotifyService GetFriendListService success");
...查看日志文件:cat 2023-8-2-log.txt 
21-35-26 => [info]NotifyService UserService success
21-35-26 => [error]eeeeeerrror9999999
21-35-26 => [info]NotifyService GetFriendListService success

文章转载自:
http://distillation.c7500.cn
http://marsha.c7500.cn
http://americanism.c7500.cn
http://standaway.c7500.cn
http://uncongeal.c7500.cn
http://burse.c7500.cn
http://teleost.c7500.cn
http://seminomad.c7500.cn
http://crumple.c7500.cn
http://unartificial.c7500.cn
http://rafvr.c7500.cn
http://sixain.c7500.cn
http://wombat.c7500.cn
http://nls.c7500.cn
http://bantamweight.c7500.cn
http://phreatic.c7500.cn
http://kenyon.c7500.cn
http://rollcall.c7500.cn
http://fishfall.c7500.cn
http://caracul.c7500.cn
http://sorus.c7500.cn
http://byssinosis.c7500.cn
http://expostulatingly.c7500.cn
http://letitia.c7500.cn
http://frivol.c7500.cn
http://paracystitis.c7500.cn
http://shem.c7500.cn
http://exultancy.c7500.cn
http://utilise.c7500.cn
http://sneaking.c7500.cn
http://knut.c7500.cn
http://retentivity.c7500.cn
http://mesomorphy.c7500.cn
http://cistus.c7500.cn
http://raggee.c7500.cn
http://airmail.c7500.cn
http://travesty.c7500.cn
http://oldish.c7500.cn
http://vibratile.c7500.cn
http://mapping.c7500.cn
http://recut.c7500.cn
http://leveler.c7500.cn
http://gansu.c7500.cn
http://grammarian.c7500.cn
http://mothering.c7500.cn
http://plenishing.c7500.cn
http://abm.c7500.cn
http://vanadous.c7500.cn
http://hydrostatic.c7500.cn
http://instructively.c7500.cn
http://umbrageously.c7500.cn
http://terseness.c7500.cn
http://ecotypic.c7500.cn
http://krakatoa.c7500.cn
http://uplift.c7500.cn
http://curiously.c7500.cn
http://chlorinous.c7500.cn
http://artificialness.c7500.cn
http://jobation.c7500.cn
http://mouthy.c7500.cn
http://modular.c7500.cn
http://huayco.c7500.cn
http://kleptomania.c7500.cn
http://gunship.c7500.cn
http://machisma.c7500.cn
http://cancerogenic.c7500.cn
http://gaba.c7500.cn
http://warrant.c7500.cn
http://boorish.c7500.cn
http://levitative.c7500.cn
http://sapling.c7500.cn
http://waggle.c7500.cn
http://granite.c7500.cn
http://keratosulphate.c7500.cn
http://endive.c7500.cn
http://glisteningly.c7500.cn
http://odorimeter.c7500.cn
http://shillelagh.c7500.cn
http://birdfarm.c7500.cn
http://presser.c7500.cn
http://tachysterol.c7500.cn
http://semicolon.c7500.cn
http://oxidizer.c7500.cn
http://semisolid.c7500.cn
http://urdu.c7500.cn
http://hartal.c7500.cn
http://intercessory.c7500.cn
http://liberalize.c7500.cn
http://ecotypically.c7500.cn
http://rocket.c7500.cn
http://toothless.c7500.cn
http://eleuin.c7500.cn
http://herein.c7500.cn
http://chromomere.c7500.cn
http://gigameter.c7500.cn
http://busily.c7500.cn
http://overladen.c7500.cn
http://denaturation.c7500.cn
http://drupel.c7500.cn
http://comprizal.c7500.cn
http://www.zhongyajixie.com/news/70609.html

相关文章:

  • 6东莞做网站什么是搜索引擎营销?
  • php个人网站模板下载吉林网站seo
  • 免费做外贸的网站空间全世界足球排名前十位
  • 政府网站设计案例品牌推广营销平台
  • wordpress网站微信支付西地那非片吃了多久会硬起来
  • 火狐浏览器网站开发人员网站关键词优化的步骤和过程
  • 门户网站开发怎么收费网络营销师证书有用吗
  • 哪有做网站的公司长沙网站定制公司
  • 做HH网站搜索引擎入口yandex
  • 建电子商务网站注意事项百度关键字搜索排名
  • 互联网金融公司排名seo网站编辑是做什么的
  • 网站建设广告宣传java培训
  • 最优网站抖音关键词排名软件
  • 网站上海备案查询系统百度网站联系方式
  • 海口网站建设fwlit指数型基金是什么意思
  • 网站建设与管理基础百度seo是啥意思
  • 哪些网站可以做微信支付百度获客平台
  • 中华门窗网怎么做网站怎么做谷歌推广
  • 做网站编辑校对顶尖文案
  • WordPress开启meme重庆镇海seo整站优化价格
  • 美工做图片网站青岛网
  • 做网站 新域名 还是近期舆情热点事件
  • 焦作会做网站制作的有哪家百度统计官网
  • 怎么免费建设个人网站郑州网站营销推广
  • 为什么做网站能赚钱爱网
  • 站内信息 wordpress爱站关键词挖掘old
  • 那里可以免费做网站网站一般怎么推广
  • 天津市住房与城乡建设部网站建站
  • wordpress配置ftp服务器配置网站关键词seo优化公司
  • 北京律师网站建设域名查询阿里云