六一的部落格


关关难过关关过,前路漫漫亦灿灿。




日志宏

UE_LOG

在代码中使用日志宏, 在运行时输出日志

使用宏时, 给出日志类别和日志级别

比较日志级别与日志类别的编译级别和打印级别,在编译时确定是否编译该日志,运行时是否输出该日志:

  • 当日志级别低于日志类别的编译级别,该日志不会被编译
  • 当日志级别低于日志类别的打印级别,该日志不会被输出

UE_LOG

CategoryName 日志类别
Verbosity 日志级别
Format 文本格式
  1. 日志级别

    虚幻引擎定义了日志级别的枚举类

    常用的有Log,Display,Warning和Error

    在编辑器的输出日志窗口,不同级别的日志以不同颜色显示

  2. 文本格式 Format

    Format中的 %s 匹配使用TEXT宏封装的C风格字符串



输出格式

  1. 当日志级别小于等于Log时
    CategoryName: TEXT
  2. 当日志级别大于Log时,输出日志级别
    CategoryName: Verbosity: TEXT  

日志级别

UE5/Engine/Source/Runtime/Core/Public/Logging/LogVerbosity.h

使用枚举类型 ELogVerbosity

日志级别数值越大,级别越低



使用全局日志类别LogTemp

调试时输出日志,可以使用全局日志类别LogTemp,也可以使用自定义的静态日志类别

-
全局日志类别 LogTemp
自定义日志类别 使用DEFINE_LOG_CATEGORY_STATIC宏在源文件中定义

添加函数成员

SimpleGeometry.cpp

private

在BeginPlay中调用

1void ASimpleGeometry::UseLogTemp()
2{
3    UE_LOG(LogTemp, Log, TEXT("Hello Unreal!"));
4    UE_LOG(LogTemp, Display, TEXT("Hello Unreal!"));
5    UE_LOG(LogTemp, Warning, TEXT("Hello Unreal!"));
6    UE_LOG(LogTemp, Error, TEXT("Hello Unreal!"));
7}



自定义日志类别

Engine/Source/Runtime/Core/Public/Logging/LogMacros.h

虚幻C++为自己的模块定义了日志类别

每个模块可以有自己的日志类别,定位问题更方便

使用 DEFINE_LOG_CATEGORY_STATIC 宏定义静态日志类别

静态日志类别只能在定义所在源文件内使用

定义日志类别时,需给出对应的编译级别和打印级别:

  • 虚幻C++提供日志级别枚举类ELogVerbosity
  • 数值越大,级别越低
  • 常用的日志级别 Error > Warning > Display > Log
  • 建议将编译级别和打印级别均设为All

SimpleGeometry.cpp

1DEFINE_LOG_CATEGORY_STATIC(LogSimpleGeometry, All, All)

DEFINE_LOG_CATEGORY_STATIC

-
CategoryName 日志类别
DefaultVerbosity 打印级别 输出日志时,给定日志级别小于打印级别时,不予打印
CompileTimeVerbosity 编译级别 输出日志时,给定日志级别小于编译级别时,该语句不予编译



使用自定义日志类别输出日志


添加函数成员

SimpleGeometry.cpp

private

在BeginPlay中调用

1void ASimpleGeometry::UseStaticLogCategory()
2{
3    UE_LOG(LogSimpleGeometry, Display, TEXT("Name: %s"), *GetName());
4}

全局日志类别的定义

仅供了解

  1. 虚幻C++使用 DECLARE_LOG_CATEGORY_EXTERN 宏为各个模块定义了自有日志类别


  2. 使用DECLARE_LOG_CATEGORY_EXTERN定义的日志类别,编译级别均为All,即无条件编译


  3. 未为自己的模块定义日志类别时, 可以使用LogTemp输出临时日志, 用以调试

    LogTemp

    打印级别为Log: 日志级别不低于Log时打印

    编译级别为All: 无条件编译


    1UE_LOG(LogTemp, Log, TEXT("Hello Unreal!"));
    2UE_LOG(LogTemp, Display, TEXT("Hello Unreal!"));
    3UE_LOG(LogTemp, Warning, TEXT("Hello Unreal!"));
    4UE_LOG(LogTemp, Error, TEXT("Hello Unreal!"));

日志存放路径

操作系统
Windows TheBasics/Saved/Logs
MacOS /Users/XX/Library/Logs/Unreal Engine/ShootTrainingEditor

在输出日志窗口查看日志

可通过日志类别和日志级别筛选日志



C++实现在屏幕输出日志


包含头文件

1#include "Engine/Engine.h"

在屏幕输出信息

  1. 通过指向UEngine对象的全局指针输出信息

  2. 添加函数成员

    SimpleGeometry.cpp

    private

    在BeginPlay中调用

    1void ASimpleGeometry::PrintLogOnScreen()
    2 {
    3     if (GEngine)
    4     {
    5         GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Orange, TEXT("Hello"));
    6         GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT("World!"));
    7     }
    8 }

日志宏

UE_LOG

在代码中使用日志宏, 在运行时输出日志

使用宏时, 给出日志类别和日志级别

比较日志级别与日志类别的编译级别和打印级别,在编译时确定是否编译该日志,运行时是否输出该日志:

  • 当日志级别低于日志类别的编译级别,该日志不会被编译
  • 当日志级别低于日志类别的打印级别,该日志不会被输出

UE_LOG

CategoryName 日志类别
Verbosity 日志级别
Format 文本格式
  1. 日志级别

    虚幻引擎定义了日志级别的枚举类

    常用的有Log,Display,Warning和Error

    在编辑器的输出日志窗口,不同级别的日志以不同颜色显示

  2. 文本格式 Format

    Format中的 %s 匹配使用TEXT宏封装的C风格字符串



输出格式

  1. 当日志级别小于等于Log时
    CategoryName: TEXT
  2. 当日志级别大于Log时,输出日志级别
    CategoryName: Verbosity: TEXT  

日志级别

UE5/Engine/Source/Runtime/Core/Public/Logging/LogVerbosity.h

使用枚举类型 ELogVerbosity

日志级别数值越大,级别越低



使用全局日志类别LogTemp

调试时输出日志,可以使用全局日志类别LogTemp,也可以使用自定义的静态日志类别

-
全局日志类别 LogTemp
自定义日志类别 使用DEFINE_LOG_CATEGORY_STATIC宏在源文件中定义

添加函数成员

SimpleGeometry.cpp

private

在BeginPlay中调用

1void ASimpleGeometry::UseLogTemp()
2{
3    UE_LOG(LogTemp, Log, TEXT("Hello Unreal!"));
4    UE_LOG(LogTemp, Display, TEXT("Hello Unreal!"));
5    UE_LOG(LogTemp, Warning, TEXT("Hello Unreal!"));
6    UE_LOG(LogTemp, Error, TEXT("Hello Unreal!"));
7}



自定义日志类别

Engine/Source/Runtime/Core/Public/Logging/LogMacros.h

虚幻C++为自己的模块定义了日志类别

每个模块可以有自己的日志类别,定位问题更方便

使用 DEFINE_LOG_CATEGORY_STATIC 宏定义静态日志类别

静态日志类别只能在定义所在源文件内使用

定义日志类别时,需给出对应的编译级别和打印级别:

  • 虚幻C++提供日志级别枚举类ELogVerbosity
  • 数值越大,级别越低
  • 常用的日志级别 Error > Warning > Display > Log
  • 建议将编译级别和打印级别均设为All

SimpleGeometry.cpp

1DEFINE_LOG_CATEGORY_STATIC(LogSimpleGeometry, All, All)

DEFINE_LOG_CATEGORY_STATIC

-
CategoryName 日志类别
DefaultVerbosity 打印级别 输出日志时,给定日志级别小于打印级别时,不予打印
CompileTimeVerbosity 编译级别 输出日志时,给定日志级别小于编译级别时,该语句不予编译



使用自定义日志类别输出日志


添加函数成员

SimpleGeometry.cpp

private

在BeginPlay中调用

1void ASimpleGeometry::UseStaticLogCategory()
2{
3    UE_LOG(LogSimpleGeometry, Display, TEXT("Name: %s"), *GetName());
4}

全局日志类别的定义

仅供了解

  1. 虚幻C++使用 DECLARE_LOG_CATEGORY_EXTERN 宏为各个模块定义了自有日志类别


  2. 使用DECLARE_LOG_CATEGORY_EXTERN定义的日志类别,编译级别均为All,即无条件编译


  3. 未为自己的模块定义日志类别时, 可以使用LogTemp输出临时日志, 用以调试

    LogTemp

    打印级别为Log: 日志级别不低于Log时打印

    编译级别为All: 无条件编译


    1UE_LOG(LogTemp, Log, TEXT("Hello Unreal!"));
    2UE_LOG(LogTemp, Display, TEXT("Hello Unreal!"));
    3UE_LOG(LogTemp, Warning, TEXT("Hello Unreal!"));
    4UE_LOG(LogTemp, Error, TEXT("Hello Unreal!"));

日志存放路径

操作系统
Windows TheBasics/Saved/Logs
MacOS /Users/XX/Library/Logs/Unreal Engine/ShootTrainingEditor

在输出日志窗口查看日志

可通过日志类别和日志级别筛选日志



C++实现在屏幕输出日志


包含头文件

1#include "Engine/Engine.h"

在屏幕输出信息

  1. 通过指向UEngine对象的全局指针输出信息

  2. 添加函数成员

    SimpleGeometry.cpp

    private

    在BeginPlay中调用

    1void ASimpleGeometry::PrintLogOnScreen()
    2 {
    3     if (GEngine)
    4     {
    5         GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Orange, TEXT("Hello"));
    6         GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT("World!"));
    7     }
    8 }