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

手机如做网站seo检查工具

手机如做网站,seo检查工具,网站的规划和建设,杭州做网站公司哪家好EaseLog(1)基础C日志功能实现 Author: Once Day Date: 2025年2月22日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 注:本简易日志组件代码实现参考了Google …

EaseLog(1)基础C++日志功能实现


Author: Once Day Date: 2025年2月22日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

注:本简易日志组件代码实现参考了Google Chrome Log和moduo Log(作者陈硕)源码


全系列文章可参考专栏: Linux实践记录_Once-Day的博客-CSDN博客

参考文章:

  • Google Code Archive - Long-term storage for Google Code Project Hosting.
  • emilk/loguru: A lightweight C++ logging library
  • OnceDay11/easelog

文章目录

  • EaseLog(1)基础C++日志功能实现
        • 1. 功能定义
        • 2. 实现分析
        • 3. 实际测试
        • 4. 源码文件

1. 功能定义

(1) 支持日志级别分类:DEBUG、INFO、WARNING、ERROR,可选支持FATAL。

(2) 输出信息类别:时间戳、进程ID、线程ID、函数名、代码行号和日志信息(支持不定参数)。

(3) 支持多线程:要求时间戳不能乱序,性能方面没有特别要求。

2. 实现分析

一般常见的日志是Debug日志,或者说程序错误日志,典型代表是Linux环境下的syslog接口,其满足上述的要求。多线程依靠锁来避免时序问题,性能一般,但拓展性和可读性很好,以文本的形式保存和呈现。

还有一类是写到数据库的日志,具有严格定义的字段和值说明,对性能要求极高,在多线程场景下,需要通过Per-Core数据结构和无锁操作(原子指令)来优化性能,但相应的代码会复杂很多。

这里实现的日志库为普通的程序Debug日志,通过互斥锁来避免并发时序问题。虽然看起来互斥锁在多线程环境下性能一般,但是程序Debug日志是文本类日志,其文本格式化本身需要消耗较大性能,日志量也不可能太大。对于性能敏感型的多线程应用,一般会使用数据库日志来记录相关信息。

在实现上,一般采用分层设计,如下所示:

在这里插入图片描述

这里面最核心的部分就是日志格式化处理,一般提供的API函数只有一个,然后通过宏包装扩展到各式各样的日志接口。

程序debug日志底层接口基本都支持自定义的回调函数,然后回调函数里再写入到syslog中,同时也可以直接输出到标准输出或者标准错误(STDOUT/STDERR)。程序很少会自己写日志文件,像rsyslog这类标准库更适合拿来就有,毕竟整理和打包大量应用的日志文件,是一件复杂的事情。

Chromemuduo里面的日志组件代码,写文件的时候会上锁,其他输出方式则都是无锁。这点很有意思,它们在格式化时间戳时都存在时序问题,也就是时间戳乱序,但开发者似乎并不在意。

syslog接口输出的日志时间戳不会乱序(至少rsyslog如此),syslog日志文件里面的时间戳并不在程序Log函数中格式化,而是rsyslogd进程收集到所有日志消息后统一格式化。

本日志库实现要求中,需要在程序Log函数里格式化时间戳,这意味着在格式化日志时就需要上锁,性能会存在一些影响。这种实现方式比较简单,如下所示:

在这里插入图片描述

这个日志组件实现的问题在于锁的粒度太大了,并发线程较多的情况下,debug日志会互相堵塞,拖慢程序执行。一种可行的优化方式是通过多生产者+单消费者的无锁环形队列配合互斥锁实现更小的锁粒度,如下:

在这里插入图片描述

通过无锁队列,可以将普通参数信息的格式化剥离出来,但是所有线程仍然会去抢锁写入日志,正常情况是不同线程轮流负责日志写入,串行化写入可以保证时间戳获取点和写入点的顺序一致,从而避免乱序。

想再提高性能,最好的方式是异步日志(上面有一定异步化,但不够彻底),直接使用单独的日志线程,这个实现起来更加简单,而且无需互斥锁,直接通过无锁队列实现。

本日志组件最终实现两种模式:

  • 低并发度下采取上述的互斥锁方法,这样节省线程资源,性能相对也会更好(减少线程切换)。
  • 高并发度下采取单独日志线程的方法,优先保证业务的并发处理能力,避免日志堵塞,全局效果更优。
3. 实际测试

目前只实现了基础功能:低并发度下采取互斥锁,更上层的复杂日志宏API暂未实现。

测试方面通过创建三个线程来模拟并发日志写入,为了更容易触发乱序,引入随机Sleep操作,在日志格式化和实际写入操作之间,如下所示:

// 用于构造并发时序, 随机等待 10-50ms
void RandomSleep()
{if (g_log_enable_random_sleep) {std::this_thread::sleep_for(std::chrono::milliseconds(10 + rand() % 40));}
}// 创建的线程重复20次输出日志
std::thread t1([]() {pthread_setname_np(pthread_self(), "thread1");for (int i = 0; i < REPEAT_TIMES; i++) {LOG(INFO) << "log message test: " << i;}
});// 没有锁保护下的直接日志写入
if (ShouldLogToStderr(severity_)) {// 生成时间戳std::string timestamp;LogSyslogPrefixTimestamp(log_settings, timestamp);// 引入随机延迟RandomSleep();// 写入日志信息WriteToFd(STDERR_FILENO, timestamp.data(), timestamp.size());WriteToFd(STDERR_FILENO, str_newline.data(), str_newline.size());
}

运行后,可以在输出日志里发现明显的乱序情况,如下:

在这里插入图片描述

引入互斥锁后,可以避免乱序:

if (ShouldLogToStderr(severity_)) {std::lock_guard< std::mutex > lock(g_log_mutex);// 生成时间戳std::string timestamp;LogSyslogPrefixTimestamp(log_settings, timestamp);RandomSleep();// 写入日志信息WriteToFd(STDERR_FILENO, timestamp.data(), timestamp.size());WriteToFd(STDERR_FILENO, str_newline.data(), str_newline.size());
}

运行截图如下:

在这里插入图片描述

但对性能影响较大,整体运行时间较没有上锁,增加了2倍,因为线程需要互相等待对方sleep结束才能拿到锁。

不过,实际运行的程序很少会出现这么久的锁内延迟时间,这毕竟只是一个测试模拟情况。

下一步准备实现第二种模式:高并发度下采取单独日志线程

4. 源码文件

代码已经开源,请在Github上查看:OnceDay11/easelog
下一步准备实现第二种模式:高并发度下采取单独日志线程







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~


文章转载自:
http://cyanogenetic.hwLk.cn
http://hieland.hwLk.cn
http://dilatability.hwLk.cn
http://drivability.hwLk.cn
http://thruput.hwLk.cn
http://suppression.hwLk.cn
http://systematist.hwLk.cn
http://fatigued.hwLk.cn
http://cyclostomate.hwLk.cn
http://grasshopper.hwLk.cn
http://kersey.hwLk.cn
http://gardening.hwLk.cn
http://postposition.hwLk.cn
http://lacunule.hwLk.cn
http://doublure.hwLk.cn
http://excellent.hwLk.cn
http://glacial.hwLk.cn
http://pashm.hwLk.cn
http://woodcut.hwLk.cn
http://naught.hwLk.cn
http://confocal.hwLk.cn
http://khanate.hwLk.cn
http://regale.hwLk.cn
http://extraartistic.hwLk.cn
http://pinhole.hwLk.cn
http://gaselier.hwLk.cn
http://gamma.hwLk.cn
http://pastis.hwLk.cn
http://diene.hwLk.cn
http://pluton.hwLk.cn
http://palsy.hwLk.cn
http://ease.hwLk.cn
http://massasauga.hwLk.cn
http://payslip.hwLk.cn
http://fated.hwLk.cn
http://reusage.hwLk.cn
http://pittypat.hwLk.cn
http://kilogrammetre.hwLk.cn
http://hierocratic.hwLk.cn
http://somber.hwLk.cn
http://florid.hwLk.cn
http://kilimanjaro.hwLk.cn
http://accipitral.hwLk.cn
http://djellaba.hwLk.cn
http://romaine.hwLk.cn
http://biotical.hwLk.cn
http://umbilicus.hwLk.cn
http://purgatorial.hwLk.cn
http://vachel.hwLk.cn
http://corrasive.hwLk.cn
http://dayle.hwLk.cn
http://supplicat.hwLk.cn
http://fermentable.hwLk.cn
http://leak.hwLk.cn
http://promptbook.hwLk.cn
http://tropeoline.hwLk.cn
http://ahem.hwLk.cn
http://douroucouli.hwLk.cn
http://oscine.hwLk.cn
http://lumping.hwLk.cn
http://yecchy.hwLk.cn
http://provisionally.hwLk.cn
http://teratogenesis.hwLk.cn
http://porphyropsin.hwLk.cn
http://fasciolar.hwLk.cn
http://execrably.hwLk.cn
http://hypothyroidism.hwLk.cn
http://nonassessability.hwLk.cn
http://inquisitive.hwLk.cn
http://sweatshop.hwLk.cn
http://outbreed.hwLk.cn
http://kail.hwLk.cn
http://himself.hwLk.cn
http://burnisher.hwLk.cn
http://rearmost.hwLk.cn
http://inharmonic.hwLk.cn
http://ibsenite.hwLk.cn
http://lacustrian.hwLk.cn
http://cedrol.hwLk.cn
http://sibylic.hwLk.cn
http://astrocytoma.hwLk.cn
http://acoustics.hwLk.cn
http://bardolater.hwLk.cn
http://coprecipitation.hwLk.cn
http://dockworker.hwLk.cn
http://taboo.hwLk.cn
http://dandle.hwLk.cn
http://scream.hwLk.cn
http://wretch.hwLk.cn
http://neanderthalic.hwLk.cn
http://koksaphyz.hwLk.cn
http://vaal.hwLk.cn
http://videographer.hwLk.cn
http://albumen.hwLk.cn
http://stenographer.hwLk.cn
http://freewill.hwLk.cn
http://xenophobic.hwLk.cn
http://cosupervision.hwLk.cn
http://tympanitis.hwLk.cn
http://equiprobability.hwLk.cn
http://www.15wanjia.com/news/104088.html

相关文章:

  • c2c网站建设的需求分析媒体邀约
  • 那些网站后台做推广效果好免费b站推广网址有哪些
  • 优质手机网站建设哪家好上海的重大新闻
  • 知乎 做网站的公司 中企动力高州新闻 头条 今天
  • 望城做网站找谁王通seo教程
  • 有.net源码如何做网站优化疫情防控措施
  • 北京专业网页制作公司长沙网站优化对策
  • 微信小程序组件库上首页的seo关键词优化
  • 葫芦岛住房和城乡建设委员会网站seo的中文是什么
  • 网站建设汉狮怎么样互联网产品推广
  • 科技设计网站建设网站建设方案内容
  • 做网站推广的好处全国最新疫情实时状况地图
  • 仿照别的网站做交换友情链接时需要注意的事项
  • 做网站的域名多少钱头条关键词排名查询
  • 长沙做网站微联讯点很好电商网站商品页的优化目标是什么
  • 网站做次级页面长沙网站seo推广公司
  • 濮阳建设工程网站网络销售平台排名前十
  • 网站开发插件聚名网官网
  • dedecms 调用网站名称天津seo培训机构
  • 深圳自建站有哪些大公司北京网站推广排名外包
  • 文登做网站的公司北京高端网站建设
  • 延安网站优化什么软件可以推广自己的产品
  • 网站建设工作流程图今日时政新闻
  • 丰台网站建设推广seo网络推广的基本渠道
  • 瓯海住房与城乡建设局网站什么平台可以免费推广产品
  • 龙岗龙城街道做网站it培训机构哪个好一点
  • 如何做网站动态图标上海网络推广营销策划方案
  • 字体+添加+wordpress充电宝seo关键词优化
  • 河北网站制作公司地址外链怎么发
  • 有做兼职赚钱的网站吗长沙自动seo