【问题标题】:How to display information about the current user in Mojo :: Log如何在 Mojo 中显示当前用户的信息 :: Log
【发布时间】:2021-02-28 12:00:48
【问题描述】:

日志默认显示信息。在 Mojo::Log 中使用 _default 函数。

sub _default {
  my ($time, $level) = (shift, shift);
  my ($s, $m, $h, $day, $month, $year) = localtime $time;
  $time = sprintf '%04d-%02d-%02d %02d:%02d:%08.5f', $year + 1900, $month + 1, $day, $h, $m,
    "$s." . ((split /\./, $time)[1] // 0);
  return "[$time] [$$] [$level] " . join "\n", @_, '';
}

需要添加有关当前用户的信息(例如,他的 ID)。检索用户信息需要 App :: Controller 对象。 是否可以使用 before_dispatch 函数覆盖生成的 $app->log?

$app->hook(before_dispatch => sub($c){...});

【问题讨论】:

    标签: perl mojolicious


    【解决方案1】:

    一般情况下,您可以通过设置the format property 来更改记录器的格式。那部分相当琐碎。

    use Mojolicious::Lite -signatures;
    
    helper user => sub ($c) {
        return "bob";
    };
    
    get '/' => sub ($c) {
        app->log->warn('hello');
        $c->render(text => "Hello");
    };
    
    app->log->format( sub { app->user . ": " . join "\n", @_, '' } );
    app->start;
    

    这会奏效。这里的技巧是使用不属于格式代码引用传入的参数的一部分,然后关闭它。它适用于app

    您是说您的用户信息来自不同的控制器。这有点奇怪。上下文不应该包含有关当前用户的信息吗?

    【讨论】:

    • 我还没有找到将$c 转换为子格式的方法。不过可能有办法做到这一点。如果您在 Mojo::Log:: 命名空间中查看 CPAN 上的模块,它们都不会这样做。
    • 在您的示例中,app 无法访问当前请求,因此无法访问会话值。我不明白这将如何工作。 app 只是构建没有上下文的空控制器对象。
    • @len8200 我知道。我也不确定。我不经常使用 Mojo,所以我真的不知道在哪里挖掘或什么是典型的。我的意思是,你可以覆盖格式。您可能可以编写一个助手或可以访问上下文的 DSL-y 并使用它来代替 app->log->warn,并使其每次都设置格式。或者制作一个知道当前上下文或其他内容的自定义记录器。有很多方法,但其中大多数看起来相当复杂。
    • 我也有这个建议,但正在寻找真正的解决方案。
    • @len 了解更多有关您的架构可能会有所帮助。你能用两个控制器制作一个类似于我的答案的minimal reproducible example 吗?
    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2018-12-15
    • 2013-05-15
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多