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/