From 0e8abc5beea526b763f562ed2253e5f6ecd08d5e Mon Sep 17 00:00:00 2001 From: taynpg Date: Wed, 17 Jul 2024 12:41:03 +0800 Subject: [PATCH] =?UTF-8?q?demo=EF=BC=9Alog4cpp=E7=9A=84=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 19 ++++++-- CMakeLists.txt | 4 +- log4config.properties | 93 +++++++++++++++++++++++++++++++++++++++ net_server/CMakeLists.txt | 3 +- net_server/main.cpp | 70 ++++++++++++++++++++++++++--- net_server/net_server.cpp | 5 ++- 6 files changed, 179 insertions(+), 15 deletions(-) create mode 100644 log4config.properties diff --git a/.vscode/settings.json b/.vscode/settings.json index 2d072b2..40975be 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,8 @@ { "files.autoSave": "onFocusChange", "editor.fontSize": 15, - "editor.fontFamily": "'Mononoki Nerd Font Mono', 'Mononoki Nerd Font Mono', 'Mononoki Nerd Font Mono'", + "editor.fontFamily": "'JetBrainsMono NFM', 'JetBrainsMono NFM', 'JetBrainsMono NFM'", + "editor.fontLigatures": true, "cmake.configureOnOpen": true, "cmake.debugConfig": { "externalConsole": true, @@ -20,7 +21,7 @@ "args": ["--path", "D:/", "--name", "Java", "-q", "C:/Qt/Qt6.6.3/6.6.3/msvc2019_64", "-t", "2"] }, "cmake.environment": { - "PATH": "${env:PATH};C:/Qt/gnu_6.6.3/bin;" + "PATH": "${env:PATH};C:/Qt/gnu_6.6.3/bin;C:/library/gnu/log4cplus/bin" }, "cmake.options.statusBarVisibility": "visible", "cmake.generator": "Ninja", @@ -118,6 +119,18 @@ "cstdarg": "cpp", "deque": "cpp", "future": "cpp", - "shared_mutex": "cpp" + "shared_mutex": "cpp", + "*.tcc": "cpp", + "coroutine": "cpp", + "cwctype": "cpp", + "memory_resource": "cpp", + "random": "cpp", + "regex": "cpp", + "source_location": "cpp", + "numbers": "cpp", + "semaphore": "cpp", + "span": "cpp", + "stdfloat": "cpp", + "cinttypes": "cpp" } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 19f8a9e..54dcbe8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_PREFIX_PATH "C:/Qt/gnu_6.6.3" - "E:/library/gnu" + "C:/library/gnu" ) if (MSVC) @@ -20,7 +20,7 @@ endif() if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_SYSTEM_NAME MATCHES "Windows") MESSAGE(STATUS "Add MinGW Param.") add_compile_options(-finput-charset=utf-8) - #add_compile_options(-fexec-charset=utf-8) + #add_compile_options(-fexec-charset=GBK) endif() message(STATUS "System: ${CMAKE_SYSTEM_NAME}") diff --git a/log4config.properties b/log4config.properties new file mode 100644 index 0000000..2a31929 --- /dev/null +++ b/log4config.properties @@ -0,0 +1,93 @@ +# ALL TRACE DEBUG INFO WARN ERROR FATAL OFF +log4cplus.rootLogger = TRACE,SA,LC +log4cplus.logger.logConsole = INFO,LC + +# 代码里面通过 log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("logConsole"));获取。 + +#For database stuff, I don't need to logging everything, it's enough printing only errors! +#log4cplus.logger.DatabaseOperations=ERROR +#log4cplus.additivity.file=false + +log4cplus.appender.LC=log4cplus::ConsoleAppender +#log4cplus.appender.LC.EnCoding=utf-8 +log4cplus.appender.LC.EnCoding=GB2312 +log4cplus.appender.LC.layout=log4cplus::PatternLayout +log4cplus.appender.LC.layout.ConversionPattern=[%D{%m/%d/%y %H:%M:%S.%q}][%t][%-5p] %c - %m %n + +#设置日志追加到文件尾 +log4cplus.appender.SA=log4cplus::TimeBasedRollingFileAppender +#log4cplus.appender.SA.File = Mylogger.log +# 必须要先手动创建好log目录;否则无法创建文件 +log4cplus.appender.SA.FilenamePattern= ./%d{yyyy-MM-dd_HH-mm}.log +log4cplus.appender.SA.Schedule = MINUTELY +log4cplus.appender.SA.CreateDirs = true +log4cplus.appender.SA.MaxHistory = 9999 +log4cplus.appender.SA.RollOnClose = false +#设置日志文件大小 +log4cplus.appender.SA.MaxFileSize = 100MB +#设置生成日志最大个数 +log4cplus.appender.SA.MaxBackupIndex = 100 +log4cplus.appender.SA.Append = true +log4cplus.appender.SA.layout=log4cplus::PatternLayout +# log4cplus.appender.SA.layout.ConversionPattern=[%-5p][%D{%m/%d/%y %H:%M:%S:%Q}] [%t] %c - %m [%l]%n +log4cplus.appender.SA.layout.ConversionPattern=[%D{%m/%d/%y %H:%M:%S.%q}][%t][%-5p] %c - %m %n + +#设置日志级别范围 +log4cplus.appender.SA.filters.1=log4cplus::spi::LogLevelRangeFilter +log4cplus.appender.SA.filters.1.LogLevelMin=DEBUG +log4cplus.appender.SA.filters.1.LogLevelMax=FATAL +log4cplus.appender.SA.filters.1.AcceptOnMatch=true +log4cplus.appender.SA.filters.2=log4cplus::spi::DenyAllFilter + +# (1)"%%",转义为%, 即,std::string pattern = "%%" 时输出"%"。 +# (2)"%c",输出logger名称,比如std::string pattern ="%c" 时输出: "test_logger.subtest", +# 也可以控制logger名称的显示层次,比如"%c{1}"时输出"test_logger",其中数字表示层次。 +# (3)"%D",显示本地时间,当std::string pattern ="%D" 时输出:"2004-10-16 18:55:45",%d显示标准时间, +# 所以当std::string pattern ="%d" 时输出"2004-10-16 10:55:45" (因为北京时间位于东8区,差8个小时)。 +# 可以通过%d{...}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的预定义标识符如下: +# %a -- 表示礼拜几,英文缩写形式,比如"Fri" +# %A -- 表示礼拜几,比如"Friday" +# %b -- 表示几月份,英文缩写形式,比如"Oct" +# %B -- 表示几月份,"October" +# %c -- 标准的日期+时间格式,如 "Sat Oct 16 18:56:19 2004" +# %d -- 表示今天是这个月的几号(1-31)"16" +# %H -- 表示当前时刻是几时(0-23),如 "18" +# %I -- 表示当前时刻是几时(1-12),如 "6" +# %j -- 表示今天是哪一天(1-366),如 "290" +# %m -- 表示本月是哪一月(1-12),如 "10" +# %M -- 表示当前时刻是哪一分钟(0-59),如 "59" +# %p -- 表示现在是上午还是下午, AM or PM +# %q -- 表示当前时刻中毫秒部分(0-999),如 "237" +# %Q -- 表示当前时刻中带小数的毫秒部分(0-999.999),如 "430.732" +# %S -- 表示当前时刻的多少秒(0-59),如 "32" +# %U -- 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0-53),如 "41" +# %w -- 表示礼拜几,(0-6, 礼拜天为0),如 "6" +# %W -- 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0-53),如 "41" +# %x -- 标准的日期格式,如 "10/16/04" +# %X -- 标准的时间格式,如 "19:02:34" +# %y -- 两位数的年份(0-99),如 "04" +# %Y -- 四位数的年份,如 "2004" +# %Z -- 时区名,比如 "GMT" +# (4)"%F",输出当前记录器所在的文件名称,比如std::string pattern ="%F" 时输出: "main.cpp"。 +# (5)"%L",输出当前记录器所在的文件行号,比如std::string pattern ="%L" 时输出: "51" +# (6)"%l",输出当前记录器所在的文件名称和行号,比如std::string pattern ="%l" 时输出"main.cpp:51"。 +# (7)"%m",输出原始信息,比如std::string pattern ="%m" 时输出: "teststr",即上述代码中LOG4CPLUS_DEBUG的第二个参数,这种实现机制可以确保原始信息被嵌入到带格式的信息中。 +# (8)"%n",换行符,没什么好解释的。 +# (9)"%p",输出LogLevel,比如std::string pattern ="%p" 时输出: "DEBUG"。 +# (10)"%t",输出记录器所在的线程ID,比如std::string pattern ="%t" 时输出: "1075298944"。 +# (11)"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分,关于NDC方面的详细介绍会在下文中提到。 +# (12)格式对齐,比如std::string pattern ="%-10m"时表示左对齐,宽度是10,此时会输出"teststr ",当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等。 + +# 《主要类》 +# Filter +# 过滤器,过滤输出消息 +# Layout +# 布局器,控制输出消息的格式 +# Appender +# 挂接器,与布局器和过滤器紧密配合,将特定格式的消息过滤后输出到所挂接的设备终端如屏幕,文件等 +# Logger +# 记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对象进行记录时,就需要生成一个logger。 +# Hierarchy +# 分类器,层次化的树型结构,用于对被记录信息的分类,层次中每一个节点维护一个logger的所有信息 +# LogLevel +# 优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。 \ No newline at end of file diff --git a/net_server/CMakeLists.txt b/net_server/CMakeLists.txt index 2c595f8..6a098e7 100644 --- a/net_server/CMakeLists.txt +++ b/net_server/CMakeLists.txt @@ -3,9 +3,8 @@ project (net_server) set(CMAKE_CXX_STANDARD 11) include_directories() -include_directories(../util) add_executable(net_server main.cpp net_server.cpp net_server.h ) -target_link_libraries(net_server PRIVATE net_com util log4cplus::log4cplus) +target_link_libraries(net_server PRIVATE util net_com log4cplus::log4cplus) diff --git a/net_server/main.cpp b/net_server/main.cpp index f4bd97c..e081144 100644 --- a/net_server/main.cpp +++ b/net_server/main.cpp @@ -1,18 +1,76 @@ -#include "net_server.h" +#include + #include +#include "net_server.h" - -class CDemoLogger +class CDemoLogger { +public: + log4cplus::Initializer initializer; +public: + void inita() + { + // 第1步:创建ConsoleAppender(实例化一个appender对象) + log4cplus::SharedAppenderPtr appender(new log4cplus::ConsoleAppender()); + // 第2步:设置Appender的名称和输出格式(SimpleLayout) + appender->setName(LOG4CPLUS_TEXT2("console")); + // 第3步:实例化一个layout对象,将layout对象绑定到appender对象 + log4cplus::tstring pattern = + LOG4CPLUS_TEXT("%D{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n"); + appender->setLayout(std::unique_ptr( + new log4cplus::PatternLayout(pattern))); + // 第4步:实例化一个封装了日志输出的Logger对象,并设置其日志输出等级阈值 + log4cplus::Logger logger = + log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("test")); + // 第5步:将appender对象绑定到logger对象 + logger.addAppender(appender); + // 第6步:设置日志log的优先级 + logger.setLogLevel(log4cplus::INFO_LOG_LEVEL); + // 使用宏将日志输出 + LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world")); + LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello world")); + LOG4CPLUS_DEBUG(logger, LOG4CPLUS_TEXT("Hello world")); + LOG4CPLUS_ERROR(logger, LOG4CPLUS_TEXT("Hello world")); + LOG4CPLUS_FATAL(logger, LOG4CPLUS_TEXT("Hello world")); + } + void initb() + { + log4cplus::initialize(); + log4cplus::PropertyConfigurator::doConfigure( + LOG4CPLUS_TEXT("D:/Code/nettrans/log4config.properties")); + + log4cplus::Logger logger = log4cplus::Logger::getRoot(); + + //log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("logConsole")); + LOG4CPLUS_INFO_FMT(logger, LOG4CPLUS_TEXT("Hello world")); + std::string data("中文测试2"); + std::string data3(u8"中文测试3"); + std::cout << data << std::endl; + std::cout << data3 << std::endl; + LOG4CPLUS_WARN_FMT(logger, u8"Hello world 中文测试5 %d", 3434); + LOG4CPLUS_WARN_FMT(logger, "Hello world 中文测试6 %d", 3434); + LOG4CPLUS_WARN_FMT(logger, data.c_str()); + LOG4CPLUS_DEBUG(logger, LOG4CPLUS_TEXT("Hello world")); + LOG4CPLUS_ERROR(logger, LOG4CPLUS_TEXT("Hello world")); + LOG4CPLUS_FATAL(logger, LOG4CPLUS_TEXT("Hello world")); + } }; int main() { - CNetServer server; - server.run(); - std::cout << "Done" << std::endl; + // CNetServer server; + // server.run(); + // std::cout << "Done" << std::endl; + +// #ifdef _WIN32 +// system("chcp 65001"); +// #endif + + CDemoLogger log; + //log.inita(); + log.initb(); std::cin.get(); return 0; diff --git a/net_server/net_server.cpp b/net_server/net_server.cpp index c9b188f..e4e824c 100644 --- a/net_server/net_server.cpp +++ b/net_server/net_server.cpp @@ -2,16 +2,17 @@ CNetServer::CNetServer() { - log_ = CLogger::getLogger(); + log_ = CLogger::getLogger(); } void CNetServer::run() { log_->info("start run..."); log_->debug("start run2..."); - log_->warn("收到发斯蒂芬"); + log_->warn(u8"收到发斯蒂芬"); log_->error("there have a error info:[{}]", "Java"); system("chcp"); } + \ No newline at end of file