ACE提供的日志记录器

2023-10-12 09:48
文章标签 日志 提供 ace 记录器

本文主要是介绍ACE提供的日志记录器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个后台服务程序,良好的日志系统是不可缺少的。通过日志系统我们可以代替debug程序对服务程序进行调试。更重要的是我们可以运行状态下对服务程序的状态进行监控和跟踪,帮助我们查找修正运行过程中出现的一些不可预料的错误和异常。ACE提供了强大的对日志系统的支持,能够方便的为我们的应用程序建立良好的日志系统。

基本的日志记录

ACE_Log_Msg类使用了类似printf()的日志格式化输出格式使用起来非常方便。
ACE为每个线程维护一个ACE_Log_Msg类的实例从而让每个线程都有自己的日志输出。
ACE定义了若干个宏用来简化我们的使用(使用的时候只要包含Log_Msg.h即可)。
ACE可以方便的重定向日志输出,我们可以把日志输出到我们指定的stream(流)或者linux/unix的syslog,NT EventLog等。


基本的日志宏的使用(Simple1.cpp)

// Simple1.cpp,v 1.2 2004/10/06 16:27:14 shuston Exp
#include "ace/Log_Msg.h"void foo (void);int ACE_TMAIN (int, ACE_TCHAR *[])
{ACE_TRACE("main");ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHi Mom/n")));foo();ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight/n")));return 0;
}void foo (void)
{ACE_TRACE ("foo");ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner/n")));
}


执行结果:
ACE_TRACE无效的输出结果[root@ckasj Logging]# g++ -o Simple1 ../../../../examples/APG/Logging/Simple1.cpp -I/usr/local/include/ace -lACE 
[root@ckasj Logging]# ./Simple1
Hi Mom
Howdy Pardner
Goodnight
ACE_TRACE有效的输出结果root@ckasj Logging]# g++ -DACE_NTRACE=0 -o Simple1 ../../../../examples/APG/Logging/Simple1.cpp -I/usr/local/include/ace -lACE 
[root@ckasj Logging]# ./Simple1
(3086952128) calling main in file `../../../../examples/APG/Logging/Simple1.cpp' on line 8
Hi Mom
(3086952128) calling foo in file `../../../../examples/APG/Logging/Simple1.cpp' on line 19
Howdy Pardner
(3086952128) leaving foo
Goodnight
(3086952128) leaving main


注:日志宏是否输出日志信息又3个宏定义的值在编译的时候决定,通过设置ACE_NTRACE,ACE_NDEBUG,ACE_NLOGING的值为1或0来决定是否输出相应的信息,默认情况下编译ACE. ACE_TRACE 选项宏是被屏蔽的没有任何输出1)。如果需要默认情况下ACE_TRACE 生效你需要在编译的时候使用 -DACE_NTRACE选项。


控制调整日志输出的严重级别(Simple2.cpp)

// Simple2.cpp
#include "ace/Log_Msg.h"void foo(void);int ACE_TMAIN (int, ACE_TCHAR *[])
{ACE_TRACE ("main");//只使LM_DEBUG 和 LM_NOTICE级别的信息有效。//ACE_Log_Msg::PROCESS定义了日志设置应用于整个进程,可以选择//使用ACE_Log_Msg::THREAD只对本线程起作用ACE_LOG_MSG->priority_mask (LM_DEBUG | LM_NOTICE,ACE_Log_Msg::PROCESS);ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHi Mom/n"))); foo (); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IGoodnight/n"))); return 0;
}void foo(void)
{ ACE_TRACE ("foo"); ACE_DEBUG ((LM_NOTICE, ACE_TEXT ("%IHowdy Pardner/n")));
}

执行结果:

[root@ckasj Logging]# ./Simple2
Howdy Pardner
Goodnight


重定向日志输出


ACE的日志系统默认输出目标是系统的标准错误输出流,同时也可以输出到其他目标。如系统日志记录器(UNIX syslog ,NT Event Log)和我们指定的文件。你可以通过以下语句重定向ACE日志系统的输出目标:

int ACE_TMAIN (int, ACE_TCHAR *argv[])
{//open方法传入应用程序的名称,和目标输出流ACE_LOG_MSG->open (argv[0], ACE_Log_Msg::STDERR);......
}//或者通过set_flags改变目标输出流
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom/n")));
ACE_LOG_MSG->set_flags (ACE_Log_Msg::STDERR);


如果你通过set_flags()方法重定向日志输出,你可能在调用该方法之前调用一下clr_flags()禁止其他目的输出流。否则日志仍将输出到STDERR(标准错误输出流)。
大多数操作系统都支持系统日志记录器,从后台服务到系统函数调用都有。其思路是应用程序把他们的日志记录重定向到系统的日志记录器然后通过配置系统日志记录器把日志定向到适当的文件或其他目的日志系统。例如,UNIX系统管理员可以配置syslog,让不同类型不同级别的日志重定向到不同的目的地。这样可以提供更好的可伸缩性和可配置性。


// Use_Syslog.cpp#include "ace/Log_Msg.h"void foo (void);int ACE_TMAIN (int, ACE_TCHAR *argv[])
{// This will be directed to stderr (the default ACE_Log_Msg behavior).ACE_TRACE ("main");ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom/n")));// 重定向日志输出到syslogACE_LOG_MSG->open(argv[0], ACE_Log_Msg::SYSLOG, ACE_TEXT ("syslogTest"));foo ();// 恢复到默认配置ACE_LOG_MSG->open (argv[0]);ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight/n")));return 0;
}void foo (void)
{ACE_TRACE ("foo");ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner/n")));
}

不同平台的输出结果
重定向日志到SYSLOG(系统日志记录器)不同的平台表现形式不同,在unix/linux下输出到syslog设置,而在windows nt,windows2000,xp系统输出到EventLog设置,如果系统不提供日志记录器意味着重定向到SYSLOG没有任何效果。

Linux下的执行结果:

Linux syslog 显示结果
[root@ckasj Logging]# ./Use_Syslog 
Hi Mom
Goodnight[root@ckasj ~]# tail /var/log/messages
Feb 5 20:49:16 ckasj syslogTest[17564]: Howdy Pardner
Feb 5 20:49:25 ckasj sshd(pam_unix)[17579]: session opened for user root by root(uid=0)
Feb 5 20:49:57 ckasj smbd[16958]: [2007/02/05 20:49:57, 0] lib/util_sock.c:read_socket_data(384) 
Feb 5 20:49:57 ckasj smbd[16958]: read_socket_data: recv failure for 2751. Error = Connection timed out 
Feb 5 20:50:47 ckasj syslogTest[17614]: Howdy Pardner







这篇关于ACE提供的日志记录器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/195014

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性