Paul,

could you please try with the following replacement subroutine write_log:


# Log either to syslog or to a file
sub write_log($$$;@) {
  my($level,$am_id,$errmsg,@args) = @_;
  $am_id = !defined $am_id ? '' : "($am_id) ";
  # treat $errmsg as sprintf format string if additional arguments provided
  if (@args && index($errmsg,'%') >= 0) { $errmsg = sprintf($errmsg,@args) }
  $errmsg = Amavis::Util::sanitize_str($errmsg);
# my($old_locale) = POSIX::setlocale(LC_TIME,"C");  # English dates required!
# if (length($errmsg) > 2000) {  # crop at some arbitrary limit (< LINE_MAX)
#   $errmsg = substr($errmsg,0,2000) . "...";
# }
  my($alert_mark) = $level >= 0 ? '' : $level >= -1 ? '(!)' : '(!!)';
  if ($do_syslog && !$log_to_stderr) {
    # never go below this priority level
    my($prio) = $syslog_prio_name_to_num{uc(c('syslog_priority'))};
    if    ($level >   2) { $prio = LOG_DEBUG   if $prio > LOG_DEBUG   }
    elsif ($level >=  1) { $prio = LOG_INFO    if $prio > LOG_INFO    }
    elsif ($level >=  0) { $prio = LOG_NOTICE  if $prio > LOG_NOTICE  }
    elsif ($level >= -1) { $prio = LOG_WARNING if $prio > LOG_WARNING }
    elsif ($level >= -2) { $prio = LOG_ERR     if $prio > LOG_ERR     }
    else                 { $prio = LOG_CRIT    if $prio > LOG_CRIT    }
    my($firstlogerr,$lastlogerr); my($retries) = 0;
    for (;;) {  # retry a couple of times in case of syslog errors
      if (c('syslog_ident')    ne $current_syslog_ident ||
          c('syslog_facility') ne $current_syslog_facility) {
        close_log()  if !defined($current_syslog_ident) &&
                        !defined($current_syslog_facility);
        open_log();
      }
      undef $lastlogerr; my($pre) = $alert_mark;
      my($logline_size) = 980;  # less than  (1023 - prefix)
      while (length($am_id)+length($pre)+length($errmsg) > $logline_size) {
        my($avail) = $logline_size - length($am_id . $pre . "...");
        $! = 0;
        syslog($prio, "%s", $am_id . $pre . substr($errmsg,0,$avail) . "...");
        $lastlogerr = $!  if $! != 0 && !defined($lastlogerr);
        $pre = $alert_mark . "...";  $errmsg = substr($errmsg, $avail);
      }
      $! = 0;  syslog($prio, "%s", $am_id . $pre . $errmsg);
      $lastlogerr = $!  if $! != 0 && !defined($lastlogerr);
      last  if !defined($lastlogerr) || $retries >= 10;
      $firstlogerr =
        $lastlogerr  if defined($lastlogerr) && !defined($firstlogerr);
      sleep(1); $retries++;
    }
    if (!defined($lastlogerr) && $retries == 0) {
      # logged successfully on the first attempt
    } elsif (!defined($lastlogerr)) {  # logged on a subsequent attempt
      syslog(LOG_INFO, "%s",
        sprintf("%sSuccessfully logged after %d retries: %s",
                 $am_id,$retries,$firstlogerr));
    } else {  # logging failure, desperately try one more time
      my($msg) = sprintf("%s(!!)Syslog failure, %d retries: %s",
                         $am_id,$retries,$firstlogerr);
      print STDERR ($msg, "\n");
      sleep(10);  syslog(LOG_ERR, "%s", $msg);
    }
  } else {
    my($prefix) = sprintf("%s %s %s[%s]: ",      # prepare syslog-like prefix
           strftime("%b %e %H:%M:%S",localtime), c('myhostname'), $myname, $$);
    if (defined $loghandle && !$log_to_stderr) {
      lock($loghandle);
      seek($loghandle,0,2) or die "Can't position log file to its tail: $!";
      $loghandle->print($prefix, $am_id, $alert_mark, $errmsg, "\n")
        or die "Error writing to log file: $!";
      unlock($loghandle);
    } else {
      print STDERR ($prefix, $am_id, $alert_mark, $errmsg, "\n")
        or die "Error writing to STDERR: $!";
    }
  }
# POSIX::setlocale(LC_TIME, $old_locale);
}


--
  Mark

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
AMaViS-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/amavis-user
AMaViS-FAQ:http://www.amavis.org/amavis-faq.php3
AMaViS-HowTos:http://www.amavis.org/howto/

Reply via email to