【小沐学C++】C++实现日志功能:log4cplus(Win10+VS2017)

🎈C++实现日志功能:简单实现及第三方库汇总🎈
🎈C++实现日志功能:log4c(Win10+VS2017)🎈
🎈C++实现日志功能:log4cplus(Win10+VS2017)🎈

1、log4cplus开源库简介

https://sourceforge.net/projects/log4cplus/
https://github.com/log4cplus/log4cplus

  • log4cplus is a simple to use C++ logging API providing thread-safe, flexible, and arbitrarily granular control over log management and configuration. It is modelled after the Java log4j API.
  • log4cplus是一个易于使用的C ++ 日志记录API,log4cplus具有灵活、强大、使用简单、多线程安全的特点。通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期;你可以选择将信息输出到屏幕、文件、甚至是远程服务器;通过指定策略对日志进行定期备份等等。
  • Last Update: 2021-08-09
  • Last Version: 2.0.7 ( 2021-08-09 )

2、基本元素

  • Layout:布局器,控制输出消息的格式。log4cplus提供了三种类型的Layouts,
    分别是SimpleLayout、PatternLayout、和TTCCLayout。
  • Appender:挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的设备终端(如控制台,文件)。
  • Logger:记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对象进行记录时,就需要生成一个logger。

3、使用步骤

  1. 实例化一个appender对象
  2. 实例化一个layout对象
  3. 将layout对象绑定(attach)到appender对象
  4. 实例化一个logger对象,调用静态函数:log4cplus::Logger::getInstance(“logger_name”)
  5. 将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger
  6. 设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录。
    日志输出级别:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

4、测试示例

以下例子基于log4cplus2.0.7进行编写和测试。

例子1:最简单的例子。

#include "log4cplus/logger.h"
#include "log4cplus/consoleappender.h"
#include "log4cplus/loglevel.h"
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>
#include <log4cplus/configurator.h>
#include <iomanip>

using namespace std;
using namespace log4cplus;

int main()
{
	// Initialization and deinitialization.
	log4cplus::Initializer initializer;

	BasicConfigurator config;
	config.configure();

	Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));

	LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
	return 0;
}

在这里插入图片描述

例子2:ConsoleAppender。

#include <log4cplus/logger.h>
#include <log4cplus/initializer.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/loggingmacros.h>
#include <iomanip>

using namespace log4cplus;

int main()
{
	log4cplus::Initializer initializer;

	/* step 1: Instantiate an appender object */
	SharedAppenderPtr _append(new ConsoleAppender());
	_append->setName("append test");

	/* step 4: Instantiate a logger object */
	Logger _logger = Logger::getInstance("test");

	/* step 5: Attach the appender object to the logger  */
	_logger.addAppender(_append);

	/* step 6: Set a priority for the logger  */
	_logger.setLogLevel(ALL_LOG_LEVEL);

	/* log activity */
	LOG4CPLUS_TRACE(_logger, "This is" << " just a t" << "est." << std::endl);
	LOG4CPLUS_DEBUG(_logger, "Enteringloop#");

	return 0;
}

在这里插入图片描述

例子3:ConsoleAppender+SimpleLayout。

#include "log4cplus/logger.h"
#include "log4cplus/consoleappender.h"
#include "log4cplus/loglevel.h"
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>
#include <iomanip>

using namespace std;
using namespace log4cplus;

int main()
{
	log4cplus::Initializer initializer;
	 //helpers::LogLog::getLogLog()->setInternalDebugging(true);

	/* step 1:  Instantiate an appender object */
	helpers::SharedObjectPtr<Appender>  _append(new ConsoleAppender());

	_append->setName("append for  test");

	/* step 2:  Instantiate a layout object */
	/* step 3: Attach  the layout object to the appender */
	_append->setLayout(std::unique_ptr<Layout>(new SimpleLayout()));

	/* step 4:  Instantiate a logger object */
	Logger _logger = Logger::getInstance("test");

	/* step 5: Attach  the appender object to the logger  */
	_logger.addAppender(_append);

	/* log activity */
	LOG4CPLUS_DEBUG(_logger, "This  is the simple formatted log message...");
	LOG4CPLUS_DEBUG(_logger, "This is a bool: " << true);
	LOG4CPLUS_INFO(_logger, "This is a char: " << 'x');
	LOG4CPLUS_WARN(_logger, "The following message is empty:");

	return 0;
}

在这里插入图片描述

例子4:ConsoleAppender+PatternLayout。

#include "log4cplus/logger.h"
#include "log4cplus/consoleappender.h"
#include "log4cplus/loglevel.h"
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>
#include <log4cplus/configurator.h>
#include <iomanip>

using namespace std;
using namespace log4cplus;

int main()
{
	// Initialization and deinitialization.
	log4cplus::Initializer initializer;

	//Appender
	helpers::SharedObjectPtr<Appender> _append(new ConsoleAppender(false, true));
	_append->setName(LOG4CPLUS_TEXT("Console"));

	//Layout
	std::string pattern = "%D{%m/%d/%y %H:%M:%S,%q} [%-5t] [%-5p] - %m%n";
	_append->setLayout(std::auto_ptr<Layout>(new PatternLayout(pattern)));

	//Logger
	Logger test = Logger::getInstance(LOG4CPLUS_TEXT("test"));
	test.addAppender(_append);

	for (int i = 0; i < 10; ++i)
	{
		LOG4CPLUS_DEBUG(test, "Entering loop #" << i);
	}

	// set log level
	test.setLogLevel(DEBUG_LOG_LEVEL);

	Logger test2 = Logger::getInstance(LOG4CPLUS_TEXT("test.subtest"));
	for (int i = 0; i < 5; ++i)
	{
		LOG4CPLUS_ERROR(test2, "click count ~" << i+100);
	}

	return 0;
}

在这里插入图片描述

例子5:ConsoleAppender+TTCCLayout。

#include <log4cplus/logger.h>
#include <log4cplus/initializer.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/helpers/property.h>
#include <iomanip>

using namespace log4cplus;

int main()
{
	log4cplus::Initializer initializer;

	/* step 1: Instantiate an appender object */
	SharedAppenderPtr _append(new ConsoleAppender());
	_append->setName("append test");

	/* step 2: Instantiate a layout object */
	/* step 3: Attach the layout object to the appender */
	tistringstream propsStream(
		LOG4CPLUS_TEXT("DateFormat=%m/%d/%y %H:%M:%S,%q\n")
		LOG4CPLUS_TEXT("CategoryPrefixing=true")
		LOG4CPLUS_TEXT("ThreadPrinting=true")
		LOG4CPLUS_TEXT("ContextPrinting=true")
		LOG4CPLUS_TEXT("Use_gmtime=false\n"));
	helpers::Properties props(propsStream);
	_append->setLayout(std::auto_ptr<Layout>(new TTCCLayout(props)));
	
	/* step 4: Instantiate a logger object */
	Logger _logger = Logger::getInstance("test");

	/* step 5: Attach the appender object to the logger  */
	_logger.addAppender(_append);

	/* log activity */
	LOG4CPLUS_TRACE(_logger, "This is" << " just a t" << "est." << std::endl);
	LOG4CPLUS_DEBUG(_logger, "Enteringloop#");

	return 0;
}

在这里插入图片描述

例子6:FileAppender。

#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/loglevel.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>
#include <log4cplus/fileappender.h>

using namespace std;
using namespace log4cplus;

int main()
{
	// Initialization and deinitialization.
	log4cplus::Initializer initializer;

	/*step1:Instantiateanappenderobject*/
	SharedAppenderPtr _append(new FileAppender("Test.log"));
	_append->setName("file_log_test");

	/*step4: Instantiate an logger object*/
	Logger _logger = Logger::getInstance("test.subtestof_filelog");

	/*step5: Attach the appender object to the logger*/
	_logger.addAppender(_append);

	/*log activity*/
	for (int i = 0; i < 5; ++i) {
		LOG4CPLUS_DEBUG(_logger, "Enteringloop#" << i << "Endline#");
	}

	return 0;
}

在这里插入图片描述

例子7:FileAppender+PatternLayout。

#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/loglevel.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>
#include <log4cplus/fileappender.h>

using namespace std;
using namespace log4cplus;

int main()
{
	// Initialization and deinitialization.
	log4cplus::Initializer initializer;

	/* step 1: Instantiate an appender object */
	SharedAppenderPtr _append(new FileAppender("Test.log"));
	_append->setName("file_log_test");

	/* step 2: Instantiate a layout object */
	/* step 3: Attach the layout object to the appender */
	std::string pattern = "%D{%m/%d/%y %H:%M:%S,%q} [%-5t] [%-5p] - %m%n";
	_append->setLayout(std::auto_ptr<Layout>(new PatternLayout(pattern)));

	/* 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);

	/* step 6: Set a priority for the logger  */
	_logger.setLogLevel(ALL_LOG_LEVEL);

	/*log activity*/
	for (int i = 0; i < 5; ++i) {
		//NDCContextCreator _context("loop");
		LOG4CPLUS_DEBUG(_logger, "Enteringloop#" << i << "Endline#");
	}

	return 0;
}

在这里插入图片描述

例子8:RollingFileAppender+PatternLayout。

#include <log4cplus/logger.h>
#include <log4cplus/initializer.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/helpers/property.h>
#include <iomanip>

using namespace log4cplus;

int main()
{
	log4cplus::Initializer initializer;

	/* step 1: Instantiate an appender object */
	SharedAppenderPtr  _append(new RollingFileAppender("Test.log", 300 * 1024, 5));
	_append->setName("append test");

	/* step 2: Instantiate a layout object */
	/* step 3: Attach the layout object to the appender */
	std::string pattern = "%D{%m/%d/%y %H:%M:%S,%q} [%-5t] [%-5p] - %m%n";
	_append->setLayout(std::auto_ptr<Layout>(new PatternLayout(pattern)));
	
	/* step 4: Instantiate a logger object */
	Logger test = Logger::getInstance("test");

	/* step 5: Attach the appender object to the logger  */
	test.addAppender(_append);

	/* log activity */
	for (int i = 0; i < 100000; ++i) {
		LOG4CPLUS_DEBUG(test, "Entering  loop #" << i);
	}

	return 0;
}

在这里插入图片描述

例子9:DailyRollingFileAppender+PatternLayout。

#include <log4cplus/logger.h>
#include <log4cplus/initializer.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/helpers/property.h>
#include <log4cplus/ndc.h>
#include <iomanip>

using namespace log4cplus;

int main()
{
	log4cplus::Initializer initializer;

	/* step 1: Instantiate an appender object */
	SharedAppenderPtr  _append(new  DailyRollingFileAppender("Test.log", MINUTELY, true, 5));
	_append->setName("append test");

	/* step 2: Instantiate a layout object */
	/* step 3: Attach the layout object to the appender */
	std::string pattern = "%D{%m/%d/%y %H:%M:%S,%q} [%-5t] [%-5p] - %m%n";
	_append->setLayout(std::auto_ptr<Layout>(new PatternLayout(pattern)));
	
	/* step 4: Instantiate a logger object */
	Logger test = Logger::getInstance("test");

	/* step 5: Attach the appender object to the logger  */
	test.addAppender(_append);

	/* log activity */
	for (int i = 0; i < 12*3; ++i) {
		//NDCContextCreator _context("loop");
		std::this_thread::sleep_for(std::chrono::seconds(5));
		LOG4CPLUS_DEBUG(test, "Entering  loop #" << i);
	}

	return 0;
}

在这里插入图片描述

例子10:PropertyConfigurator

  • mylog.properties:
log4cplus.rootLogger=TRACE, ALL_MSGS, TRACE_MSGS, DEBUG_INFO_MSGS, FATAL_MSGS

####################################################################
log4cplus.appender.logConsole=log4cplus::ConsoleAppender
log4cplus.appender.logConsole.Encoding=utf-8
log4cplus.appender.logConsole.layout=log4cplus::PatternLayout
log4cplus.appender.logConsole.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S}] %-5p %m %n

####################################################################
log4cplus.appender.STDOUT=log4cplus::ConsoleAppender
log4cplus.appender.STDOUT.Encoding=utf-8
log4cplus.appender.STDOUT.layout=log4cplus::PatternLayout
log4cplus.appender.STDOUT.layout.ConversionPattern=%D{[%Y-%m-%d %H:%M:%S.%q]} [%-5p] [%c{2}] - %m [%l]%n

####################################################################
#Appender输出位置类型有:文件输出 设置日志追加到文件尾
log4cplus.appender.ALL_MSGS=log4cplus::RollingFileAppender
#设置输出日志路径
log4cplus.appender.ALL_MSGS.File=./log/all_msgs.log
log4cplus.appender.ALL_MSGS.CreateDirs=true
#设置日志文件大小
log4cplus.appender.ALL_MSGS.MaxFileSize=1024KB
#设置生成日志最大个数
log4cplus.appender.ALL_MSGS.MaxBackupIndex=20
#日志输出格式 有词法分析功能的模式布局器
log4cplus.appender.ALL_MSGS.layout=log4cplus::PatternLayout
log4cplus.appender.ALL_MSGS.layout.ConversionPattern=@@@[%d %d{%Z %Q}][pthread_id:%t][%l][%-5p][%c{2}] - %m%n 
#log4cplus.appender.ALL_MSGS.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n

####################################################################
log4cplus.appender.TRACE_MSGS=log4cplus::RollingFileAppender
log4cplus.appender.TRACE_MSGS.File=./log/trace_msgs.log
log4cplus.appender.TRACE_MSGS.CreateDirs=true
log4cplus.appender.TRACE_MSGS.layout=log4cplus::TTCCLayout
log4cplus.appender.TRACE_MSGS.filters.1=log4cplus::spi::LogLevelMatchFilter
log4cplus.appender.TRACE_MSGS.filters.1.LogLevelToMatch=TRACE
log4cplus.appender.TRACE_MSGS.filters.1.AcceptOnMatch=true
log4cplus.appender.TRACE_MSGS.filters.2=log4cplus::spi::DenyAllFilter

####################################################################
log4cplus.appender.DEBUG_INFO_MSGS=log4cplus::RollingFileAppender
log4cplus.appender.DEBUG_INFO_MSGS.File=./log/debug_info_msgs.log
log4cplus.appender.DEBUG_INFO_MSGS.CreateDirs=true
log4cplus.appender.DEBUG_INFO_MSGS.layout=log4cplus::TTCCLayout
log4cplus.appender.DEBUG_INFO_MSGS.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.DEBUG_INFO_MSGS.filters.1.LogLevelMin=DEBUG
log4cplus.appender.DEBUG_INFO_MSGS.filters.1.LogLevelMax=INFO
log4cplus.appender.DEBUG_INFO_MSGS.filters.1.AcceptOnMatch=true
log4cplus.appender.DEBUG_INFO_MSGS.filters.2=log4cplus::spi::DenyAllFilter

####################################################################
log4cplus.appender.FATAL_MSGS=log4cplus::TimeBasedRollingFileAppender
log4cplus.appender.FATAL_MSGS.FilenamePattern=./log/fatal_msgs.%d{yyyyMMdd}.log
log4cplus.appender.FATAL_MSGS.Schedule=DAILY
log4cplus.appender.FATAL_MSGS.MaxHistory=365

log4cplus.appender.FATAL_MSGS.Append=true
log4cplus.appender.FATAL_MSGS.RollOnClose=false
log4cplus.appender.FATAL_MSGS.CreateDirs=true

#设置日志文件大小
log4cplus.appender.FATAL_MSGS.MaxFileSize=10MB
log4cplus.appender.FATAL_MSGS.MaxBackupIndex=5
log4cplus.appender.FATAL_MSGS.Encoding=utf-8

log4cplus.appender.FATAL_MSGS.layout=log4cplus::PatternLayout
log4cplus.appender.FATAL_MSGS.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S}] %-5p %m %n	

#匹配相同日志级别,只有INFO日志才输入到该文件中
log4cplus.appender.FATAL_MSGS.filters.1=log4cplus::spi::LogLevelMatchFilter
log4cplus.appender.FATAL_MSGS.filters.1.LogLevelToMatch=FATAL
log4cplus.appender.FATAL_MSGS.filters.1.AcceptOnMatch=true
log4cplus.appender.FATAL_MSGS.filters.2=log4cplus::spi::DenyAllFilter

####################################################################
log4cplus.appender.RemoteServer=log4cplus::SocketAppender
log4cplus.appender.RemoteServer.host=192.168.1.130
log4cplus.appender.RemoteServer.port=9000

log4cplus.appender.RemoteServer2=log4cplus::SocketAppender
log4cplus.appender.RemoteServer2.host=192.168.1.131
log4cplus.appender.RemoteServer2.port=9001

  • main.cxx:
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/stringhelper.h>

using namespace log4cplus;
static Logger logger = Logger::getInstance("log");

void printDebug()
{
	LOG4CPLUS_TRACE_METHOD(logger, "::printDebug()");
	LOG4CPLUS_DEBUG(logger, "This is a DEBUG message");
	LOG4CPLUS_INFO(logger, "This is a INFO message");
	LOG4CPLUS_WARN(logger, "This is a WARN message");
	LOG4CPLUS_ERROR(logger, "This is a ERROR message");
	LOG4CPLUS_FATAL(logger, "This is a FATAL message");
}

int main()
{
	Logger root = Logger::getRoot();
	PropertyConfigurator::doConfigure("mylog.properties");
	printDebug();

	return 0;
}

在这里插入图片描述

  • mylogC.conf:
log4cplus.logger.mylog = ALL, console
log4cplus.appender.console = log4cplus::ConsoleAppender
log4cplus.appender.console.layout = log4cplus::PatternLayout
log4cplus.appender.console.layout.ConversionPattern = %D{%m/%d/%y %H:%M:%S,%q} [%-5p] - %m%n
  • main.cxx:
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/stringhelper.h>

using namespace log4cplus;
static Logger logger = Logger::getInstance("mylog");

void printDebug()
{
	LOG4CPLUS_TRACE_METHOD(logger, "::printDebug()");
	LOG4CPLUS_TRACE(logger, "This is a TRACE message");
	LOG4CPLUS_DEBUG(logger, "This is a DEBUG message");
	LOG4CPLUS_INFO(logger, "This is a INFO message");
	LOG4CPLUS_WARN(logger, "This is a WARN message");
	LOG4CPLUS_ERROR(logger, "This is a ERROR message");
	LOG4CPLUS_FATAL(logger, "This is a FATAL message");
}
int main()
{
	Logger root = Logger::getRoot();
	PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("mylogC.conf"));
	printDebug();

	return 0;
}

在这里插入图片描述

  • mylogF.conf:
log4cplus.logger.mylog = ALL, file
log4cplus.appender.file = log4cplus::FileAppender
log4cplus.appender.file.File = ./log/myapp.log
log4cplus.appender.file.MaxFileSize = 10M
log4cplus.appender.file.Append = true
log4cplus.appender.file.layout = log4cplus::PatternLayout
log4cplus.appender.file.layout.ConversionPattern = [%D{%m/%d/%y %H:%M:%S,%q} %-5p] - %m%n
  • main.cxx:
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/stringhelper.h>

using namespace log4cplus;
static Logger logger = Logger::getInstance("mylog");

void printDebug()
{
	LOG4CPLUS_TRACE_METHOD(logger, "::printDebug()");
	LOG4CPLUS_TRACE(logger, "This is a TRACE message");
	LOG4CPLUS_DEBUG(logger, "This is a DEBUG message");
	LOG4CPLUS_INFO(logger, "This is a INFO message");
	LOG4CPLUS_WARN(logger, "This is a WARN message");
	LOG4CPLUS_ERROR(logger, "This is a ERROR message");
	LOG4CPLUS_FATAL(logger, "This is a FATAL message");
}
int main()
{
	Logger root = Logger::getRoot();
	PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("mylogF.conf"));
	printDebug();

	return 0;
}

在这里插入图片描述

例子11:SocketAppender

  • 服务器端server:
#include <iostream>

#include <log4cplus/config.h>
#include <log4cplus/configurator.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/socketappender.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/socket.h>
#include <log4cplus/thread/threads.h>
#include <log4cplus/spi/loggerimpl.h>
#include <log4cplus/spi/loggingevent.h>

#ifdef _DEBUG
#pragma comment(lib, "log4cplusD.lib")
#else
#pragma comment(lib, "log4cplus.lib")
#endif

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
using namespace log4cplus::thread;

namespace loggingserver
{
	class ClientThread : public AbstractThread
	{
	public:

		ClientThread(Socket clientsock) : _clientsock(std::move(clientsock)) {
			cout << "Received a client connection!" << endl;
		}

		~ClientThread() {
			cout << "Client  connection closed." << endl;
		}

		virtual void run()
		{
			while (1) {
				if (!_clientsock.isOpen()) {
					return;
				}

				SocketBuffer msgSizeBuffer(sizeof(unsigned int));
				if (!_clientsock.read(msgSizeBuffer)) {
					return;
				}

				unsigned int msgSize = msgSizeBuffer.readInt();
				SocketBuffer buffer(msgSize);
				if (!_clientsock.read(buffer)) {
					return;
				}

				spi::InternalLoggingEvent event = readFromBuffer(buffer);
				Logger logger = Logger::getInstance(event.getLoggerName());
				logger.callAppenders(event);

				cout << "getLoggerName: " << event.getLoggerName() ;
				cout << ", getLogLevel: " << event.getLogLevel();
				cout << ", getMessage: " << event.getMessage()  << endl;
			}

		}

	private:
		Socket _clientsock;
	};
}

int main(int argc, char** argv)
{
	/*if (argc < 3) {
		cout << "Usage: port  config_file" << endl;
		return 1;
	}

	int port = atoi(argv[1]);
	tstring configFile = LOG4CPLUS_C_STR_TO_TSTRING(argv[2]);
	*/
	int port = 9998;
	tstring configFile = LOG4CPLUS_C_STR_TO_TSTRING("myconfig.properties");

	PropertyConfigurator config(configFile);
	config.configure();

	ServerSocket serverSocket(port);

	while (1) {
		loggingserver::ClientThread* thr = new loggingserver::ClientThread(serverSocket.accept());
		thr->start();
	}

	return 0;
}
  • 客户端client:
#include <log4cplus/log4cplus.h>
#include <iomanip>

using namespace std;
using namespace log4cplus;

int main(int argc, char **argv)
{
    log4cplus::Initializer initializer;

    std::this_thread::sleep_for (std::chrono::seconds (1));
    tstring serverName = (argc > 1
        ? LOG4CPLUS_C_STR_TO_TSTRING(argv[1]) : tstring());
    tstring host = LOG4CPLUS_TEXT("localhost");
    SharedAppenderPtr append_1(new SocketAppender(host, 9998, serverName));
    append_1->setName( LOG4CPLUS_TEXT("First") );
    Logger::getRoot().addAppender(append_1);

    Logger root = Logger::getRoot();
    Logger test = Logger::getInstance( LOG4CPLUS_TEXT("socket.test") );

    LOG4CPLUS_DEBUG(root,
                    "This is"
                    << " a reall"
                    << "y long message." << endl
                    << "Just testing it out" << endl
                    << "What do you think?");
    test.setLogLevel(NOT_SET_LOG_LEVEL);
    LOG4CPLUS_DEBUG(test, "This is a bool: " << true);
    LOG4CPLUS_INFO(test, "This is a char: " << 'x');
    LOG4CPLUS_INFO(test, "This is a short: " << static_cast<short>(-100));
    LOG4CPLUS_INFO(test, "This is a unsigned short: "
        << static_cast<unsigned short>(100));
    std::this_thread::sleep_for (std::chrono::microseconds (500));
    LOG4CPLUS_INFO(test, "This is a int: " << 1000);
    LOG4CPLUS_INFO(test, "This is a unsigned int: " << 1000u);
    LOG4CPLUS_INFO(test, "This is a long(hex): " << hex << 100000000l);
    LOG4CPLUS_INFO(test, "This is a unsigned long: " << 100000000ul);
    LOG4CPLUS_WARN(test, "This is a float: " << 1.2345f);
    LOG4CPLUS_ERROR(test,
                    "This is a double: "
                    << setprecision(15)
                    << 1.2345234234);
    LOG4CPLUS_FATAL(test,
                    "This is a long double: "
                    << setprecision(15)
                    << 123452342342.342L);


    return 0;
}

服务器端运行结果截图:
在这里插入图片描述

后续

如果你觉得这些文字有一点点用处,可以给作者点个赞;╮( ̄▽ ̄)╭
如果你感觉作者写的不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进。o_O???
谢谢各位小伙伴们啦( ´ ▽ ‘)ノ ( ´ ▽ ` )っ!!!

  • 15
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值