log4cplus 输出日志

熟悉java的人都知道log4j。log4cplus 是C++版本的log4j。具体区别比较可以参考https://blog.csdn.net/jmppok/article/details/17357073

log4cplus 主要由三大组件构成

log4cxx有三个主要组件:loggers(记录器),appenders(输出源)和layout(布局)。可以简单理解为日志类别,要输出的地方,输出形式。

1) Loggers

2) Appenders

3) Layouts

综合使用三大组件可以轻松记录信息的类别和级别,并可以在运行时控制日志输出的样式和位置。

 详细的配置选项可以参考文章https://blog.csdn.net/u012632043/article/details/79746573。这里我就不过多叙述了。本文专注于如何快速使用log4cplus输出日志信息,配置细节等需要的时候去看。

  • 源码下载

地址:https://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.2.0/

解压结构:

  • 编译

打开msvc10文件夹,默认是vs2010的项目,我用vs2013打开,编译通过。项目结构概述如下

Tests: 对log4cplus 各个部分编写的测试用例,如果需要可以关注一下。

log4cplus: 编译出静态库

log4cplusS: 编译生成静态库

loggingserver: 这个项目有大用,针对的是分布式系统,日志统一输出的场景。 通过SocketAppender将日志输出到一个指定的log server上,在一台服务器上可以查看完整的日志记录,不需要登陆多台服务器。详细使用信息可以参考https://my.oschina.net/u/2326085/blog/391372?p=1

  • 运行

运行的时候通过一个简单的类进行封装,但是遇到一个问题,如果通过静态文件进行集成,一直提示无法加载配置文件,后来切换为通过动态库的形式才不报错了。不清楚是我程序设置的问题,还是log4cplus 1.2的版本确实存在这个问题。

简单封装如下

#pragma once
#include <xstring>
#include <mutex>
#include <log4cplus/logger.h>

class CCLogMgrImpl
{
public:
	static CCLogMgrImpl * Get()
	{
		return m_instance;
	}
	virtual ~CCLogMgrImpl();

private:
	CCLogMgrImpl();
	static CCLogMgrImpl* m_instance;

public:
	void OutPutWarnning(const std::string& str);
	void OutPutError(const std::string& str);
	void OutPutDebug(const std::string& str);
	void OutPutInfo(const std::string& str);
	void OutPutFatal(const std::string& str);

private:
	std::mutex m_mutex;
	log4cplus::Logger m_logMgr;
};

 

#include "stdafx.h"
#include "CLogMgrImpl.h"

#include <string>
#include <cstdio>
#include <log4cplus/configurator.h>
#include <log4cplus/appender.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/loglevel.h>
#include <log4cplus/tstring.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/helpers/loglog.h>

using namespace log4cplus::helpers;
//外部初始化 before invoke main
CCLogMgrImpl* CCLogMgrImpl::m_instance = new CCLogMgrImpl();


CCLogMgrImpl::CCLogMgrImpl()
{
	log4cplus::initialize();
	try
	{
		// 加载配置文件: "log4cplus.properties"
		log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.properties"));
		m_logMgr = log4cplus::Logger::getInstance("logmgr");
	}
	catch (...)
	{
	}
}


void CCLogMgrImpl::OutPutWarnning(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_WARN(m_logMgr, LOG4CPLUS_TEXT(str));
}

void CCLogMgrImpl::OutPutError(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_ERROR(m_logMgr, LOG4CPLUS_TEXT(str));
}

void CCLogMgrImpl::OutPutDebug(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_DEBUG(m_logMgr, LOG4CPLUS_TEXT(str));
}

void CCLogMgrImpl::OutPutInfo(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_INFO(m_logMgr, LOG4CPLUS_TEXT(str));
}

void CCLogMgrImpl::OutPutFatal(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_FATAL(m_logMgr, LOG4CPLUS_TEXT(str));
}

CCLogMgrImpl::~CCLogMgrImpl()
{
	log4cplus::Logger::shutdown();
}

 

配置文件如下, 配置信息参考https://blog.csdn.net/u010607621/article/details/54944696

#log4cplus.properties
---------------------------------------
#这里命名logger对象。我给logger对象的命名是logmgr(表示输出程序基础运行平台的日志)和loggerMkt(表示输出行情业务相关的日志)
#每个logger对象可以使用多个appender对象(这里有logger,apdMkt)。类似于每次打日志的时候,会输出到多个文件。(ALL是我调试时用的)
log4cplus.logger.logmgr=ALL, logger

#开启追加模式
log4cplus.rootLogger = TRACE, MyAppend 
log4cplus.appender.MyAppend.Append = true

#对appender对象logger进行设置。TimeBasedRollingFileAppender可以按日期转储日志文件
log4cplus.appender.logger=log4cplus::TimeBasedRollingFileAppender
log4cplus.appender.logger.FilenamePattern=log/%d{yyyy-MM-dd}/radar.log
log4cplus.appender.logger.Append=true
log4cplus.appender.logger.MaxHistory=999
log4cplus.appender.logger.ImmediateFlush=true
log4cplus.appender.logger.RollOnClose=false
log4cplus.appender.logger.CreateDirs=true
log4cplus.appender.logger.layout=log4cplus::PatternLayout
log4cplus.appender.logger.layout.ConversionPattern=[%T] %D{%Y-%m-%d %H:%M:%S.%q} %-5p - %m [%c]%n

#可不配置。日志文件会按此等级范围显示
#log4cplus.appender.apdRoot.filters.1=log4cplus::spi::LogLevelRangeFilter
#log4cplus.appender.apdRoot.filters.1.LogLevelMin=ERROR
#log4cplus.appender.apdRoot.filters.1.LogLevelMax=FATAL
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章