当前位置: 首页 > 工具软件 > Just4Log > 使用案例 >

UE4--Log写入到单独文件中

呼延聪
2023-12-01

本文章由cartzhang编写,转载请注明出处。 所有权利保留。
作者:cartzhang

把LOG写入到单个文件中。

把所有的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

目前已知bug,就是在多输入情况下,需要完全匹配,意思就是不能%s,而输入的是一个整型或其他类型的变量,这样会报错的。
不过,不打算改。

严谨的人完全按照UE4的格式,就没有问题。

说明

说明:目前测试版本为4.16.1,其他版本也应能可以。使用的都是C++原有的函数和方法。

喜欢记得点个关注,点个赞!

 类似资料: