文章目录

  • 日志写入逻辑
  • Log4cpp日志框架
  • 日志级别
  • 日志格式化
  • 日志输出
  • 日志回滚
  • 配置文件
  • Log4cpp范例讲解
    • 配置文件剖析
    • Log4cpp调用栈分析
    • 性能测试
    • 日志回滚
  • muduo日志库分析
    • 异步日志机制
    • 双缓冲机制

日志写入逻辑

调用fwrite与write的吞吐量是不一样的,fwrite的ops比write的大
我们可以看到,fwrite与write的区别,当单次发送的数据的大小会影响效率

Log4cpp日志框架

日志级别

日志格式化

日志输出

日志回滚

比如说我们可以只保存最近的一个日志,最大文件大小,超过多少数进行回滚,还有追加一个文件

配置文件

Log4cpp范例讲解

配置文件剖析

message其实就是warn_log.info(“Program info which cannot be wirten, darren = %d”, 100);这里边打引号的内容
Category就是warn_log.setAdditivity(false);
Appender
output,这里每个appender只有一个输入模式
layout的设置,patternlayout可以去设置输出格式
log4cpp::PatternLayout* pLayout2 = new log4cpp::PatternLayout();
pLayout2->setConversionPattern("%d: %p %c %x: %m%n");
这两句可以设置layout的格式

// 1 读取解析配置文件// 读取出错, 完全可以忽略,可以定义一个缺省策略或者使用系统缺省策略// BasicLayout输出所有优先级日志到ConsoleAppendertry { log4cpp::PropertyConfigurator::configure("./3-test_log4cpp.conf");//加载配置文件} catch(log4cpp::ConfigureFailure& f) {std::cout << "Configure Problem " << f.what() << std::endl;return -1;}// 2 实例化category对象// 这些对象即使配置文件没有定义也可以使用,不过其属性继承其父category// 通常使用引用可能不太方便,可以使用指针,以后做指针使用// log4cpp::Category* root = &log4cpp::Category::getRoot();log4cpp::Category& root = log4cpp::Category::getRoot();//树状log4cpp::NDC::push(__FUNCTION__);     // 记录NDC信息// log4cpp::NDC::push("ndc2");log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));log4cpp::Category& sub1_sub2 = log4cpp::Category::getInstance(std::string("sub1.sub2"));// 3 正常使用这些category对象进行日志处理。// sub1 has appender A1 and rootappender.sub1.info("sub1 This is some info");
# 文件名: 3-test_log4cpp.conf
# a simple test config
#定义了3个category sub1, sub2, sub1.sub2
# category 有两个参数 日志级别,Appender
log4cpp.rootCategory=DEBUG, rootAppender
# log4cpp.category.sub1设置日志级别默认和root一致, Appender为A1
log4cpp.category.sub1=,A1
# log4cpp.category.sub2设置为INFO,Appender默认使用root的
log4cpp.category.sub2=INFO
#log4cpp.category.sub1.sub2=ERROR, A2
log4cpp.category.sub1.sub2=, A2
# 设置sub1.sub2 的additivity属性,该属性默认值为true
# 如果值为true,则该Category的Appender包含了父Category的Appender, 即是日志也从root的appender输出
# 如果值为false,则该Category的Appender取代了父Category的Appender
log4cpp.additivity.sub1=false
# sub1.sub2的日志也从sub1的appender输出
log4cpp.additivity.sub1.sub2=true
#定义rootAppender类型和layout属性
log4cpp.appender.rootAppender=org.apache.log4cpp.ConsoleAppender
log4cpp.appender.rootAppender.layout=org.apache.log4cpp.BasicLayout
#定义A1的属性
log4cpp.appender.A1=org.apache.log4cpp.FileAppender
log4cpp.appender.A1.fileName=A1.log
log4cpp.appender.A1.layout=org.apache.log4cpp.SimpleLayout
#定义A2的属性
log4cpp.appender.A2=org.apache.log4cpp.ConsoleAppender
log4cpp.appender.A2.layout=org.apache.log4cpp.PatternLayout
#log4cpp.appender.A2.layout.ConversionPattern=The message '%m' at time
# log4cpp.appender.A2.layout.ConversionPattern=%d %m %n
# %d 时间戳 %t 线程名 %x NDC  %p 优先级 %m log message 内容  %n 回车换行
log4cpp.appender.A2.layout.ConversionPattern=%d %p %x - %m%n

多层次


运行代码,我们看的出来性能区别还是挺大的
客户端那个RollingFileAppend,要检查文件大小,这样性能会比较差

Log4cpp调用栈分析

性能测试

日志回滚

已经有五个日志文件了,先删除最老的那个log5,然后再把其他的日志文件的文件名字的数字加一,然后新建日志
实时写入磁盘单笔write
多行100累积再写入->累积了99行,另一方一直不来,这要单独起一个定时器(例如1秒)去刷新,同一个日志管理线程去刷新数据
日志回滚每次都读取日志文件大小,肯定不能每次读取文件大小

muduo日志库分析

异步日志机制

怎么唤醒日志罗盘线程读取日志写入磁盘
每次发notify对性能有没有影响,mutex多线程互斥
不要发notify,累积多行日志再发送
缓存多条日志才能唤醒日志罗盘线程
日志写入磁盘时是批量写入

双缓冲机制

1、日志notify问题
写满一个buffer才一次notify插入日志 —日志api调用的线程
通过wait_timeout去读取日志,然后写入磁盘 — 日志罗盘线程
如果是超时唤醒,如果buffera此时只有1M数据,这边肯定是要读走的,然后写入磁盘
2、能够避免buffer不断分配
3、buffer默认4M一个
buffers是buffer队列,push,pop时使用mov语义减少内存拷贝
效率与延迟是成反比的


异步日志方案log4cpp相关推荐

  1. log4j2 异步日志

    Log4j2异步日志 异步日志 log4j2最大的特点就是异步日志,其性能的提升主要也是从异步日志中受益,我们来看看如何使用log4j2的异步日志. 同步日志 异步日志 Log4j2提供了两种实现日志 ...

  2. java log4j 异步_Log4j2异步日志之异步格式化

    在优化系统响应时间的时候,除了优化业务逻辑/代码逻辑之外,把日志改成异步也是一种不错的方案 Log4j2在异步日志的性能上已经无人能挡了,其异步效率高的主要原因是使用disruptor来做异步队列 但 ...

  3. 使用ASP.NET Core和Hangfire实现HTTP异步化方案

    Hi,大家好,我是Payne,欢迎大家一如既往地关注我的博客.今天这篇博客里的故事背景,来自我工作中的一次业务对接,因为客户方提供的是长达上百行的XML,所以一度让更喜欢使用JSON的博主感到沮丧,我 ...

  4. 多线程异步日志系统,高效、强悍的实现方式-双缓冲

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 目录 文章目录 单片机中常用的环形缓冲区 多线程异步日志:双缓冲机制 双缓冲机制为什么高效 尽可能的降低 Lock 的时 ...

  5. cli能记日志web不能php,异步日志输出方案

    - 深入了解PHP生命周期 一.背景 日志在WEB应用中的使用非常广泛,记录访问者IP,访问者操作的数据,接口请求的信息,异常提示信息等,尤其在产品环境中,我们往往需要通过日志来分析当前应用的运营情况 ...

  6. java 多线程 异步日志_精彩技巧(1)-- 异步打印日志的一点事

    一.前言 最近刚刚结束转岗以来的第一次双11压测,收获颇多,难言言表, 本文就先谈谈异步日志吧,在高并发高流量响应延迟要求比较小的系统中同步打日志已经满足不了需求了,同步打日志会阻塞调用打日志的线程, ...

  7. Log4j2异步日志背后的数字

    作者:京东集团-京东零售-技术与数据中台-共享技术部-流量技术组 王丽. 引言 在程序开发过程中,几乎任何一个应用程序都会通过打印日志来记录跟踪程序运行情况,打印日志信息不仅可以让我们详细的了解程序内 ...

  8. boost::log模块实现多线程异步日志记录示例

    boost::log模块实现多线程异步日志记录示例 实现功能 C++实现代码 实现功能 boost::log模块实现多线程异步日志记录示例 C++实现代码 #include <stdexcept ...

  9. log4j异步mysql_log4j2用Log4jContextSelector启动参数配置全局异步日志是如何使用disruptor...

    与 log4j2用asyncRoot配置异步日志是如何使用disruptor差异有几个: 给disruptor实例的EventFactory不同 此处EventFactory采用的是RingBuffe ...

  10. logback 的过滤器和异步日志和自定义 logger

    Filter和异步日志配置 <?xml version="1.0" encoding="UTF-8"?> <configuration> ...

最新文章

  1. (1)虚拟机管理——在微软云Azure新门户创建虚拟机
  2. vector在java中用什么_在java中使用Vector是否安全?
  3. python3.6.5下载-python3.6.5下载
  4. 以前的的华为手机可不可以用鸿蒙系统_鸿蒙系统面世之后,以前的华为手机可以用鸿蒙系统吗?不好意思!...
  5. 没有一部是烂片 香港最强水准的10部影片
  6. 6.4 Ext.core.DomQuery 单实例查询选择器,通过正则表达式查找DOM或者HTM
  7. gitblit如何迁移入gitlab合并迁移_gitlab和gitlab项目迁移
  8. 操作系统复习笔记(一)
  9. 把百度首页放到博客里看看
  10. 医院信息化集成平台建设
  11. C语言实现巴特沃斯IIR滤波器
  12. 关于boa+cgi上传文件大小的问题
  13. Adroid游戏开发实例讲解(四)-电子白板附源码
  14. 从BlueSky.h和BlueSky.cpp到BlueSky.out的那些事儿
  15. 功利主义穆勒思维导图_浅析穆勒的功利主义思想及现实意义
  16. 基于FPGA的遥控数字时钟设计
  17. iOS开发 NSPredicate的使用方法
  18. DSP RS232 RS485通信
  19. HEX转BCD ,HEX转ASCII,HEX转DEC 算法合集 | C语言实现
  20. Smith数问题C++代码实现

热门文章

  1. 升级Windows 10 正式版过程记录与经验
  2. vc6 移植到vs2013
  3. 计算机java二级_关于Java计算机二级考试内容。
  4. 1-JavaScript高级程序设计-简介
  5. 统计php 代码行数,PHP实现统计代码行数小工具
  6. html加密原理,说说Html5视频加密播放原理
  7. java编译命令是什么_JAVA命令行编译及运行
  8. 数学建模——五步方法
  9. 零基础学python电子书-零基础学Python(全彩版)
  10. 阿里程序员推荐的9款最佳编程字体?