/lib/Teto/Role/Log.pm

http://github.com/motemen/Teto · Perl · 64 lines · 54 code · 10 blank · 0 comment · 8 complexity · 87ff1d2d331528d0662bfe6d06277f74 MD5 · raw file

  1. package Teto::Role::Log;
  2. use Mouse::Role;
  3. use Data::Dumper;
  4. use POSIX qw(strftime);
  5. use Coro::Debug;
  6. use Carp;
  7. my $LOG_LEVEL_TO_NUM = {
  8. DEBUG => 9,
  9. INFO => 3,
  10. NOTICE => 2,
  11. WARNING => 1,
  12. ERROR => 0,
  13. };
  14. sub log_extra_info { '' }
  15. sub log {
  16. my ($self, $level, @args) = @_;
  17. my $pkg = ref $self || $self;
  18. $pkg =~ s/^Teto:://;
  19. if (my $extra = $self->log_extra_info) {
  20. $pkg .= " <$extra>";
  21. }
  22. my $message = join ' ', map {
  23. local $Data::Dumper::Indent = 0;
  24. local $Data::Dumper::Maxdepth = 1;
  25. local $Data::Dumper::Terse = 1;
  26. !ref $_ || overload::Method($_, '""') ? "$_" : Data::Dumper::Dumper($_);
  27. } @args;
  28. utf8::encode $message if utf8::is_utf8 $message;
  29. if (defined (my $n = $LOG_LEVEL_TO_NUM->{ uc $level })) {
  30. Coro::Debug::log $n, $message;
  31. } else {
  32. carp qq(Could not convert log level '$level' into Coro::Debug::log level);
  33. }
  34. my $full_message = sprintf "[%d %s] %-6s %s - %s\n",
  35. 0+$Coro::current, strftime('%T', localtime()), uc $level, $pkg, $message;
  36. print STDERR $full_message;
  37. }
  38. sub log_coro {
  39. my ($self, @args) = @_;
  40. my ($pkg, $filename) = caller;
  41. $pkg =~ s/^Teto:://;
  42. $pkg = $filename if $filename !~ /\.pm$/;
  43. my $msg = sprintf "%s - %s\n",
  44. $pkg,
  45. join ' ', map {
  46. local $Data::Dumper::Indent = 0;
  47. local $Data::Dumper::Maxdepth = 1;
  48. local $Data::Dumper::Terse = 1;
  49. !ref $_ || overload::Method($_, '""') ? "$_" : Data::Dumper::Dumper($_);
  50. } @args;
  51. $msg =~ s/[\r\n]//g;
  52. $Coro::current->desc($msg);
  53. }
  54. 1;