- 一个可跨平台,简单,轻量,易维护的UE日志工具
- 解决UE项目打包发行版后,查看项目中手动添加的PrintLog等相关操作,无法轻易查看日志的问题
- 基于WebSocket通信,可以本地使用,也可以部署云端
UnrealLogger
- UE_Logger
- node_modules
- logger.js
Logger Server - package.json
- package-lock.json
- websocat.exe
Windows Test Websocket Tool
- UnrealLogger
UE Plugin - .gitignore
- README.md
Logger Server:使用nodejs开发
UE Plugin:使用UE 5.2开发,纯源码,需要使用C++项目编译,只用了UE模块,理论上该插件也支持全平台,足够多的UE版本
websocat.exe:启动Logger Server后,在Windows平台,可以简单使用该测试是否启用成功
- 系统运行环境需要
nodejs, npm等 - UE项目是C++项目,添加该插件后,项目编译成功
-
使用控制台进入
UE_Logger目录 -
运行
node logger.js启动Logger Server- 默认启动的是
127.0.0.1:6666, 刷新间隔16ms - 使用带参命令
node logger.js 127.0.0.1 7777 100可以该Logger Server的IP, Port, 刷新间隔 node logger.js <IP> <Port> <Interval>
- 默认启动的是
-
启动后,在
Windows环境下,可以直接使用websocat.exe测试
注意:使用前,先确保 Logger Server已经启动,并测试通过
如果:先启动了UE 客户端,再启动 Logger Server,应该是无法连接的,可以在客户端程序中,可以手动或特定时机触发 MakeLoggerSetting方法
-
初始化
Logger System:初始化相关配置和启动WebSocket服务 -
查看
PrintLog方法 -
Log Type介绍:- Normal -> level: 0
- Warning -> level: 1
- Error -> level:2
-
Log Setting: -
Log Screen Color,Log Screen Time和UE printString同理 -
测试蓝图:
运行结果:
-
结束打印
如果你电脑挂了代理,这个应该是代理的问题,关掉代理再测试
- 测试了一个Linux服务器,开发防火墙的
6666端口 - 配置运行环境
node logger.js 0.0.0.0:6666- 在本地主机(windows):
websocat.exe ws://公网IP:6666即可
多了一个 IsUseWorldContextName,目的是方便查看日志打印时,可以看见这条日志打印的所在位置,比如:UI, Actor, Level等等;
优化了Logger Server的打印样式,使用绿色显示连接状态
发送给Logger Server的日志,默认增加了时间戳 UE 发送日志的时间
完善蓝图的使用体验,默认(WorldContextObject=Self, IsUseWorldContextName=True, LogType=Normal, Setting="Logger", LogScreenColor="0.0f, 0.66f, 1.0f, 1.0f", LogScreenTime=2.0f)
节点默认只显示LogText,LogSetting不再是结构体,而是默认折叠起来,和UE蓝图 printString节点相同
优化了 PrintLog节点默认的展开参数为:LogType, LogText,方便快速设置打印日志的类型,打印目标默认为Screen, UE_LOG, UnrealLogger
修复了,传入Json字符串,无法正确解析的问题(需要对传入字符内,所有的 ""做转义)
- 修复打印
json的相关问题 - 新增节点
SetGlobalSetting,可以全局控制打印日志到何处
经过一段时间的使用,发现LogType还是默认UE_Log-Logger比较舒服
修改节点MakeLoggerSetting
新增字段:
IsEnableQueueMode:是否开启队列模式QueueCheckIntervalSeconds:队列检查的间隔时间
此前在GameInstance中的Init()使用,可能时机过早,丢失了日志信息;
加入队列模式后,同样的情况下,日志不会丢失,而是进入队列中,当初始化完毕可以正常使用之后的新打印,会触发队列检查,将此前无法正常打印的信息打印出来
总之:在GameInstance的Init()之后MakeLoggerSetting()时机过早;
解决方案:
-
在自定义的
GameInstance.cpp中声明OnPostInitUCLASS() class TEST_TUTORIAL_API UFH_GameInstance : public UGameInstance { GENERATED_BODY() protected: virtual void Init() override; UFUNCTION(BlueprintNativeEvent, Category="FH|GameInstance") void OnPostInit(); };
-
在
Init()中调用OnPostInit()void UFH_GameInstance::Init() { Super::Init(); OnPostInit(); } void UFH_GameInstance::OnPostInit_Implementation() { }
-
在蓝图中定义:
OnPostInit() -
建议在这之后进行游戏逻辑
这样使用,比较靠谱,如果是在GameMode,PlayerController或其它A*的类型对象中使用,则不必担心这个问题
-
补充了
OnConnected和OnConnectionError的回调,结合 2025-03-05 的 方案,处理在UE 中过早使用PrintLog需要Delay一段时间的问题,可以在蓝图中调用完MakeLoggerSetting()之后,从蓝图子系统LoggerSystem中进行委托绑定DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FUnrealLoggerConnectedServer, bool, IsConnected); void ULoggerSystem::OnConnected() { OnUnrealLoggerConnectedServer.Broadcast(true); UE_LOG(Logger, Log, TEXT("WebSocket connected!")); } void ULoggerSystem::OnConnectionError(const FString& Error) { OnUnrealLoggerConnectedServer.Broadcast(false); UE_LOG(Logger, Error, TEXT("Connection error: %s"), *Error); }
-
更新了
UnrealLogger - LoggerSystem中的函数MakeLoggerSetting,新增了TagName标记,确保服务端UE_Logger在日志中能辨别打印的日志消息源自于哪个客户端,默认为Unknown -
在
UE_Logger中更新了,多客户端 Websocket 链接实例管理,目前可以通过 客户端的TagName正常区别客户端,同时也客户端和服务器建立链接和断开时,同UID进行区分管理






















