DBI.pm 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package Trog::Log::DBI;
  2. use strict;
  3. use warnings;
  4. use parent qw{Log::Dispatch::DBI};
  5. use Ref::Util qw{is_arrayref};
  6. use Capture::Tiny qw{capture_merged};
  7. our $referer;
  8. sub create_statement {
  9. my $self = shift;
  10. # This is a writable view. Consult schema for its behavior.
  11. my $sql = "INSERT INTO all_requests (uuid, date, ip_address, user, method, route, code, referer) VALUES (?,?,?,?,?,?,?,?)";
  12. my $sql2 = "INSERT INTO messages (uuid, message) VALUES (?,?)";
  13. $self->{sth2} = $self->{dbh}->prepare($sql2);
  14. return $self->{dbh}->prepare($sql);
  15. }
  16. my %buffer;
  17. sub log_message {
  18. my ($self, %params) = @_;
  19. # Rip apart the message. If it's got any extended info, lets grab that too.
  20. my $msg = $params{message};
  21. my $message;
  22. my ($date, $uuid, $ip, $user, $method, $code, $route) = $msg =~ m!^([\w|\-|:]+) \[INFO\]: RequestId ([\w|\-]+) From ([\w|\.|:]+) \|(\w+)\| (\w+) (\d+) (.+)!;
  23. # Otherwise, let's mark it down in the "messages" table. This will be deferred until the final write.
  24. if (!$date) {
  25. ($date, $uuid, $ip, $user, $message) = $msg =~ m!^([\w|\-|:]+) \[\w+\]: RequestId ([\w|\-]+) From ([\w|\.|:]+) \|(\w+)\| (.+)!;
  26. $buffer{$uuid} //= [];
  27. push(@{$buffer{$uuid}}, $message);
  28. return 1;
  29. }
  30. # If this is a mangled log, forget it.
  31. return unless $date && $uuid;
  32. # Allow callers to set referer.
  33. # We only care about this in DB context, as it's only for metrics, which are irrelevant in text logs/debugging.
  34. $referer //= 'none';
  35. my $res = $self->{sth}->execute($uuid, $date, $ip, $user, $method, $route, $code, $referer );
  36. if (is_arrayref($buffer{$uuid}) && @{$buffer{$uuid}}) {
  37. $self->{sth2}->bind_param_array(1, $uuid);
  38. $self->{sth2}->bind_param_array(2, $buffer{$uuid});
  39. $self->{sth2}->execute_array({});
  40. delete $buffer{$uuid};
  41. }
  42. return $res;
  43. }
  44. 1;