多线程中使用ACE日志策略示例

ACE(一):使用ACE日志设施 1、前言:使用ACE日志设施的主要宏如下:ACE_DEBUG(常用):用于调试语句ACE_ERROR(常用):用于警告和错误ACE_TRACE:用于跟踪信息2、新建控制台项目Log_Text(vs2008)4、修改Log_Text.cpp文件// Log_Text.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #define ACE_NTRACE 0//是否可是使用宏ACE_TRACE 0 启用,1 禁用,默认禁用 #include "ace/Lo 阅读详情

多线程中使用ACE日志策略示例

2009年10月26日

0. 本文介绍

    本文通过代码,演示了如何在多线程中使用ACE日志设施(log facilites)代码。本文分为三部分。

第一部分概述了ACE日志设施代码;

第二部分给出完整的源代份和运行结果;

第三部分对相关代码作了说明,其中包括了运行Reactor事件,运行时动态服务加载等。

 

1. ACE日志策略

ACE_Logging_Strategy 提供了一种可以在运行时动态配置ACE日志的机制,通过这种机制

可以设置日志文件的大小以及日志文件的“回转”备份。

ACE_Logging_Strategy  默认使用单体的Reactor,使用者也可以通过

  ACE_Reactor my_reactor;
ACE_Logging_Strategy *logging_strategy = …… // Get instance.
 
  logging_strategy->reactor (&my_reactor);

修改。

ACE_Logging_Strategy 的主要参数说明

-f 用来控制日志的标志位,如

   OSTREAM, STDERR, LOGGER, VERBOSE,
    SILENT, VERBOSE_LITE

-i 指定检测日志文件大小的时间间隔。 单位为秒,默认为0表示不检查。

   ACE_Logging_Strategy  内部实现了定时器。

-m 指定日志文件的大小,单位为Kbytes (千字节数)

-N 指定可以创建日志文件的最多个数。超过个数就“回转”备份,即替换旧的日志文件。

-p 指定输出日志的严重级别

DEBUG, INFO, WARNING, NOTICE, ERROR, CRITICAL, ALERT,
EMERGENCY

如果想禁止输出日志的严重级别,可以这样使用

~DEBUG, ~INFO, ~WARNING,

     ~NOTICE, ~ERROR, ~CRITICAL, ~ALERT, ~EMERGENCY

 

2. 示例的代码

   本文以教学演示为目的,所以代码全部写在同一个文件中。下面是完整的代码

//begin
//file: test_log.cpp
//

// author: stone jiang (http://www.tao-studio.net/blog)

// date:    2009-10-26

 

#include "ace/Log_Msg.h"
#include "ace/Time_Value.h"
#include "ace/OS.h"
#include "ace/Logging_Strategy.h"
#include "ace/ARGV.h"
#include "ace/Dynamic_Service.h"
#include "ace/Service_Config.h"
#include "ace/Reactor.h"
#include "ace/Task.h"

class Task_Reactor : public ACE_Task_Base
{
public:
    virtual int open (void *args = 0);
    virtual int svc (void);
    int  done();
};

int Task_Reactor::open(void *args /* = 0 */)
{
    ACE_DEBUG ((LM_DEBUG, "(%t) TaskReactor::open()/n"));

    return this->activate ();
}

int Task_Reactor::svc()
{
    ACE_DEBUG ((LM_DEBUG, "(%t) TaskReactor::svc()/n"));
    return  ACE_Reactor::instance()->run_event_loop();
}

int  Task_Reactor::done()
{
    ACE_DEBUG ((LM_DEBUG, "(%t) TaskReactor::done()/n"));

    return ACE_Reactor::instance()->end_event_loop();
}

class Task_Test : public ACE_Task<ACE_MT_SYNCH>
{
public:
    virtual int open (void *args = 0);
    virtual int close (u_long flags = 0);
    virtual int svc (void);

private:
};

int
Task_Test::open (void *)
{
    return this->activate ();
}

int
Task_Test::close (u_long)
{
    return 0;
}

int
Task_Test::svc (void)
{

    ACE_DEBUG ((LM_DEBUG, "(%t) svc: waiting/n"));
    for(int i = 0; i < 10;  i++)
    {
        ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%t|%T) Task_Test:: i = %d./n"),i));
        ACE_OS::sleep(ACE_Time_Value(1,0));

    }

    ACE_DEBUG ((LM_DEBUG, "(%t) svc: finished waiting/n"));
    return 0;
}

int ACE_TMAIN(int argc, ACE_TCHAR *[])
{
    ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%t|%T) start here./n")));
    ACE_Logging_Strategy *  log =
        ACE_Dynamic_Service<ACE_Logging_Strategy>::instance("Logger");
    if (log == 0)
    {
        int result =  ACE_Service_Config::process_directive(
            ACE_DYNAMIC_SERVICE_DIRECTIVE("Logger",
             "ACE",             
            "_make_ACE_Logging_Strategy",
            "")
            );
        ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%t|%T) result = %d./n"),result));
    }
    log =
        ACE_Dynamic_Service<ACE_Logging_Strategy>::instance("Logger");

    if (log)
    {
        ACE_ARGV args;
        args.add (__argv[0]);
        char cmdline[250] ={0};
        sprintf(cmdline,"-s log.txt -f STDERR|OSTREAM -p DEBUG|ERROR");
        args.add (ACE_TEXT (cmdline));    
        log->init(args.argc(),args.argv());
    }
    else
    {
        return -1;
    } 

    Task_Test  testTask;
    testTask.open( 0 );
    Task_Reactor reactorTask;
    reactorTask.open(0);

    for(int i = 0; i < 10;  i++)
    {
        ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%t|%T) i = %d./n"),i));
        ACE_OS::sleep(ACE_Time_Value(1,0));

    }
    testTask.wait();

    reactorTask.done();
    reactorTask.wait();
    ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%t|%T) end here./n")));
    return 0;
};

//file: test_log.cpp
// end

 

 

代码运地结果

在可执行文件当前目录下,程序自动创建了日志文件log.txt,内容如下

(4728) TaskReactor::open()
(4728| 15:14:34.156000) i = 0.
(4944) TaskReactor::svc()
(3248) svc: waiting
(3248| 15:14:34.156000) Task_Test:: i = 0.
(4728| 15:14:35.156000) i = 1.
(3248| 15:14:35.156000) Task_Test:: i = 1.
(4728| 15:14:36.156000) i = 2.
(3248| 15:14:36.156000) Task_Test:: i = 2.
(4728| 15:14:37.156000) i = 3.
(3248| 15:14:37.156000) Task_Test:: i = 3.
(4728| 15:14:38.156000) i = 4.
(3248| 15:14:38.156000) Task_Test:: i = 4.
(4728| 15:14:39.156000) i = 5.
(3248| 15:14:39.156000) Task_Test:: i = 5.
(4728| 15:14:40.156000) i = 6.
(3248| 15:14:40.156000) Task_Test:: i = 6.
(4728| 15:14:41.156000) i = 7.
(3248| 15:14:41.156000) Task_Test:: i = 7.
(4728| 15:14:42.156000) i = 8.
(3248| 15:14:42.156000) Task_Test:: i = 8.
(4728| 15:14:43.156000) i = 9.
(3248| 15:14:43.156000) Task_Test:: i = 9.
(3248) svc: finished waiting
(4728) TaskReactor::done()
(4728| 15:14:44.156000) end here.

 

3.与程序相关的ACE其它内容

本程序还用到了多线程编程,演示了ACE_Task_Base, ACE_Task<>,的使用;

其中Task_Reactor演示了如何在独立的线程中运行Reactor事件循环,并在主线程中结束Reactor事件循环。

 

本程序还用到了动态服务加载:

ACE_Service_Config::process_directive()

它可以在运行时显示的加载所需要的服务(svc),使用这种手法可以不必编写*.conf文件。

本程序还用到了在程序中根据ident访问直接访问加载的动态服务

ACE_Dynamic_Service<ACE_Logging_Strategy>::instance("Logger");

 

其他:

在学习ACE的过程中如果有任何问题,欢迎来邮件(jiangtao) 或在本站论坛http://www.tao-studio.net/bbs中提问。

44、探索ACE框架:实现高效网络编程的利器 本文深入探讨了ACE框架在高效网络编程中的应用,详细介绍了ACE Reactor、Proactor、任务框架和流框架等核心组件的功能与实现机制。通过丰富的代码示例和实际应用案例,展示了如何利用ACE框架开发高性能、可扩展的网络应用程序。 阅读详情

相关推荐

ACE框架深入剖析与应用

本文还有配套的精品资源,点击获取 简介:ACE是一个开源跨平台的C++库,专为网络通信和并发编程设计,提供了丰富的类和模板以适应不同操作系统和网络环境。ACE.chm文档详细介绍了ACE的核心概念和各类库的使用,包括线程管理、异步I/O、信号处理、时间管理、网络通信、命名服务、内存管理和配置日志。文档内容详尽,包含实例代码和超链接,适合初学者和开发者深入学习。 1...

weixin_33608403的博客 1794

ACE+线程池实现一个简单的服务器+多客户端通信程序

ACE中本身具有异步通信组建,比如handle_input和handle_ouput等方法,可以用来实现一个 单线程的服务器,并且可以

j_akill的专栏 4518

告别手动复制粘贴:3种高效合并Excel表格的方法对比(含代码)

本文对比了VBA、Power Query和Python三种高效合并Excel表格的方法,并提供了可直接运行的代码。针对不同数据量、更新频率和技术背景,详细分析了各方案的优缺点与适用场景,帮助读者告别低效的手动操作,实现自动化数据整合。

weixin_29057237的博客 441

ACE:多线程简介

由于也刚初学,这里打算从自己的一些理解,简单介绍下ACE_Thread、ACE_Thread_Manager、ACE_Task 这里先简单些一点,有时间再做补充 ACE_Thread 一个简单例子 入口函数: void* worker(const char* arg) { ACE_OS::sleep(10); puts(arg); return NULL;

千里之行 3932

Keil中搭建自动化单元测试框架Unity

前言:   虽然一些C++的自动化单元测试框架也能用来C语言单元测试,但那样我们编写C语言程序时需要符合C++的标准,这样有一些C的特性是无法使用的,限制C的特性使用不太好,于是找了一个全部用C实现的自动化测试框架。Unity是一个简单且直接的自动化单元测试框架,它由很少的几个文件构成。 搭建环境:   1.从github上下载最新版本的Unity源码,下载链接:https://github...

程序员的自我修炼 3899

Ubuntu22.04下RTX2080显卡驱动、CUDA、cuDNN保姆级避坑安装指南(实测有效)

本文提供Ubuntu22.04下RTX2080显卡驱动、CUDA和cuDNN的详细安装指南,涵盖前期准备、驱动安装、CUDA版本选择、cuDNN配置及常见问题解决。通过实测有效的步骤和优化建议,帮助用户快速搭建稳定的深度学习环境,避免常见陷阱。

weixin_42540248的博客 285

ACE多线程编程(一)

使用ACE进行多线程编程的内容相对较多,分多篇总结。 本文中主要介绍线程的创建、互斥体和线程间通信。 1、线程的创建 使用ACE进行多线程编程比较简单,只需: 从ACE_Task_Base创建子类;重新实现svc()虚方法,这个函数是新线程的进入点。新线程从svc函数开始执行,函数返回,则新线程也结束;调用ACE_Task_Base::activate()方法启动新线程;调用ACE_T

wayz11的专栏 3723

5分钟搞定!用OpenCV实现全景图像柱面展开的保姆级教程(附完整代码)

本文提供了一份使用OpenCV实现全景图像柱面展开的详细教程。通过清晰的数学原理讲解和分步代码演示,指导读者快速掌握从等距柱状投影全景图到平面展开图的核心转换方法,并涵盖性能优化、参数调整及透视视图扩展等实用技巧,适合图像处理爱好者和开发者实践。

sony5的博客 573

ACE环境下为应用提供Telnet服务器

当我们的应用服务运行时,通常没有界面监控运行情况,也不能动态配置一些运行参数。那么我们能不能象Linux那样,提供一个类似shell那样的命令行界面进行交互呢? 当然可以,我们利用ACE的接受器和反应器框架,可以轻易为应用服务搭建一个类shell的远程Telnet环境。 主要有两个类实现:Network_Listener 监听类,打开TCP监听端口,准备接受客户端连接Netwo

2025

让 AI 变聪明的 20 条指令:如何让大模型回答得更精准、更专业、更实事求是

让 AI 变聪明,本质上不是写几句神奇咒语,而是把你的任务表达得更清楚,把事实标准设得更严格,把输出格式规定得更明确,把不确定性管理得更认真,把历史对话利用得更充分。大模型的强项是语言生成、信息组织、模式归纳和方案扩展;弱项是事实核验、实时更新、责任判断和对模糊意图的准确猜测。好的指令,就是在用人的判断弥补模型的弱点,让模型把强项发挥在正确的地方。

Sumarua的博客 1484

【Microchip】微芯 MPLAB® X IDE开发环境新建项目(点亮1颗LED灯)(常用右键菜单快捷键)

1.新建项目2. 选择芯片型号和调试器3.选择编译器4.项目命名和选择文件路径5.新建成功,给项目添加main.c7.将新建的mainXC16.c文件添加进项目6000000UL这三个就是。

Naiva的博客 449

使用ACE日志设施(二)详细介绍(v4)

最简单的日志设施 #include "ace/Log_Msg.h" int main(int argc, char *argv[]) { ACE_DEBUG((LM_INFO,ACE_TEXT("Hello ACE Log Msg !"))); return 0; }; 将日志写入文件: #include "ace/Log_Msg.h" #inc

C++ 爱好者 make_it_simple888 4996

LoveSQL

LoveSQL(SQL注入详解) 1、根据题目,显然想到的是sql注入漏洞,直接尝试万能密码 2、此时url构造,查看字段数 /check.php?username=admin' order by 3%23&password=1 # 存在 /check.php?username=admin' order by 4%23&password=1 # 报错 因此,得到总共有三个字段数 注意:url中不能用#,应该用url编码%23 3、用union来查询测试注入点,查看回显点

lunan的博客 1562

企业级应用中使用Microsoft.ACE.OLEDB.12.0的5个最佳实践

Microsoft.ACE.OLEDB.12.0作为连接Access数据库的常用驱动,在实际应用中有着广泛的使用场景。今天,我就来分享一下在企业级应用中使用Microsoft.ACE.OLEDB.12.0的5个最佳实践,希望能给大家带来一些启发。建议在每个线程中独立创建和使用连接对象,避免共享连接带来的线程安全问题。我在使用过程中发现,它的响应速度很快,操作界面也很直观,即使是复杂的数据库应用也能轻松上手。在实际开发中,我们还可以在界面上展示各项操作的执行时间和资源占用情况,这有助于性能优化和问题定位。

SunstoneLion34的博客 476

视觉Transformer实战 | Data-efficient image Transformer(DeiT)详解与实现

在计算机视觉领域,Vision Transformer (ViT) 已经证明了纯 Transformer 架构在图像分类任务上的强大能力。然而,ViT 通常需要在大规模数据集上预训练才能达到最佳性能,DeiT (Data-efficient image Transformer) 通过引入一系列训练策略和优化,使得 Transformer 模型能够在相对较小的数据集上取得优异表现。本节将详细介绍 DeiT 的技术原理,并使用 PyTorch 从零开始实现 DeiT 模型。

盼小辉丶的博客 1341

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ACE_Message_Block核心解析与高性能网络应用实践

消息队列是分布式系统和网络编程中的基础组件,其核心原理是通过缓冲机制实现异步通信。ACE_Message_Block作为ACE框架的消息处理单元,采用引用计数和链式结构设计,能有效降低内存拷贝开销,支持零拷贝技术。在网络协议解析、进程间通信等场景中,通过合理使用其内存池优化和线程安全策略,可显著提升吞吐量。结合ACE_Message_Queue使用时,开发者需特别注意引用计数管理,避免内存泄漏。本文深入剖析其分层架构和多种内存分配模式,为构建高性能网络服务提供实践指导。

weixin_30386713的博客 464

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ACE的陷阱

原帖:http://blog.youkuaiyun.com/fullsail/article/details/2915685

rainharder的专栏 1737

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ACE的ACE_Logging_Strategy类中的一个多线程安全问题的发现及解决过程

/************************************ *              版权声明 *   本文为本人原创,本人拥有此文的版权。鉴于本人持续受益于开源软件社区, * 本人声明:任何个人及团体均可不受限制的转载和复制本文,无论是否用于盈利 * 之目的,但必须在转载及复制时同时保留本版权声明,否则为侵权行为,本人保 * 留追究相应法律责任之权利。 *

884

日志策略 ---ace

rizhi多线程中使用ACE日志策略示例、简介以前曾介绍过一个开源日志系统log4cplus,ACE也有自己的Logging Facility,与log4cplus相似,ACE日志系统也具有线程安全、灵活、分级显示等特点,可以面向程序调试、运行、测试、和维护等全生命周期,可以选择将信息输出到屏幕、文件、系统日志(如Windows下的Event log)、甚至是远程服务器。除此之外,...

abc1104332737的博客 305

ACE的日志的不如意

  14         ACE的日志的不如意ACE的日志部分是一个非常漂亮的实现,在多线程和多进程模型下都能较好的效率和安全使用。但是却又少量的不足,让人意犹未尽。14.1           无法替换的时间戳格式ACE日志对于时间戳的格式是固定的,采用的是格式,这个格式在西方人看起来估计还比较顺眼,在东方人眼中却不如人意。更好的方式当然是时间戳的函数可以重载。或者用函数对象(指

C++是促进脑死亡的最佳方式 1993

ACE陷阱

 ACE的陷阱  PS:转载自http://blog.youkuaiyun.com/fullsail/archive/2008/09/12/2915685.aspx(C++是促进脑死亡的最佳方式)坦白说,使用这个标题无非是希望能够吸引你的眼球,这篇文章的目的仅仅是为了揭示一些ACE缺陷的。文章适合的读者是对ACE(ADAPTIVE Communication Environment)有一定研究,或

简约而不简单 2185

ACE框架学习4

ACE Proactor框架及 ACE Streams框架学习

RYIJU5YUJTY的博客 708

ACE简介

好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不***全的程序。类似于ACE_Thread_Manager::instance()->spawn()ACE_Thread线程类提供的全是静态线程管理方法,ACE_Thread_Manager是ACE_Thread的超集,这2种类都不便于实现面向对象的编程,因为他们是使一个函数或静态方法线程化来实现启动线程。ACE 有若干不同类型的消息队列,它们大体上可划分为两种范畴:静态的和动态的。

abemail的专栏 1119

C++网络编程 卷1 运用ACE和模式消除复杂性——笔记1

第0篇 0.3.1 面向对象中间件层 1、常见面向对象中间件体系结构: 1)主机基础设施中间件:对并发和ipc机制封装,如JavaPackage、ACE 2)分布式中间件:扩充1),使一些网络编程任务(连接管理和内存管理、整编、解编、端点和请求的多路分离)自动化,即只需向目标对象请求操作,不关心目标的位置、语言、OS、硬件,核心是ORB(Object Request Broker),如CO

kaci_csdn的博客 2003
上一篇: 多线程中使用ACE日志策略示例
下一篇: 哈佛图书馆馆训
Stone
博客等级 码龄21年 1715粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值