【问题标题】:Include timestamp in vala log message在 vala 日志消息中包含时间戳
【发布时间】:2018-02-16 23:17:00
【问题描述】:

我的 vala 应用程序代码中有很多 debug(...) 和 info(...) 日志记录,我正在尝试在日志记录中添加时间戳。

我避免使用 set_writer_func,因为它需要 glib "2.50" 而 EOS Loki 是 glib 2.48。下面的 MVCE 给了我正确的输出格式,但我无法设置日志级别,即将级别设置为 INFO 不应输出 DEBUG 消息。

在此先感谢您提供任何帮助/指示。

public class LogTest {
    public static int main(string[] args) {
        Environment.set_variable ("G_MESSAGES_DEBUG", "all", true);
        Log.set_default_handler(
            (domain, level, message) => {
                domain = "My.Domain";
                level = GLib.LogLevelFlags.LEVEL_INFO;
                print("[%s] [%s] %s\n", Time.local(time_t()).to_string(), level.to_string(), message);
            }
        );

        debug("logging debug");
        info("logging info");
        warning("logging warning");

        return 0;
    }
}

这给出了以下输出,我没想到会出现调试。

[2018-02-16 23:14:53] [G_LOG_LEVEL_INFO] logging.vala:12: logging debug
[2018-02-16 23:14:53] [G_LOG_LEVEL_INFO] logging.vala:13: logging info
[2018-02-16 23:14:53] [G_LOG_LEVEL_INFO] logging.vala:14: logging warning

Granite.Services.Logger 似乎拥有我想要的东西,所以暂时就用它吧。在此处添加 MVCE,以防它使某人受益。

using Granite.Services;
public class LogTest {
    public static int main(string[] args) {
        Environment.set_variable ("G_MESSAGES_DEBUG", "all", true);

        Logger.initialize("My.Domain");
        Logger.DisplayLevel = LogLevel.INFO;

        debug("logging debug");
        info("logging info");
        warning("logging warning");
        return 0;
    }
}

用 valac --pkg=granite logging.vala 编译然后运行:

[INFO 12:44:33.454785] logging.vala:26: logging info
[WARNING 12:44:33.454839] logging.vala:27: logging warning

【问题讨论】:

    标签: logging glib vala


    【解决方案1】:

    处理基于G_MESSAGES_DEBUG 的过滤的代码是the default log handler 的一部分;如果您实现自定义处理程序,您还可以根据您想要的任何设置过滤消息。

    【讨论】:

    • 感谢您的更新。如何更改默认日志处理程序的日志记录(我以为我在上面的 Log.set_default_handler 函数调用中做了同样的事情)。另外,我在上面的代码中做错了什么以不抑制调试日志。或者,我如何过滤消息以将时间戳添加到日志记录中。
    • 我添加了一个使用花岗岩库的解决方案。它似乎产生了我想要的带有时间戳的日志记录
    • Log.set_default_handler 将设置默认日志处理程序,但默认日志处理程序的默认实现(ieLog.default_handler)是我正在谈论的逻辑居住。换句话说,如果您将默认日志处理程序更改为自定义函数(就像您正在做的那样),您需要重现您需要的任何过滤逻辑。
    • 感谢您的澄清。我无法找到 default_handler 的过滤功能 - 它是 writer_default。如果是,我会在我的发行版中的 glib 版本为 2.50 时尝试一下
    • 您必须编写自己的过滤函数,GLib 在您要替换的函数中。通常不会在应用程序中过滤消息,除非您只是简单地写入 stdout/stderr(就像 GLib 一样)。通常自定义处理程序用于记录到其他一些服务(syslog、journald 或类似 stackdriver 的东西),并且任何过滤都将在下游完成,因此 glib 的方法是有意义的。
    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多