本文章由cartzhang编写,转载请注明出处。 所有权利保留。
作者:cartzhang
把所有的Log都写入到本地save文件夹下,这个是默认路径,
所有都在一起,看起来很不方便。
自己写了一个,可以在UE中直接使用。
代码很简单。
#define CZ_LOG_S(FileName,Value) \
{ \
static bool IsNewLog = true; \
FString SaveDirectory = FPaths::GameSavedDir(); \
SaveDirectory.Append("Logs/CZSave/"); \
FString TmpFileName = FileName; \
TmpFileName.Append(".log.txt"); \
\
/** CreateDirectoryTree returns true if the destination directory existed prior to call or has been created during the call.*/ \
IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); \
CA_CONSTANT_IF(!PlatformFile.DirectoryExists(*SaveDirectory)) \
PlatformFile.CreateDirectoryTree(*SaveDirectory); \
\
/** Get absolute file path*/ \
FString AbsoluteFilePath = SaveDirectory + "/" + TmpFileName; \
FFileHelper::EEncodingOptions::Type EncodingOptions = FFileHelper::EEncodingOptions::AutoDetect; \
IFileManager* FileManager = &IFileManager::Get(); \
uint32 WriteFlags = (uint32)(EFileWrite::FILEWRITE_Append); \
/** if file already exist,change name and save it.*/ \
CA_CONSTANT_IF(PlatformFile.FileExists(*AbsoluteFilePath) && IsNewLog) \
{ \
IsNewLog = false; \
FString AbsoluteDestinationPath = SaveDirectory + "/" + FDateTime::Now().ToString() + "-" + TmpFileName; \
PlatformFile.MoveFile(*AbsoluteDestinationPath, *AbsoluteFilePath); \
PlatformFile.DeleteFile(*AbsoluteFilePath); \
} \
{ \
FString TextToSave = FDateTime::Now().ToString(); \
TextToSave.Append("-"); \
TextToSave.Append(Value); \
TextToSave.Append("\r\n"); \
FFileHelper::SaveStringToFile(TextToSave, *AbsoluteFilePath, EncodingOptions, FileManager, WriteFlags); \
} \
\
}
//
static FORCEINLINE void CZ_LOG(FString FileName, const TCHAR* Format, ...)
{
#if UE_BUILD_DEBUG || UE_EDITOR || WITH_EDITOR
// change whenshipping.
#endif
TCHAR TempStr[1024];
va_list Ptr;
va_start(Ptr, Format);
FCString::GetVarArgs(TempStr, ARRAY_COUNT(TempStr), ARRAY_COUNT(TempStr) - 1, Format, Ptr);
va_end(Ptr);
PW_LOG_S(FileName, FString(TempStr));
}
你可以添加到你的某个通用头文件中,或单独的制作一个Head文件中,在其他地方引用就可以用了。
具体用法,与UE4本身的UE_LOG完全一致。
CZ_LOG_S("CZLog", *GetFName().ToString());
CZ_LOG("CZLog", TEXT(" MACRO this is just call string no format"));
CZ_LOG("CZLog", TEXT("MACRO has health %d, which is percent of total health2 : %s"), Health, *GetFName().ToString());
运行完毕后,就可以发现Saved/Logs文件夹下多了个文件,就是CZSave,里面保存了你CZLog文件,方便好用吧。
目前已知bug,就是在多输入情况下,需要完全匹配,意思就是不能%s,而输入的是一个整型或其他类型的变量,这样会报错的。
不过,不打算改。
严谨的人完全按照UE4的格式,就没有问题。
说明:目前测试版本为4.16.1,其他版本也应能可以。使用的都是C++原有的函数和方法。
喜欢记得点个关注,点个赞!