Asio(http://think-async.com)官方示例中给出了一个比较初步的日志服务,主要代码在basic_logger.hpplogger_service.hpplogger_service.cpp这3个文件。稍作改进(比如创建单独目录存放Log文件、格式化Log文件名以及每一行日志、定时创建新的日志文件)就可以搭建起一个可用的日志系统。

  新增一个logger类继承自basic_logger<logger_service>,在logger中创建定时器和定时事件,每隔规定时间发出请求重新生成一个日志文件。

  对basic_logger类中的use_file方法稍作修改,在此方法中创建存放Log文件的目录,并响应生成新Log文件的请求,Log文件可以利用生成时间命名以便进行区分。

  //basic_logger.hpp
void use_file(const std::string& file)
{
// create new dir for log files
// create new log file's name depends on time
... ...
service_.use_file(impl_, file);
} void log(const std::string& message)
{
service_.log(impl_, message);
}

  从basic_logger.hpp的代码可以看出,真正的IO操作,无论是Log文件的创建还是Log记录的写入,都是在logger_service中进行的。写入Log时,不妨加上时间前缀,以便今后的日志分析。

  //logger_service.hpp
void use_file(impl_type& /*impl*/, const std::string& file)
{
work_io_service_.post(boost::bind(
&logger_service::use_file_impl, this, file));
} void log(impl_type& impl, const std::string& message)
{
// add time prefix
std::ostringstream os;
os << ... ... << ": " << message; work_io_service_.post(boost::bind(
&logger_service::log_impl, this, os.str()));
} void use_file_impl(const std::string& file)
{
ofstream_.close();
ofstream_.clear();
ofstream_.open(file.c_str());
} void log_impl(const std::string& text)
{
ofstream_ << text << std::endl;
}

  在logger_service中,use_file和log都调用post方法把回调放入内部io对象的事件队列。use_file_impl负责创建新的Log文件,log_impl负责写入Log文件,所有的回调函数在单线程内被调用,这样即便它们共享ofstream_,也无需加锁保护。

  在虚拟机测试一下性能,CentOS 6.5、单核、1G内存,写入100万条日志需15秒。

利用Asio搭建日志系统的更多相关文章

  1. ELK+FileBeat+Log4Net搭建日志系统

    ELK+FileBeat+Log4Net搭建日志系统 来源:https://www.zybuluo.com/muyanfeixiang/note/608470 标签(空格分隔): ELK Log4Ne ...

  2. 【ELK】5.spring boot日志集成ELK,搭建日志系统

    阅读前必看: ELK在docker下搭建步骤 spring boot集成es,CRUD操作完整版 ============================================== 本章集成 ...

  3. 快速搭建日志系统——ELK STACK

    什么是ELK STACK ELK Stack是Elasticserach.Logstash.Kibana三种工具组合而成的一个日志解决方案.ELK可以将我们的系统日志.访问日志.运行日志.错误日志等进 ...

  4. .NET基于Eleasticsearch搭建日志系统实战演练

    一.需求背景介绍 1.1.需求描述 大家都知道C/S架构模式的客户端应用程序(比如:WinForm桌面应用.WPF.移动App应用程序.控制台应用程序.Windows服务等等)的日志记录都存储在本地客 ...

  5. elk搭建日志系统

    参考:https://www.cnblogs.com/yuhuLin/p/7018858.html 以上这篇文章已经写的很好很全了,之所以再自己写一遍大概就是记录一下,以后可能会有用吧 安装elast ...

  6. elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统

    前言 刚从事开发那段时间不习惯输出日志,认为那是无用功,徒增代码量,总认为自己的代码无懈可击:老大的叮嘱.强调也都视为耳旁风,最终导致的结果是我加班排查问题,花的时间还挺长的,要复现问题.排查问题等, ...

  7. ASP.NET Core分布式日志系统ELK实战演练

    一.ELK简介  ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台. •  Elastics ...

  8. 利用 ELK 搭建 Docker 容器化应用日志中心

    利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...

  9. linux下利用elk+redis 搭建日志分析平台教程

    linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm   elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...

随机推荐

  1. setClickable(false)问题处理

    在项目中遇到一个小问题 就是 设置btn的 点击不可以 setClickable(false)  结果发现还是有问题 查了半小时代码之后 才发现 是顺序问题 如果先设置点击监听setOnClickLi ...

  2. LinearLayout增加divider分割线

    在android3.0及后面的版本在LinearLayout里增加了个分割线 1 2 android:divider="@drawable/shape"<!--分割线图片-- ...

  3. Hibernate知识点总结

    Hibernate配置二级缓存:  --- 使用EhCache 1.hibernate.cfg.xml中配置二级缓存 <hibernate-configuration>   <ses ...

  4. [PWA] 5. Hijacking one type of request

    Previously we saw how to Hijacking all the reqest, but this is not useful. So now we want to see how ...

  5. Python中的map()函数和reduce()函数的用法

    Python中的map()函数和reduce()函数的用法 这篇文章主要介绍了Python中的map()函数和reduce()函数的用法,代码基于Python2.x版本,需要的朋友可以参考下   Py ...

  6. codevs1002搭桥(建图+Prim)

    /* 先来个灌水法 然后建图跑最小生成树 注意观察题目中的规则 a[1][i]!=a[1][j]&&abs(a[2][i]-a[2][j])<=1 建图的时候可以每一个建筑物都看 ...

  7. prim 堆优化+ kruskal 按秩优化

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...

  8. 1、第1课.net学习2150916

    HTML标签 1.<p> <p> 标签 段落标签 2.<h1-6></h1> 文字标签从1-6 3. <i></i> 斜体 &l ...

  9. Linq101-Projection

    using System; using System.Linq; namespace Linq101 { class Projection { /// <summary> /// This ...

  10. C# Wpf双向绑定实例

    Wpf中双向绑定处理需要两处 实例1: 1.前台Xaml中属性Binding 时Model指定 TwoWay <Grid> <Ellipse x:Name="ellipse ...