(c ++)游戏的日志记录库


15

我知道很多日志库,但没有测试很多。(GoogleLog,Pantheios,即将推出的boost :: log库...)

在游戏中,尤其是在远程多人游戏和多线程游戏中,日志记录对于调试至关重要,即使最终删除所有日志也是如此。

假设我正在制作需要日志(多人游戏,多线程和/或多进程)的PC游戏(而不是控制台),并且我有充分的理由寻找要记录的库(例如,我没有时间或对我为自己的情况正确写出自己的能力不自信)。

假设我需要:

  1. 性能
  2. 易于使用(允许流式传输或格式化或类似的操作)
  3. 可靠(不要泄漏或崩溃!)
  4. 跨平台(至少Windows,MacOSX,Linux / Ubuntu)

您会推荐Wich日志库吗?

目前,我认为boost :: log是最灵活的一种(您甚至可以远程登录!),但是性能更新不佳:是为了高性能,但尚未发布。Pantheios通常被引用,但是我在性能和用法上没有比较点。我已经使用我自己的lib很长时间了,但是我知道它不能管理多线程,所以即使它足够快,它也是一个大问题。Google Log似乎很有趣,我只需要对其进行测试,但是如果您已经比较了这些库和更多库,那么您的建议可能会有用。

游戏通常对性能要求很高,但调试起来很复杂,因此最好了解在我们特定的情况下具有明显优势的日志记录库。


3
您没有提到的一项重要要求就是您打算使用日志的目的。日志记录(例如,调试消息),设计人员的度量标准,客户支持的字符状态以及信用卡交易的要求是不同的。通常,您需要权衡性能,程序员的易用性,脱机分析的简便性/速度以及持久性(取决于情况)。

是的,但是我假设一个“完整的”日志记录解决方案将允许用户设置您所描述的不同类型的日志。如果您发现此精度对问题很重要,请成为我的客人,并将其添加到问题中。
Klaim

Answers:


8

使用套接字记录日志(任何套接字包装程序都可以满足)+ Web浏览器websocket =>可能使用的最通用,不引人注目的日志记录工具,将节省数小时的调试时间并且避免麻烦。

  • 异步的(速度使它延迟了浏览器上的所有工作)
  • 格式化(颜色,大小等。)
  • 可靠(插座...)
  • 跨平台(浏览器)

现在,奖金:

  • 动态过滤非常容易完成(如果需要,可以使用javascript正则表达式)
  • 与日志历史记录,内存和比较(“浏览器”数据库中的HTML5规范)
  • 简单的方法来对任何数据(使用SVG或canvas或其他任何东西)制作一些图形,例如内存内存碎片等。
  • 制作任何数据的2D图形的简单方法(kd-tree细分?势场?甚至只是可变值变化?等)
  • 允许远程记录(使用浏览器在其他计算机上)
  • 在浏览器存储中使用html5,您可以存储日志会话参数(当前日志过滤器等,甚至包括每个注释)
  • 只需单击一下,就很容易创建错误报告或链接跟踪票
  • 具有时间轴GUI的轻松倒带日志功能

以及日志之外的更多任务:

  • 允许探查器信息(图形...)
  • 甚至可以用作控制台(从浏览器发送命令),甚至可以使用使用某些HTML甚至Flash ui的快速GUI
  • 浏览器中的图像差异(使用套接字发送图像,并使用画布图像像素功能在浏览器中进行比较)
  • 等等...

(以上几乎所有这些操作都可以使用Flash套接字来完成,节省了数据库功能)

现在我知道设置它似乎有点长。但这确实是在冗长的项目上花费大量时间,而且要进行艰难的调试(例如在游戏中)。这是自调试器以来我使用的最强大的功能...

注意1:调试游戏联网代码时唯一的缺点=>仔细检查副作用(影响套接字缓冲区大小,延迟,带宽等)

注意2:出于安全原因,默认情况下,某些浏览器已在websocket上停用,请检查about:config内容以确保已启用。


1
如果我错了,请纠正我,但这仅表明将日志输出定向到何处,不是吗?真正的日志库还允许在编译时进行过滤(如果性能成为问题,这是至关重要的),格式化并提供易于使用的语法来创建日志消息。
2011年

@sbi在应用程序端是全局的开或关。“浏览器日志客户端”执行过滤,语法,但始终获取所有日志。这是激进的,但它基于经验,在开发期间,您应始终记录所有内容,以便可以轻松捕获/重现偶然发现的任何错误。如果必须进行优化,它又是浏览器方面的问题:使用套接字,您不必使用字符串进行日志记录,就可以直接记录二进制数据(Id +浮点数),这比任何其他基于字符串的日志lib ...都要大胆。将ID匹配到字符串浏览器端...)
Tuan Kuranes 2011年

1
虽然我可以看到这很实用,但实际上它只是记录器的后端(templog称为“日志接收器”,IIRC)。性能是列出的要求之一。我发现我需要在调试时在代码段中添加日志语句,但是一旦启动并运行该代码段,将变得过于健谈并淹没我正在处理的所有内容,而且会产生噪音。太多的性能。因此,我希望能够通过更改几行代码来调高和调低整个代码的日志级别。这就是日志库的中间层为您执行的操作。
2011年

@sbi:可能需要基准测试,但是即使是最低的日志记录级别,最好的日志记录库也有可能比记录所有内容的二进制记录器还要贵。甚至没有浪费一个“二进制到char”的CPU周期...因此它确实具有更多功能和更高性能。
Tuan Kuranes 2011年

在决定实际使用templog之前,我们进行了一些测试。如果针对特定日志消息的严重性,来源或其他原因关闭了日志记录,并且如果编译器能够发现在评估参数方面没有副作用,则VC确实能够优化成熟的日志记录。将语句记录为虚无。谈到速度,您将不会打败那些不应该首先执行的代码。
2011年

8

在性能方面,我发现了templog几乎没有什么变化。它使用表达式模板来推迟对日志记录语句的评估,直到确定将完全记录该信息为止。由于您还可以部分关闭日志记录(取决于日志消息的严重性,来源和目标受众),因此对于发布版本,编译器可以将其中的某些日志记录语句消除为零代码。(我实际上已经看到这种情况在VC中发生。)

最近图书馆没有做太多事情,SO上的其他人发现行李箱在某些方面缺乏,但是在我曾经工作过的一家公司中,我们发现这个人反应灵敏,甚至我当时的奶牛工人之一获得了提交访问权限并向其中添加了一些代码,因此您可能会觉得值得一试。

要列举您的要求:

性能

我找到的最好的。尤其是它在编译时排除日志消息并让编译器完全消除日志消息的功能非常吸引人。

易于使用(允许流式传输或格式化或类似的操作)

当您做错事时,会有一些经典的可怕的模板错误编译器错误消息-meta东西,但是当涉及到易用性时,

TEMPLOG_LOG(my_logger,sev_error,aud_support) << "logged in as " << user_name;

很难被击败。
但是,您可能必须创建自己的日志接收器(日志消息在此处发送),因为一些预先打包的日志接收器(stderr,文件,Windows日志记录等)并不那么复杂。由于性能是主要目标,因此整个过程的内在特性有些复杂(例如日志消息格式化程序与日志接收器纠缠不清),但是我们确实掌握了这一点(我记得在调试器中逐步完成了此工作),知道编写自己的消息格式器或日志接收器并不难。

可靠(不要泄漏或崩溃!)

我们使用它时并未发现任何严重问题。那里几乎没有动态内存分配,因此很难想象它做错了什么。当然,我们只在一种产品中进行了实际测试。

跨平台(至少Windows,MacOSX,Linux / Ubuntu)

使用它时,我们在Win32,OSX和几种不同的Linux发行版(其中包括Ubuntu)上使用了它。

至于多线程:我们还没有使用过它,但是从我记忆中的lib体系结构来看,您似乎只需要在日志接收器中处理它。ICBWT。


谢谢,我不知道这个。至少在最初的想法中,它看起来像boost :: log的简化(和高性能)版本。
克莱姆(Klaim)2011年

@Klaim:我上次查看C ++日志记录库时认为boost没有提供任何功能,所以我不知道boost :: log。
2011年

1
@Joe:您了解术语“表达式模板”吗?
2011年

1
我以为自己做了,但是现在我已经下载并开始阅读templog源代码,看来C ++再次使我不胜其烦。

1
@sbi:我感到困惑的部分原因是您的陈述“一次通过了多个层次”-用英语一次可以立即表示一起表示,在这种情况下是相反的。我读的是第一篇,而您(现在显然对我来说)是第二篇。感谢您抽出宝贵的时间来解释它。


0

您可能对Baical工具集感兴趣:

  • 用于日志,跟踪和遥测的开源和跨平台(Win,Linux,x86 / x64)库-P7
  • 速度快得惊人(专为嵌入式设备而设计)-每秒300万条日志进入网络,500万条记录在现代CPU上。我不知道还有其他任何日志记录库可以为每个日志消息提供如此快的速度和如此详细的信息。
  • 线程安全
  • 每个跟踪消息包含:
    • 短信
    • 水平
    • 精确时间(100ns)
    • 源文件,函数名称和行
    • 模块ID和模块名称
    • 线程ID和线程名称
    • 处理器核心索引
  • 服务器应用程序,用于接收和查看日志及遥测
  • 您可以实时收集,分析,搜索,过滤来自多个来源的日志

截至06/2017,尚不支持字符串格式的%s。
Romeno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.