你的浏览器不支持canvas

让我们携手共创奇迹!

UE_LOG

Date: Author: LBD

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自WindCrazy

这是一篇关于UE中日志模块相关的一些知识

官方文档参考:Logging in Unreal Engine

屏幕上的调试消息

if (GEngine)
{
    GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::White, TEXT("This is an Example on-screen debug message."));
}
  • 第一个输入参数key采用唯一的整数 key,以防止同一消息被多次添加。

  • 第二个输入参数TimeToDisplay采用浮点数,表示消息消失之前显示消息的秒数。

  • 第三个输入参数DisplayColor采用颜色来显示文本。

  • 第四个输入参数DebugMessage是要显示的消息。您可以在屏幕调试消息中使用类似于日志的格式说明符和变量。

自定义LOG的Category

.h文件中声明:

DECLARE_LOG_CATEGORY_EXTERN(LogTest, Log, All);

.cpp文件中定义:

DEFINE_LOG_CATEGORY(LogTest);

使用:

UE_LOG(LogTest, Log, TEXT("Test Log Message"));

第一个参数

第一个参数是新定义的LOG类别的名称

  • 第一个输入参数LogTest是提供给宏的类别名称DEFINE_LOG_CATEGORY。要创建您自己的自定义日志记录类别,请参阅定义您自己的日志类别部分。

引擎内置的日志类别CoreGlobals.h

CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogHAL, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogSerialization, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogUnrealMath, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogUnrealMatrix, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogContentComparisonCommandlet, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogNetPackageMap, Warning, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogNetSerialization, Warning, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogMemory, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogProfilingDebugging, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogCore, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogOutputDevice, Log, All);

CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogSHA, Warning, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogStats, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogStreaming, Display, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogInit, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogExit, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogExec, Warning, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogScript, Warning, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogLocalization, Error, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogLongPackageNames, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogProcess, Log, All);
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogLoad, Log, All);

// Temporary log category, generally you should not check things in that use this
CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogTemp, Log, All);

第二个参数:Log Verbosity

第二个参数则是为这个种类的LOG定义了输出等级,UE中包含了以下的几个LOG输出等级,颜色会不同:

  • Fatal
  • Error
  • Warning
  • Display
  • Log
  • Verbose
  • VeryVerbose

像上面,如果你定义了Log类型,则Log及以上的输出等级的日志都会被输出。

额外的,如果你想提升LOG的输出等级,只是为了Debug,我们可以在不修改代码改为修改设定文件的方式对该类型的默认LOG输出层级进行重写:

[Core.Log]
LogTest=VeryVerbose

第三个参数

All相当于VeryVerbose的缩写,效果是相同的。

此参数确定将编译到游戏中的默认详细级别。如果将其设置为高于“全部”的任何值,则无法将详细级别更改为低于此处设置的级别的任何级别。

你为什么想要这个?如果您有一个非常冗长的系统,正在记录大量数据,它可能会减慢您的项目速度,即使它设置为 VeryVerbose 并且您没有记录高于日志/警告的任何内容!仅决定是否打印日志的行为可能就需要很长时间,因此这是一种在一次代码更改中编译出所有详细日志消息的快速方法。将其设置为 Log 之类的值可完全停止编译所有详细日志行,这可能会节省程序的运行时间。

除非您故意添加大量具有复杂字符串格式的详细/非常详细日志行,否则我认为您不太可能需要/想要这样做,因为虽然这很慢,但视频游戏通常有慢得多的方面!!!

LOG输出时间戳

运行时控制台指令

  • Log list - 列出所有日志类别
  • Log list [string] - 列出包含string字符串的所有Category
  • Log reset - 将所有日志类别重置为其启动时默认值
  • Log [cat] off - 关闭Category的输出
  • Log [cat] on - 打开Category的输出
  • Log [cat] [level] - 设置Category的显示级别
  • Log [cat] - toggle the display of the category [cat]
  • Log [cat] break - toggle the debug break on display of the category [cat]

UE Command Line

-LogCmds=”LogFirst verbose, LogSecond off” 把LogFirst可见性设置为verbose,把LogSecond可见性设置为off

Global这个日志类别作特殊使用:

  • 控制所有日志类别的等级为Warning:

-LogCmds=“Global Warning”

  • 控制LogTemp等级为Verbose,其它所有日志类别的等级为Warning:

-LogCmds=“Global Warning,LogTemp Verbose”

配置文件

DefaultEngine.ini 或者项目的 Engine.ini: [Core.Log] global=Display //将所有的Category设置为Display LogFirst =verbose //然后把LogFirst设置为verbose

UE5.2以上的UE_LOGFMT

UE_LOGFMT记录结构化日志事件,支持PositionalNamed参数,但不能混合使用这两种。要使用此宏,需要包含Logging/StructeredLog.h库声明。

  • Positional 字段值必须与格式引用的字段完全匹配。如:
    UE_LOGFMT(LogCore, Warning, "Loading `{Name}` failed with error {Error}", Package->GetName(),  ErrorCode);
    
  • Named 字段值必须按格式包含每个字段引用,但与顺序无关,并且允许使用额外的字段。
    UE_LOGFMT(LogCore, Warning, "Loading `{Name}` failed with error {Error}",("Name", Package->GetName()), ("Error", ErrorCode),("Flags", LoadFlags));
    

    详情参考官方文档

参考:Unreal Engine 4 - Custom Log Categories

其他:plog-LOG


对于本文内容有问题或建议的小伙伴,欢迎提出问题