NAME
    Log::Structured - Log events in a structured manner

VERSION
    version 0.001003

SYNOPSIS
     use Log::Structured;

     my $structured_log = Log::Structured->new({
       category            => 'Web Server',
       log_category        => 1,
       priority            => 'trace',
       log_priority        => 1,
       log_file            => 1,
       log_line            => 1,
       log_date            => 1,
       log_event_listeners => [sub {
          my ($self, $e) = @_;
          my @date = @{$e->{date}};

          my $ymd_hms  = "$date[5]-$date[4]-$date[3] $date[2]:$date[1]:$date[0]";
          my $location = "$e->{file}:$e->{line}";
          warn "[$ymd_hms][$location][$e->{priority}][$e->{category}] $e->{message}"
       }, sub {
          open my $fh, '>>', 'log';
          print {$fh} encode_json($_[1]) . "\n";
       }],
     });

     $structured_log->log_event({ message => 'Starting web server' });

     $structured_log->log_event({
       message => 'Oh no!  The database melted!',
       priority => 'fatal',
       category => 'Core',
     });

DESCRIPTION
    This module is meant to produce logging data flexibly and powerfully.
    All of the data that it produces can easilly be serialized or put into a
    database or printed on the top of a cake or whatever else you may want
    to do with it.

ATTRIBUTES
  log_event_listeners
    "ArrayRef[CodeRef]", coderefs get called in order, as methods, with log
    events as an argument

  caller_clan
    A stringified regex matching packages to use when getting any caller
    information (including stacktrace.) Typically this will be used to
    exclude things from the caller information. So to exclue DBIx::Class and
    SQL::Abstract from your caller information:

     caller_clan => '^DBIx::Class|^SQL::Abstract',

  category
    String representing the category of the log event

  priority
    String representing the priority of the log event. Should be debug,
    trace, info, warn, error, or fatal.

  start_time
    Returns an "ArrayRef" containing the time the object was instantiated

  last_event
    Returns an "ArrayRef"h containing the last time a log event occurred

  caller_depth
    An integer caller levels to skip when getting any caller information
    (not including stacktrace.)

ATTRIBUTES TO ENABLE LOG DATA
    All of the following attributes will enable their respective data in the
    log event:

    *
     log_milliseconds_since_start

    *
     log_milliseconds_since_last_log

    *
     log_line

    *
     log_file

    *
     log_package

    *
     log_subroutine

    *
     log_category

    *
     log_priority

    *
     log_date

    *
     log_host

    *
     log_pid

    *
     log_stacktrace

METHODS
  add_log_event_listener
    Takes a coderef to be added to the "log_event_listeners"

  log_event
    Takes a hashref of the data to be passed to the event listeners. All of
    the data except for "message", "category", and "priority" will be
    automatically populated by the methods below, unless they are passed in.

  milliseconds_since_start
    Returns milliseconds since object has been instantiated

  milliseconds_since_last_log
    Returns milliseconds since previous log event

  line
    Returns the line at the correct depth

  file
    Returns the file at the correct depth

  package
    Returns the package at the correct depth

  subroutine
    Returns the subroutine at the correct depth

  date
    Returns an arrayref containing the results from "localtime"

  host
    Returns the host of the machine being logged on

  pid
    Returns the pid of the process being logged

  stacktrace
    Returns the a stacktrace ending at the correct depth. The stacktrace is
    an arrayref of arrayrefs, where the inner arrayrefs match the return
    values of caller in list context

SEE ALSO
    During initial development all the code from this module was part of
    Log::Sprintf. This module continues to work with "Log::Sprintf". For
    example the "SYNOPSIS"' example of instantiation could be rewritten as:

     use Log::Structured;
     use Log::Sprintf;

     my $formatter = Log::Sprintf->new({ format => "[%d][%F:%L][%p][%c] %m" });

     my $structured_log = Log::Structured->new({
       category            => 'Web Server',
       log_category        => 1,
       priority            => 'trace',
       log_priority        => 1,
       log_file            => 1,
       log_line            => 1,
       log_date            => 1,
       log_event_listeners => [sub {
          warn $formatter->sprintf($_[1])
       }, sub {
          open my $fh, '>>', 'log';
          print {$fh} encode_json($_[1]) . "\n";
       }],
     });

AUTHOR
    Arthur Axel "fREW" Schmidt <frioux+cpan@gmail.com>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2013 by Arthur Axel "fREW" Schmidt.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.