File Coverage: lib/Mojolicious/Plugin/ConsoleLogger.pm

# File Coverage

File: | lib/Mojolicious/Plugin/ConsoleLogger.pm
Coverage: | 98.1%

line | stmt | bran | cond | sub | pod | time | code
--- | --- | --- | --- | --- | --- | --- | ---
1 |  |  |  |  |  |  | package Mojolicious::Plugin::ConsoleLogger;
2 |
3 | 1 1 1 |  |  | 1 |  | 422 1 11 | use Mojo::Base 'Mojolicious::Plugin';
4 | 1 1 1 |  |  | 1 |  | 102 1 13 | use Mojo::ByteStream;
5 | 1 1 1 |  |  | 1 |  | 30 1 10 | use Mojo::JSON;
6 |
7 |  |  |  |  |  |  | our $VERSION = 0.01;
8 |
9 |  |  |  |  |  |  | has logs => sub {
10 |  |  |  |  |  |  | return {
11 |  |  |  |  |  |  | fatal => [],
12 |  |  |  |  |  |  | info => [],
13 |  |  |  |  |  |  | debug => [],
14 |  |  |  |  |  |  | error => [],
15 |  |  |  |  |  |  | };
16 |  |  |  |  |  |  | };
17 |
18 |  |  |  |  |  |  | sub register {
19 | 1 |  |  | 1 | 1 | 48 | my ($plugin, $app) = @_;
20 |
21 |  |  |  |  |  |  | # override Mojo::Log->log
22 | 1 1 1 |  |  | 1 |  | 110 1 374 | no strict 'refs';
23 | 1 1 |  |  |  |  | 1 4 | my $stash = \%{"Mojo::Log::"};
24 | 1 |  |  |  |  | 4 | my $orig = delete $stash->{"log"};
25 |
26 | 1 |  |  |  |  | 4 | *{"Mojo::Log::log"} = sub {
27 | 17 17 |  |  | 17 |  | 78448 137 | push @{$plugin->logs->{$_[1]}} => $_[-1];
28 |
29 |  |  |  |  |  |  | # Original Mojo::Log->log
30 | 17 |  |  |  |  | 219 | $orig->(@_);
31 | 1 |  |  |  |  | 4 | };
32 |
33 |  |  |  |  |  |  | $app->hook(
34 |  |  |  |  |  |  | after_dispatch => sub {
35 | 3 |  |  | 3 |  | 18031 | my $self = shift;
36 | 3 |  |  |  |  | 30 | my $logs = $plugin->logs;
37 |
38 |  |  |  |  |  |  | # leave static content untouched
39 | 3 | 100 |  |  |  | 41 | return if $self->stash('mojo.static');
40 |
41 | 2 |  |  |  |  | 26 | my $str = "\n<!-- Mojolicious logging -->\n<script>";
42 |
43 | 2 |  |  |  |  | 17 | for (sort keys %$logs) {
44 | 8 8 | 50 |  |  |  | 8 19 | next if !@{$logs->{$_}};
45 | 8 |  |  |  |  | 16 | $str .= "console.group(\"$_\"); ";
46 | 8 8 8 |  |  |  |  | 7 6 20 | $str .= _format_msg($_) for @{$logs->{$_}};
47 | 8 |  |  |  |  | 414 | $str .= "console.groupEnd(\"$_\"); ";
48 |  |  |  |  |  |  | }
49 |
50 | 2 |  |  |  |  | 18 | $str .= "</script>\n";
51 |
52 | 2 |  |  |  |  | 15 | $self->res->body($self->res->body . $str);
53 |  |  |  |  |  |  | }
54 | 1 |  |  |  |  | 13 | );
55 |  |  |  |  |  |  | }
56 |
57 |  |  |  |  |  |  | sub _format_msg {
58 | 24 |  |  | 24 |  | 820 | my $msg = shift;
59 |
60 | 24 | 100 |  |  |  | 65 | return "console.log(" . Mojo::JSON->new->encode($_) . "); " if ref $msg;
61 |
62 | 21 |  |  |  |  | 120 | return "console.log(" . Mojo::ByteStream->new($_)->quote . "); ";
63 |  |  |  |  |  |  | }
64 |
65 |  |  |  |  |  |  | 1;
66 |
67 - 124 |  |
    =head1 NAME

    Mojolicious::Plugin::ConsoleLogger - Console logging in your browser

    =head1 DESCRIPTION

    L<Mojolicious::Plugin::ConsoleLogger> pushes Mojolicious log messages to your browser's console tool.

    =head1 USAGE

        use Mojolicious::Lite;

        plugin 'console_logger';

        get '/' => sub {

            app->log->debug("Here I am!");
            app->log->error("This is bad");
            app->log->fatal("This is really bad");
            app->log->info("This isn't bad at all");

            shift->render(text => 'Ahm in ur browzers, logginz ur console');
        };

        app->start;

    =head1 METHODS

    L<Mojolicious::Plugin::ConsoleLogger> inherits all methods from
    L<Mojolicious::Plugin> and implements the following new ones.

    =head2 C<register>

        $plugin->register;

    Register condition in L<Mojolicious> application.

    =head1 SEE ALSO

    L<Mojolicious>

    =head1 DEVELOPMENT

    L<http://github.com/tempire/mojolicious-plugin-consolelogger>

    =head1 VERSION

    0.01

    =head1 CREDITS

    Implementation stolen from L<Plack::Middleware::ConsoleLogger>

    =head1 AUTHOR

    Glen Hinkle tempire@cpan.org

    =cut