radicale 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. # This file is related to Radicale - CalDAV and CardDAV server
  2. # for logwatch (script)
  3. # Copyright © 2024-2024 Peter Bieringer <pb@bieringer.de>
  4. #
  5. # Detail levels
  6. # >= 5: Logins, ResponseTimes
  7. $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
  8. my %ResponseTimes;
  9. my %Requests;
  10. my %Logins;
  11. my %Loglevel;
  12. my %OtherEvents;
  13. sub ResponseTimesMinMaxAvg($$) {
  14. my $req = $_[0];
  15. my $time = $_[1];
  16. $ResponseTimes{$req}->{'cnt'}++;
  17. if (! defined $ResponseTimes{$req}->{'min'}) {
  18. $ResponseTimes{$req}->{'min'} = $time;
  19. } elsif ($ResponseTimes->{$req}->{'min'} > $time) {
  20. $ResponseTimes{$req}->{'min'} = $time;
  21. }
  22. if (! defined $ResponseTimes{$req}->{'max'}) {
  23. $ResponseTimes{$req}{'max'} = $time;
  24. } elsif ($ResponseTimes{$req}->{'max'} < $time) {
  25. $ResponseTimes{$req}{'max'} = $time;
  26. }
  27. if (! defined $ResponseTimes{$req}->{'avg'}) {
  28. $ResponseTimes{$req}->{'avg'} = $time;
  29. } else {
  30. $ResponseTimes{$req}->{'avg'} = ($ResponseTimes{$req}->{'avg'} * ($ResponseTimes{$req}->{'cnt'} - 1) + $time) / $ResponseTimes{$req}->{'cnt'};
  31. }
  32. }
  33. while (defined($ThisLine = <STDIN>)) {
  34. # count loglevel
  35. if ( $ThisLine =~ /\[(DEBUG|INFO|WARNING|ERROR|CRITICAL)\] /o ) {
  36. $Loglevel{$1}++
  37. }
  38. # parse log for events
  39. if ( $ThisLine =~ /Radicale server ready/o ) {
  40. $OtherEvents{"Radicale server started"}++;
  41. }
  42. elsif ( $ThisLine =~ /Stopping Radicale/o ) {
  43. $OtherEvents{"Radicale server stopped"}++;
  44. }
  45. elsif ( $ThisLine =~ / (\S+ response status)/o ) {
  46. if ( $ThisLine =~ / (\S+) response status for .* with depth '(\d)' in ([0-9.]+) seconds: (\d+)/o ) {
  47. ResponseTimesMinMaxAvg($1 . "|R=" . $4 . "|D=" . $2, $3);
  48. } elsif ( $ThisLine =~ / (\S+) response status for .* in ([0-9.]+) seconds: (\d+)/ ) {
  49. ResponseTimesMinMaxAvg($1 . "|R=" . $3, $2);
  50. }
  51. }
  52. elsif ( $ThisLine =~ / (\S+) request for/o ) {
  53. $Requests{$1}++;
  54. }
  55. elsif ( $ThisLine =~ / Successful login: '([^']+)'/o ) {
  56. $Logins{$1}++;
  57. }
  58. elsif ( $ThisLine =~ / (Failed login attempt) /o ) {
  59. $OtherEvents{$1}++;
  60. }
  61. elsif ( $ThisLine =~ /\[(DEBUG|INFO)\] /o ) {
  62. # skip if DEBUG+INFO
  63. }
  64. else {
  65. # Report any unmatched entries...
  66. $ThisLine =~ s/^\[\d+(\/Thread-\d+)?\] //; # remove process/Thread ID
  67. chomp($ThisLine);
  68. $OtherList{$ThisLine}++;
  69. }
  70. }
  71. if ($Started) {
  72. print "\nStatistics:\n";
  73. print " Radicale started: $Started Time(s)\n";
  74. }
  75. if (keys %Loglevel) {
  76. print "\n**Loglevel counters**\n";
  77. printf "%-18s | %7s |\n", "Loglevel", "cnt";
  78. print "-" x30 . "\n";
  79. foreach my $level (sort keys %Loglevel) {
  80. printf "%-18s | %7d |\n", $level, $Loglevel{$level};
  81. }
  82. }
  83. if (keys %Requests) {
  84. print "\n**Request counters**\n";
  85. printf "%-18s | %7s |\n", "Request", "cnt";
  86. print "-" x30 . "\n";
  87. foreach my $req (sort keys %Requests) {
  88. printf "%-18s | %7d |\n", $req, $Requests{$req};
  89. }
  90. }
  91. if ($Detail >= 5 && keys %Requests) {
  92. print "\n**Successful login counters**\n";
  93. printf "%-25s | %7s |\n", "Login", "cnt";
  94. print "-" x37 . "\n";
  95. foreach my $login (sort keys %Logins) {
  96. printf "%-25s | %7d |\n", $login, $Logins{$login};
  97. }
  98. }
  99. if ($Detail >= 5 && keys %ResponseTimes) {
  100. print "\n**Response timings (counts, seconds) (R=<result> D=<depth>)**\n";
  101. printf "%-18s | %7s | %7s | %7s | %7s |\n", "Response", "cnt", "min", "max", "avg";
  102. print "-" x60 . "\n";
  103. foreach my $req (sort keys %ResponseTimes) {
  104. printf "%-18s | %7d | %7.3f | %7.3f | %7.3f |\n", $req, $ResponseTimes{$req}->{'cnt'}, $ResponseTimes{$req}->{'min'}, $ResponseTimes{$req}->{'max'}, $ResponseTimes{$req}->{'avg'};
  105. }
  106. }
  107. if (keys %OtherEvents) {
  108. print "\n**Other Events**\n";
  109. foreach $ThisOne (sort keys %OtherEvents) {
  110. print "$ThisOne: $OtherEvents{$ThisOne} Time(s)\n";
  111. }
  112. }
  113. if (keys %OtherList) {
  114. print "\n**Unmatched Entries**\n";
  115. foreach $ThisOne (sort keys %OtherList) {
  116. print "$ThisOne: $OtherList{$ThisOne} Time(s)\n";
  117. }
  118. }
  119. exit(0);
  120. # vim: shiftwidth=3 tabstop=3 syntax=perl et smartindent