使用 Vala 进行日志记录
Posted
技术标签:
【中文标题】使用 Vala 进行日志记录【英文标题】:Logging with Vala 【发布时间】:2012-05-11 03:58:22 【问题描述】:我是 Vala 编程的新手,并且有使用 Java 和 .NET 的经验,但是我还没有找到任何有用的关于如何使用 Vala 登录的信息。是否有任何有用的日志记录工具,如 log4j 或 log4net,或者有什么建议的方式来登录 Vala,并扩展到多个日志记录级别,如错误、警告、调试和跟踪? 那么像断言和合同这样的防御性编程呢?是否有任何或建议的方法来进行防御性编程并获得带有堆栈跟踪和精确根本原因的最有用的日志? 感谢您的建议。
【问题讨论】:
【参考方案1】:记录
Vala 内置了一些相当强大的日志记录工具。您可以使用 debug()
、message()
、warning()
、error()
和 critical()
作为稍微复杂的 log()
函数的快捷方式。都包含在基础中(自动包含)GLib
namespace。
如果您想重定向日志输出或将不同类型的消息发送到不同的目的地,您需要的一切都在GLib.Log
namespace 中。您可能想阅读glib docs on logging 了解幕后发生的事情。
防御性编程
Vala 还包括对断言和合同的支持。简短版本:assert()
和 assert_not_reached()
用于断言,requires()
和 ensures()
用于合约的方法签名。有关详细信息,请参阅 Assertions and Contract Programming 上的教程部分。
错误处理
Vala 的错误处理有点奇怪:看起来类似于异常,但并不完全相同。 Error Handling 上的教程部分很好地涵盖了基础知识,再次阅读 glib docs on errors 以更深入地了解幕后发生的事情可能会有所帮助。据我所知,没有办法从 Vala 错误中获取堆栈跟踪——只有一个类型和一个消息。
最佳做法
在最佳实践方面,我认为 Vala 与 Java 或 C# 足够相似,以至于您已经知道的实践可以在一般意义上应用。我建议使用这些功能来感受一下 Vala 中的细节。祝你好运!
【讨论】:
Vala 是否支持自定义消息违反合同?还是会给出一个神秘的默认错误消息?我试图找到一种抛出错误的好方法,而 Vala 教程的默认“错误处理”/“合同编程”部分似乎没有描述任何真正有用的东西。 看起来合约被编译成对 g_return_if_fail() 的调用,它不支持任何自定义错误消息。你是对的,它从生成的 C 代码中显示的错误消息并不是最有用的。如果您希望抛出带有您自己的消息的自定义错误,Vala 不会为您提供任何语法糖——您只需使用老式的 if 和 throw 方法即可。【参考方案2】:作为对@chazomaticus 很好的答案的补充,您可以通过展开调用堆栈从 Vala 获取堆栈跟踪。
只是这没有融入 Vala 语言。
刚好写过这样的库:ivy
【讨论】:
【参考方案3】:我想在@chazomaticus 回答中添加两件事:
为什么我看不到任何调试/日志输出?
您必须将环境变量G_MESSAGES_DEBUG
设置为all
。文档中也提到了这一点,但没有进一步解释。例如。对于debug:
public static int main (string[] args)
// Use "G_MESSAGES_DEBUG=all ./test" to print debug messages!
// Output: ``** (process:<PID>): DEBUG: <FILENAME>:<LINE>: my 10. debug message``
debug ("my %d. %s", 10, "debug message");
return 0;
valac --pkg glib-2.0 GLib.debug.vala
G_MESSAGES_DEBUG=all ./GLib.debug
./GLib.debug
如果你想further restrict输出,你可以使用error
、warning
、critical
、message
、info
、debug
和help
而不是all
。
在哪里可以找到每个日志记录功能的文档?
Valadoc - GLib.debug Valadoc - GLib.warning Valadoc - GLib.info Valadoc - GLib.critical Valadoc - GLib.message Valadoc - GLib.error进一步阅读:
developer.gnome.org - GLib Reference Manual - Message Output and Debugging Functions - Debug Message Output valadoc.org - GLib.log.default_handler developer.gnome.org - Running and debugging GLib Applications ***.com - How does Vala support the C language's function file line macros?【讨论】:
以上是关于使用 Vala 进行日志记录的主要内容,如果未能解决你的问题,请参考以下文章
从多个进程使用 CloudLoggingHandler 进行日志记录