🎈C++实现日志功能:简单实现及第三方库汇总🎈
🎈C++实现日志功能:log4c(Win10+VS2017)🎈
🎈C++实现日志功能:log4cplus(Win10+VS2017)🎈
文章目录
- 1、log4cplus开源库简介
- 2、基本元素
- 3、使用步骤
- 4、测试示例
- 例子1:最简单的例子。
- 例子2:ConsoleAppender。
- 例子3:ConsoleAppender+SimpleLayout。
- 例子4:ConsoleAppender+PatternLayout。
- 例子5:ConsoleAppender+TTCCLayout。
- 例子6:FileAppender。
- 例子7:FileAppender+PatternLayout。
- 例子8:RollingFileAppender+PatternLayout。
- 例子9:DailyRollingFileAppender+PatternLayout。
- 例子10:PropertyConfigurator
- 例子11:SocketAppender
- 后续
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、使用步骤
- 实例化一个appender对象
- 实例化一个layout对象
- 将layout对象绑定(attach)到appender对象
- 实例化一个logger对象,调用静态函数:log4cplus::Logger::getInstance(“logger_name”)
- 将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger
- 设置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???
谢谢各位小伙伴们啦( ´ ▽ ‘)ノ ( ´ ▽ ` )っ!!!