Ask Bjørn Hansen said the following on 02/19/2006 06:53 PM:
> 
> On Feb 18, 2006, at 6:30 PM, Robin Bowes wrote:
> 
> [...]
> 
>> 1. Use some separator character other than comma that can be  guaranteed
>> not to occur in any of the list items
>>
>> 2. Quote each item, if necessary.
> 
> [...]
> 
>>
>> Is it OK to add a dependency on Text::CSV_XS ?
> 
> 
> I dislike tab delimited output as much as the next guy, but maybe  it'd
> be appropriate here?

Yes, I'm not a fan but I agree it does seem to make sense here.

My main considerations for this are:

1. Easy to parse final log file
2. lightweight process to create log file
3. minimal dependencies

So, thinking through how this would work...

I could create the log line using:

    warn( ${$} . ' ' . $self->{_rejectprefix} . ' ' .
        join "\t",
        $prev_hook,
        $return,
        #
        # rest of fields
        #
        . "\n"
    );

The log line (in the file, i.e. with the timestamp) would look something
like:

@4000000043f8bb5d11a69bac 9989 -- spamassassin\t901\tspam score exceeded
threshold (#5.6.1)\t\t\t<[EMAIL PROTECTED]>\t\t5002\t
mur78-1-82-232-29-188.fbx.proxad.net,82.232.29.188\tno\t\t

This could be processed using something like:

while (<>)
  chomp;
  # logfile is in format "timestamp pid -- <rest of line>"
  if (/(@[[:xdigit:]]{24}) ([[:digit:]]+) -- (.*)/) {
    my ($timestamp, $pid, $restofline) = ($1, $2, $3);
    my @fields = split "\t", $restofline;
    # do stuff with @fields
  }
}

The only possible problem would be if any of the fields could possibly
contain a tab character.

I'm currently using the following fields:

    # PID:          ${$}
    # Plugin:       $prev_hook
    # Denial Code:  $return
    # Denial Text   $return_text
    # Message-Id:   $msgid
    # Sender:       $sender
    # Recipients:   $recipients
    # Message size: $mail_size
    # Remote Host:  $self->qp->connection->remote_host
    # Remote IP:    $self->qp->connection->remote_ip
    # Relay Client: $relay_client
    # Auth method:  $auth_method
    # Auth user:    $auth_user;

Of these, I believe only $sender and $recipients are likely to contain
the tab character. So, I could s/\t//g these two strings.

How does that sound?

R.

Reply via email to