开源日志系统log4cplus(二)

简介:
本文介绍了使用log4cplus有六个步骤,并提供了一些例子引导你了解log4cplus的基本使用。

				
### 基本使用 ###
使用log4cplus有六个基本步骤:
1. 实例化一个appender对象
2. 实例化一个layout对象
3. 将layout对象绑定(attach)到appender对象
4. 实例化一个logger对象,调用静态函数:log4cplus::Logger::getInstance("logger_name")
5. 将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger
6. 设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录
下面通过一些例子来了解log4cplus的基本使用。
〖例1〗
ExpandedBlockStart.gif /*    严格实现步骤1-6,appender输出到屏幕, 其中的布局格式和LogLevel后面会详细解释。*/
None.gif#include <log4cplus/logger.h>
None.gif#include <log4cplus/consoleappender.h>
None.gif#include <log4cplus/layout.h>
None.gif using  namespace log4cplus;
None.gif using  namespace log4cplus::helpers;
None.gif int main()
ExpandedBlockStart.gif {
ExpandedSubBlockStart.gif    /* step 1: Instantiate an appender object */
InBlock.gif    SharedObjectPtr _append (new ConsoleAppender());
InBlock.gif    _append->setName("append for test");
ExpandedSubBlockStart.gif    /* step 2: Instantiate a layout object */
InBlock.gif    std::string pattern = "%d{%m/%d/%y %H:%M:%S}  - %m [%l]%n";
InBlock.gif    std::auto_ptr _layout(new PatternLayout(pattern));
ExpandedSubBlockStart.gif    /* step 3: Attach the layout object to the appender */
InBlock.gif    _append->setLayout( _layout );
ExpandedSubBlockStart.gif    /* step 4: Instantiate a logger object */
InBlock.gif    Logger _logger = Logger::getInstance("test");
ExpandedSubBlockStart.gif    /* step 5: Attach the appender object to the logger  */
InBlock.gif    _logger.addAppender(_append);
ExpandedSubBlockStart.gif    /* step 6: Set a priority for the logger  */
InBlock.gif    _logger.setLogLevel(ALL_LOG_LEVEL);
ExpandedSubBlockStart.gif     /* log activity */ 
InBlock.gif   LOG4CPLUS_DEBUG(_logger, "This is the FIRST log messagedot.gif")
InBlock.gif    sleep(1);
InBlock.gif    LOG4CPLUS_WARN(_logger, "This is the SECOND log messagedot.gif")
InBlock.gif    return 0;
ExpandedBlockEnd.gif}

None.gif
输出结果:
10/14/04 09:06:24  - This is the FIRST log message... [main.cpp:31]
10/14/04 09:06:25  - This is the SECOND log message... [main.cpp:33]
				
〖例2〗
ExpandedBlockStart.gif /*    简洁使用模式,appender输出到屏幕。*/
None.gif#include <log4cplus/logger.h>
None.gif#include <log4cplus/consoleappender.h>
None.gif using  namespace log4cplus;
None.gif using  namespace log4cplus::helpers;
None.gif int main()
ExpandedBlockStart.gif {
ExpandedSubBlockStart.gif    /* step 1: Instantiate an appender object */
InBlock.gif    SharedAppenderPtr _append(new ConsoleAppender());
InBlock.gif    _append->setName("append test");
ExpandedSubBlockStart.gif    /* step 4: Instantiate a logger object */
InBlock.gif    Logger _logger = Logger::getInstance("test");
ExpandedSubBlockStart.gif    /* step 5: Attach the appender object to the logger  */
InBlock.gif    _logger.addAppender(_append);
ExpandedSubBlockStart.gif    /* log activity */
InBlock.gif    LOG4CPLUS_DEBUG(_logger, "This is the FIRST log messagedot.gif")
InBlock.gif    sleep(1);
InBlock.gif    LOG4CPLUS_WARN(_logger, "This is the SECOND log messagedot.gif")
InBlock.gif    return 0;
ExpandedBlockEnd.gif}

None.gif
输出结果:
DEBUG - This is the FIRST log message...
WARN - This is the SECOND log message...
				
〖例3〗
 
ExpandedBlockStart.gif /*    iostream模式,appender输出到屏幕。*/
None.gif#include <log4cplus/logger.h>
None.gif#include <log4cplus/consoleappender.h>
None.gif#include <iomanip> 
ExpandedBlockStart.gif /* 其实这个东东还是放到log4cplus头文件中比较合适些,个人意见:) */
None.gif using  namespace log4cplus;
None.gif int main()
ExpandedBlockStart.gif {
ExpandedSubBlockStart.gif    /* step 1: Instantiate an appender object */
InBlock.gif SharedAppenderPtr _append(new ConsoleAppender()); 
InBlock.gif   _append->setName("append test");
ExpandedSubBlockStart.gif    /* step 4: Instantiate a logger object */
InBlock.gif    Logger _logger = Logger::getInstance("test");
ExpandedSubBlockStart.gif    /* step 5: Attach the appender object to the logger  */ 
InBlock.gif _logger.addAppender(_append);
ExpandedSubBlockStart.gif    /* log activity */
InBlock.gif   LOG4CPLUS_TRACE(_logger, "This is"  << " just a t" << "est." << std::endl) 
InBlock.gif  LOG4CPLUS_DEBUG(_logger, "This is a bool: " << true
InBlock.gif   LOG4CPLUS_INFO(_logger, "This is a char: " << 'x')
InBlock.gif    LOG4CPLUS_WARN(_logger, "This is a int: " << 1000)
InBlock.gif    LOG4CPLUS_ERROR(_logger, "This is a long(hex): " << std::hex << 100000000) 
InBlock.gif LOG4CPLUS_FATAL(_logger, "This is a double: "  << std::setprecision(15)  << 1.2345234234)
InBlock.gif    return 0;
ExpandedBlockEnd.gif}

None.gif

输出结果:
DEBUG - This is a bool: 1
INFO - This is a char: x
WARN - This is a int: 1000
ERROR - This is a long(hex): 5f5e100
FATAL - This is a double: 1.2345234234
				
〖例4〗
ExpandedBlockStart.gif /*    调试模式,通过loglog来控制输出调试、警告或错误信息,appender输出到屏幕。*/
None.gif#include <iostream>
None.gif#include <log4cplus/helpers/loglog.h>
None.gif using  namespace log4cplus::helpers;
None.gif void printMsgs( void)
ExpandedBlockStart.gif
InBlock.gif   std::cout << "Entering printMsgs()dot.gif" << std::endl; 
InBlock.gif   LogLog::getLogLog()->debug("This is a Debug statementdot.gif");
InBlock.gif    LogLog::getLogLog()->warn("This is a Warningdot.gif");
InBlock.gif    LogLog::getLogLog()->error("This is a Errordot.gif"); 
InBlock.gif   std::cout << "Exiting printMsgs()dot.gif" << std::endl << std::endl;
ExpandedBlockEnd.gif}

None.gif int main()
ExpandedBlockStart.gif
ExpandedSubBlockStart.gif   /*       LogLog类实现了debug, warn, error 函数用于输出调试、警告或错误信息,       同时提供了两个方法来进一步控制所输出的信息,其中:
InBlock.gif       setInternalDebugging方法用来控制是否屏蔽输出信息中的调试信息,当输入参数为false则屏蔽,缺省设置为false。
InBlock.gif       setQuietMode方法用来控制是否屏蔽所有输出信息,当输入参数为true则屏蔽,       缺省设置为false。
ExpandedSubBlockEnd.gif       LogLog::getLogLog()->setInternalDebugging(false);    
*/

InBlock.gif    printMsgs();
InBlock.gif    std::cout << "Turning on debugdot.gif" << std::endl;    LogLog::getLogLog()->setInternalDebugging(true);    printMsgs();
InBlock.gif    std::cout << "Turning on quiet modedot.gif" << std::endl; 
InBlock.gif   LogLog::getLogLog()->setQuietMode(true); 
InBlock.gif   printMsgs();
InBlock.gif    return 0;
ExpandedBlockEnd.gif}

None.gif
输出结果:
Entering printMsgs()...
log4cplus:WARN This is a Warning...
log4cplus:ERROR This is a Error...
Exiting printMsgs()...
Turning on debug...
Entering printMsgs()...
log4cplus: This is a Debug statement...
log4cplus:WARN This is a Warning...
log4cplus:ERROR This is a Error...
Exiting printMsgs()...
Turning on quiet mode...
Entering printMsgs()...
Exiting printMsgs()...
需要指出的是,输出信息中总是包含"log4cplus:"前缀,有时候会感觉不爽,这是因为LogLog在实现时候死定了要这么写:
 
None.gifLogLog::LogLog() : mutex(LOG4CPLUS_MUTEX_CREATE),
None.gif   debugEnabled( false),
None.gif   quietMode( false),
None.gif   PREFIX( LOG4CPLUS_TEXT("log4cplus: ") ), 
None.gif  WARN_PREFIX( LOG4CPLUS_TEXT"log4cplus:WARN ") ), 
ExpandedBlockStart.gif  ERR_PREFIX( LOG4CPLUS_TEXT"log4cplus:ERROR ") ) {}
你可以把这些前缀换成自己看着爽的提示符号,然后重新编译,hihi。除非万不得已或者实在郁闷的不行,否则还是不要这样干。
				
〖例5〗
/*     文件模式,appender输出到文件。 */
#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
using  namespace log4cplus;
int main()
{    
/*  step 1: Instantiate an appender object  */
    SharedAppenderPtr _append( new FileAppender("Test.log"));
    _append->setName("file log test");
     /*  step 4: Instantiate a logger object  */
    Logger _logger = Logger::getInstance("test.subtestof_filelog");
     /*  step 5: Attach the appender object to the logger   */
    _logger.addAppender(_append);
     /*  log activity  */
     int i;
     for( i = 0; i < 5; ++i )
    {
        LOG4CPLUS_DEBUG(_logger, "Entering loop #" << i << "End line #")
    }
     return 0;
}
输出结果(Test.log文件):
DEBUG - Entering loop #0End line #
DEBUG - Entering loop #1End line #
DEBUG - Entering loop #2End line #
DEBUG - Entering loop #3End line #
DEBUG - Entering loop #4End line #
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5天前
|
C++
JNI Log 日志输出
JNI Log 日志输出
13 1
|
5天前
|
存储 运维 大数据
聊聊日志硬扫描,阿里 Log Scan 的设计与实践
泛日志(Log/Trace/Metric)是大数据的重要组成,伴随着每一年业务峰值的新脉冲,日志数据量在快速增长。同时,业务数字化运营、软件可观测性等浪潮又在对日志的存储、计算提出更高的要求。
|
12天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
12天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
87 1
|
13天前
|
弹性计算 运维 Shell
|
20天前
|
Java
log4j异常日志过滤规则配置
log4j异常日志过滤规则配置
90 0
|
23天前
|
SQL 存储 监控
SLS 查询新范式:使用 SPL 对日志进行交互式探索
像 Unix 命令一样支持多级管道级联,像加工预览一样实时处理查询结果,更便捷的交互,更丰富的算子,更灵活的探索半结构化日志,快来试试使用 SPL 语言查询日志数据吧~
46307 4
|
24天前
|
Apache
web服务器(Apache)访问日志(access_log)详细解释
web服务器(Apache)访问日志(access_log)详细解释
|
1月前
|
Java Spring
日志精准记录:Spring与Log4j完美整合的实战指南
日志精准记录:Spring与Log4j完美整合的实战指南
244 0
日志精准记录:Spring与Log4j完美整合的实战指南
|
1月前
|
运维 安全 Ubuntu
`/var/log/syslog` 和 `/var/log/messages` 日志详解
`/var/log/syslog` 和 `/var/log/messages` 是Linux系统的日志文件,分别在Debian和Red Hat系发行版中记录系统事件和错误。它们包含时间戳、日志级别、PID及消息内容,由`rsyslog`等守护进程管理。常用命令如`tail`和`grep`用于查看和搜索日志。日志级别从低到高包括`debug`到`emerg`,表示不同严重程度的信息。注意保护日志文件的安全,防止未授权访问,并定期使用`logrotate`进行文件轮转以管理磁盘空间。
157 1