提交 04cbcc1f 编写于 作者: X xuchi

升级日志系统支持临时字符串变量:异步日志系统输出

上级 dd287cb3
......@@ -2,8 +2,10 @@
#define _CELL_LOG_HPP_
//#include"CELL.hpp"
#include"Task.hpp"
#include<ctime>
#include "Task.hpp"
#include <ctime>
//#include <stdio.h>
namespace doyou {
namespace io { // 增加两层命令空间,避免在其它项目应用时类名出现冲突
......@@ -61,7 +63,7 @@ namespace doyou {
_logFile = nullptr;
}
//
static char logPath[256] = {};
char logPath[256] = {};
//
if (hasDate)
{
......@@ -74,7 +76,7 @@ namespace doyou {
sprintf(logPath, "%s.txt", logName);
}
//
// 文件指针
_logFile = fopen(logPath, mode);
if (_logFile)
{
......@@ -94,9 +96,11 @@ namespace doyou {
template<typename ...Args> // 函数模板
static void PError(const char* pformat, Args ... args)
{
char* logStr = NewFormatStr(pformat, args...);
#ifdef _WIN32 // 分析:如果windows和linux差异教大,总是采用宏来区分,是很坑的。所以,独做两套系统也很好。
auto errCode = GetLastError(); // 在网络消息收发线程中获取错误码
Instance()._taskServer.addTask([=]() { // 在独立的日志任务线程中获取字符串信息
Instance()._taskServer.addTask([errCode, logStr]() { // 在独立的日志任务线程中获取字符串信息
// 采用静态局部变量,生命周期与进程周期保持一致
static char text[256] = {}; // 栈空间申请一个固定数组//char* text = nullptr; // 收发线程中执行:申请text内存
FormatMessageA(
......@@ -108,9 +112,11 @@ namespace doyou {
256,
NULL
); // ascii编码格式方式
EchoReal(true, "PError ", pformat, args...);
EchoReal(true, "PError ", "%s", logStr);
// 不换行,处理页面出现空行不规范场景
EchoReal(false, "PError ", "errno:%d, errmsg: %s", errCode, text); // 实时打印日志
delete[] logStr;
/*
// 分析:当前函数是在一个独立的线程中运行,所以,需要将释放text所申请内存的操作当作一个task任务
// 问题(目前还没有理解?):PError是在task线程队列中执行,所以,由其申请的资源的释放也应该添加到task任务队列中。
......@@ -122,10 +128,11 @@ namespace doyou {
#else // linux系统
// 分析:多线程调用场景,尽量只获取一次,连续获取两次存在中间被修改的可能性
auto errCode = errno;
Instance()._taskServer.addTask([=]() { // 在独立的日志任务线程中获取字符串信息
EchoReal(true, "PError ", pformat, args...); // 提示信息
Instance()._taskServer.addTask([errCode, logStr]() { // 在独立的日志任务线程中获取字符串信息
EchoReal(true, "PError ", "%s", logStr); // 提示信息
EchoReal(false, "PError ", "errno<%d>, errmsg<%s>", errCode, strerror(errCode)); // linux:出现错误时机打印错误码和由错误码转化的错误信息
});
delete[] logStr;
});
#endif
}
......@@ -163,12 +170,12 @@ namespace doyou {
Echo("Debug ", pformat, args...);
}
static void Info(const char* pStr)
static void Info(const char* pStr) // 函数重载:同一作用域中函数名相同,参数列表不同可构成函数重载
{
Info("%s", pStr);
}
template<typename ...Args>
template<typename ...Args> // 模板函数
static void Info(const char* pformat, Args ... args)
{
Echo("Info ", pformat, args...);
......@@ -178,13 +185,16 @@ namespace doyou {
template<typename ...Args>
static void Echo(const char* type, const char* pformat, Args ... args)
{
Log* pLog = &Instance();
pLog->_taskServer.addTask([=]() {
EchoReal(true, type, pformat, args...);
char* logStr = NewFormatStr(pformat, args...); // 在delete之前使用都是有效的,传进来的可能是常量字符串,也可能临时字符串变量
Log* pLog = &Instance(); // 指针变量指向了一个静态对象,指针变量可以间接访问指向的对象
// 分析:采用匿名函数作为形参添加一个日志任务到任务队列中,这里只是匿名函数的函数定义,匿名函数的调用由日志线程触发
pLog->_taskServer.addTask([type, logStr]() { // 匿名函数
EchoReal(true, type, "%s", logStr);
delete[] logStr; // 此处匿名函数调用结束,手动释放new资源,在日志线程中触发调用的
});
}
// 实时执行打印日志 增强功能:para2可以传空指针就不打印type信息的场景
// 实时执行打印日志 增强功能:para2可以传空指针就不打印type信息的场景(业务逻辑执行线程中输出实时日志场景)
template<typename ...Args>
static void EchoReal(bool br, const char* type, const char* pformat, Args ... args)
{
......@@ -215,6 +225,26 @@ namespace doyou {
}
}
// 在日志终端输出和写入本地日志文件之前保存临时字符串变量值
// 返回指针一定要delete[]
// 在堆中实例化日志字符串对象
template<typename ...Args> // 可变参数
static char* NewFormatStr(const char* pformat, Args ... args)
{
// 问题:当前系统不支持函数-snprintf
// 计算格式化字符串所需要的char字符数量(函数返回值)
// +1是为了预留位置,字符串结束符号标志'\0'
//size_t n = 1 + snprintf(nullptr, 0, pformat, args...);
//char* pFormatStr = new char[n]; // new/delete配套使用, 使用数组指针,在堆中实例化对象要程序员手动释放
//snprintf(pFormatStr, n, pformat, args...); // 将para3和para4整合后字符串指针赋值给para1
const size_t logLenMax = 1024 * 1024 * 10; // 10M: 单次记录日志最大字节长度
char* pFormatStr = new char[logLenMax]; // new/delete配套使用, 使用数组指针,在堆中实例化对象要程序员手动释放
sprintf(pFormatStr, pformat, args...);
return pFormatStr;
}
private:
FILE* _logFile = nullptr;
TaskServer _taskServer; // 打印日志比较耗时,所以作为了一个独立的线程执行
......
......@@ -71,5 +71,10 @@ IP直接存入黑名单中,所以,服务端获取客户端IP地址很有意
在windows系统中,开启ipv6服务器,客户端连接该ipv6对应的ipv4是连接不上的。
在linux系统中,开启ipv6服务器,客户端可连接ipv4以及对应IPV6都可以连接上。
23.当前日志系统待处理问题:日志系统采用的是一个独立线程来记录日志,为了不影响业务逻辑
的执行效率,提高程序性能,这个一个异步日志系统设计。但是,调用日志打印接口是一个线程,
实际记录本地文件或终端输出是另一个线程,如果调用接口线程传入的是一个临时变量,在具体
输出日志线程在访问变量是很可能已经被系统回收,从而记录日志为乱码。
此差异已折叠。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
\ No newline at end of file
Info [2023-3-31 22:32:39]Log::setLogPath success,<serverLog.txt,w>
Error [2023-3-31 22:32:39]Config::getStr not find <strIP>
Info [2023-3-31 22:32:39]Config::getStr strIP=any
Error [2023-3-31 22:32:39]Config::getStr not find <nPort>
Info [2023-3-31 22:32:39]Config::getInt nPort=4567
Error [2023-3-31 22:32:39]Config::getStr not find <nThread>
Info [2023-3-31 22:32:39]Config::getInt nThread=1
Error [2023-3-31 22:32:39]Config::getStr not find <nSendBuffSize>
Info [2023-3-31 22:32:39]Config::getInt nSendBuffSize=10240
Error [2023-3-31 22:32:39]Config::getStr not find <nRecvBuffSize>
Info [2023-3-31 22:32:39]Config::getInt nRecvBuffSize=8192
Error [2023-3-31 22:32:39]Config::getStr not find <nMaxClient>
Info [2023-3-31 22:32:39]Config::getInt nMaxClient=65535
Info [2023-3-31 22:32:39]create socket<468> success...
Info [2023-3-31 22:32:39]bind port<4567> success...
Info [2023-3-31 22:32:39]listen port<468> success...
Info [2023-3-31 22:32:40]thread<1>,time<1.015804>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:41]thread<1>,time<1.012665>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:42]thread<1>,time<1.005641>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:43]thread<1>,time<1.010654>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:44]thread<1>,time<1.008968>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:45]thread<1>,time<1.000230>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:46]thread<1>,time<1.005774>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:47]thread<1>,time<1.003246>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:48]thread<1>,time<1.003917>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:49]thread<1>,time<1.011160>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:50]thread<1>,time<1.000848>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:51]thread<1>,time<1.003867>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:52]thread<1>,time<1.010758>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:53]thread<1>,time<1.001822>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:54]thread<1>,time<1.004321>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:55]thread<1>,time<1.004184>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:56]thread<1>,time<1.001536>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:57]thread<1>,time<1.000277>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:58]thread<1>,time<1.008580>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:59]thread<1>,time<1.007428>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:0]thread<1>,time<1.001152>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:1]thread<1>,time<1.010830>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:2]thread<1>,time<1.012891>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:3]thread<1>,time<1.006799>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:4]thread<1>,time<1.015240>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:5]thread<1>,time<1.014393>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:6]thread<1>,time<1.004565>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:7]thread<1>,time<1.000470>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:8]thread<1>,time<1.007870>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:9]thread<1>,time<1.015320>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:10]thread<1>,time<1.001293>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:11]thread<1>,time<1.009076>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:12]thread<1>,time<1.006654>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:13]thread<1>,time<1.002006>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:14]thread<1>,time<1.003960>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:15]thread<1>,time<1.002160>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:16]thread<1>,time<1.011077>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:17]thread<1>,time<1.004268>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:18]thread<1>,time<1.000327>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:19]thread<1>,time<1.009899>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:20]thread<1>,time<1.004248>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:22]thread<1>,time<1.010211>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:23]thread<1>,time<1.012928>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:24]thread<1>,time<1.003055>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:25]thread<1>,time<1.004246>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:26]thread<1>,time<1.012615>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:27]thread<1>,time<1.015721>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:28]thread<1>,time<1.012698>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:29]thread<1>,time<1.010806>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:30]thread<1>,time<1.000653>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:31]thread<1>,time<1.014312>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:32]thread<1>,time<1.010476>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:33]thread<1>,time<1.002941>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:34]thread<1>,time<1.016947>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:35]thread<1>,time<1.005236>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:36]thread<1>,time<1.003975>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:37]thread<1>,time<1.015653>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:38]thread<1>,time<1.010557>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:39]thread<1>,time<1.013520>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:18]Log::setLogPath success,<serverLog.txt,w>
Info [2023-4-8 22:38:18]a=500
Info [2023-4-8 22:38:18]the first string.
Info [2023-4-8 22:38:18]
Info [2023-4-8 22:38:18]
Info [2023-4-8 22:38:18]the four string.
Info [2023-4-8 22:38:18]Log::setLogPath _logFile != nullptr
Info [2023-4-8 22:38:18]Log::setLogPath success,<serverLog.txt,w>
Error [2023-4-8 22:38:18]Config::getStr not find <strIP>
Info [2023-4-8 22:38:18]Config::getStr strIP=any
Error [2023-4-8 22:38:18]Config::getStr not find <nPort>
Info [2023-4-8 22:38:18]Config::getInt nPort=4567
Error [2023-4-8 22:38:18]Config::getStr not find <nThread>
Info [2023-4-8 22:38:18]Config::getInt nThread=1
Error [2023-4-8 22:38:18]Config::getStr not find <nSendBuffSize>
Info [2023-4-8 22:38:18]Config::getInt nSendBuffSize=10240
Error [2023-4-8 22:38:18]Config::getStr not find <nRecvBuffSize>
Info [2023-4-8 22:38:18]Config::getInt nRecvBuffSize=8192
Error [2023-4-8 22:38:18]Config::getStr not find <nMaxClient>
Info [2023-4-8 22:38:18]Config::getInt nMaxClient=65535
Info [2023-4-8 22:38:18]create socket<460> success...
Info [2023-4-8 22:38:18]bind port<4567> success...
Info [2023-4-8 22:38:18]listen port<460> success...
Info [2023-4-8 22:38:19]thread<1>,time<1.001032>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:20]thread<1>,time<1.006342>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:21]thread<1>,time<1.005530>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:22]thread<1>,time<1.002741>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:23]thread<1>,time<1.014311>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:24]thread<1>,time<1.001247>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:25]thread<1>,time<1.014090>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:26]thread<1>,time<1.012529>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-4-8 22:38:27]thread<1>,time<1.004971>,socket<460>,Accept<0>,Join<0>,recv<0>,msg<0>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{14149BAD-FE3D-45FB-8DB8-831E4198C72D}</ProjectGuid>
<RootNamespace>HelloCpp</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)../bin/$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)../tmp/$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>false</SDLCheck>
<AdditionalIncludeDirectories>E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Depends\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
\ No newline at end of file
#include "TcpIocpServer.hpp"
//#include "Log.hpp"
using namespace doyou::io; // 使用名称空间
int main()
{
Log::Instance().setLogPath("HelloCpp.log", "w", false);
CELLLog_Info("a=%d", 500); // "a=%d"-是常量字符串,生命周期伴随程序执行的整个周期
{
std::string log1 = "the second string."; // 临时变量
char log2[] = "the third string."; // 临时变量
// 分析:指针变量log3指向了一个常量字符串的地址
const char* log3 = "the four string."; // 常量字符串,生命周期在整个程序执行过程中
Log::Info("the first string."); // 常量字符串
Log::Info(log1.c_str()); // 临时变量,出了作用域,变量会被回收
Log::Info(log2); // 临时变量
Log::Info(log3); // 常量字符串
}
Sleep(10000); // 等待异步日志输出-10s
return 0;
}
生成启动时间为 2023/3/29 23:08:34。
1>项目“E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\TestDemo\TestDemo.vcxproj”在节点 2 上(Rebuild 个目标)。
1>ClCompile:
D:\software\VC\bin\CL.exe /c /ZI /nologo /W3 /WX- /sdl /Od /Oy- /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc120.pdb" /Gd /TC /analyze- /errorReport:prompt main.c
main.c
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\testdemo\main.c(14): warning C4013: “system”未定义;假设外部返回 int
Link:
D:\software\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Debug\TestDemo.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Debug\TestDemo.pdb" /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Debug\TestDemo.lib" /MACHINE:X86 Debug\main.obj
TestDemo.vcxproj -> E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Debug\TestDemo.exe
1>已完成生成项目“E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\TestDemo\TestDemo.vcxproj”(Rebuild 个目标)的操作。
生成成功。
已用时间 00:00:01.30
Binary files a/engine2.0/engine2.0/TestDemo/Debug/TestDemo.tlog/CL.read.1.tlog and /dev/null differ
Binary files a/engine2.0/engine2.0/TestDemo/Debug/TestDemo.tlog/CL.write.1.tlog and /dev/null differ
#TargetFrameworkVersion=v4.0:PlatformToolSet=v120:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit
Debug|Win32|E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\|
Binary files a/engine2.0/engine2.0/TestDemo/Debug/TestDemo.tlog/cl.command.1.tlog and /dev/null differ
Binary files a/engine2.0/engine2.0/TestDemo/Debug/TestDemo.tlog/link.command.1.tlog and /dev/null differ
Binary files a/engine2.0/engine2.0/TestDemo/Debug/TestDemo.tlog/link.read.1.tlog and /dev/null differ
Binary files a/engine2.0/engine2.0/TestDemo/Debug/TestDemo.tlog/link.write.1.tlog and /dev/null differ
......@@ -39,8 +39,8 @@
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)\..\bin\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)\..\tmp\$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)../bin/$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)../tmp/$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)\..\bin\$(Configuration)\</OutDir>
......@@ -51,6 +51,7 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Depends\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
......
......@@ -2,7 +2,6 @@
#pragma execution_character_set("utf-8")
#include <stdio.h>
void main()
{
int a = 0;
......
......@@ -16,6 +16,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Engine1.0", "Engine1.0\Engi
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestDemo", "TestDemo\TestDemo.vcxproj", "{FF4CC1F1-6E8F-41D0-9D68-6F2FE967B93B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HelloCpp", "HelloCpp\HelloCpp.vcxproj", "{14149BAD-FE3D-45FB-8DB8-831E4198C72D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
......@@ -38,6 +40,10 @@ Global
{FF4CC1F1-6E8F-41D0-9D68-6F2FE967B93B}.Debug|Win32.Build.0 = Debug|Win32
{FF4CC1F1-6E8F-41D0-9D68-6F2FE967B93B}.Release|Win32.ActiveCfg = Release|Win32
{FF4CC1F1-6E8F-41D0-9D68-6F2FE967B93B}.Release|Win32.Build.0 = Release|Win32
{14149BAD-FE3D-45FB-8DB8-831E4198C72D}.Debug|Win32.ActiveCfg = Debug|Win32
{14149BAD-FE3D-45FB-8DB8-831E4198C72D}.Debug|Win32.Build.0 = Debug|Win32
{14149BAD-FE3D-45FB-8DB8-831E4198C72D}.Release|Win32.ActiveCfg = Release|Win32
{14149BAD-FE3D-45FB-8DB8-831E4198C72D}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册