Also, if you don't need for the DBI stuff to be "threaded" in with the rest
of your POE app, you can just initially create another Session that is a
Queue. Then write each $msg that comes in from PoCo::Server::Syslog to the
Queue. The Queue itself just sets an alarm to periodically process itself
in a POE::Wheel::Run or you can just fork it. The child part would then
handle the database connection and writing. I do this all the time and it
works really well.
-
Lance Braswell - + 1 469 357 6112
David Davis
<[EMAIL PROTECTED]
l.com> To
Jim <[EMAIL PROTECTED]>
03/31/2005 11:17 cc
AM poe@perl.org
Subject
Re: Syslog child on Windows
Please respond to
David Davis
<[EMAIL PROTECTED]
l.com>
There are quite a few DBI components for POE. You could use one of
those. I'm partial to mine, but you should judge for yourself.
http://cpan.teknikill.net/?poe*dbi
--
David Davis
Perl Programmer
http://teknikill.net/
$7.95 per month hosting
WITH ssh access
http://hosting.teknikill.net/
On Thu, 31 Mar 2005 11:41:28 -0500, Jim <[EMAIL PROTECTED]> wrote:
> I have a perl Syslog server setup on a windows box because it's connected
to
> a RAID Array. I'm using POE as the Syslog server code and I'm storing
the
> syslog data into a DB2 database. Here is what I currently have:
>
> use warnings;
> use strict;
>
> use POE;
> use POE::Component::Server::Syslog;
> use DBI; # library for performing database functions
> use DBD::DB2;
> use DBD::DB2::Constants;
> # use Mail::SendMail;
>
> POE::Component::Server::Syslog->spawn(
> BindAddress => '129.37.2.201',
> InputState => \&client_input,
> ErrorState => \&client_error,
> );
>
> my $debug = 1;
>
> $poe_kernel->run();
>
> ######################################
>
> sub client_input {
>
> # Get the syslog hash
> my $msg = $_[ARG0];
> my $databaseHandle;
> my $connectFailureFlag = 0;
> my $search;
> my $sth;
> my $dbName = "vpn";
> # Parse the data for DB entry
> $msg->{'msg'} =~ /^(.*?) (\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+)\.(\d+)
> SEV=. (.*?)$/;
>
> if ($debug) {
> print " Host: ".$msg->{'host'}."\n";
> print "Severity: ".$msg->{'severity'}."\n";
> print " Msg: ".$msg->{'msg'}."\n";
> my $databaseHandle = DBI->connect("DBI:DB2:$dbName","xxxxx","xxxxxx")
or
> $connectFailureFlag = 1;
> if ($connectFailureFlag == 1){ warn "Unable to establish with
> DB2:$dbName due to $DBI::errstr\n"; }
> elsif ($connectFailureFlag == 0){ # connected to DB
> $search = "INSERT INTO VPN.SYSLOG_C3K (DATE_TIME, DEVICE, SEV, MSG)
> values('$4-$2-$3-$5.$6.$7.$8', '".$msg->{'host'}."',
".$msg->{'severity'}.",
> '$9')";
> $sth = $databaseHandle->prepare("$search"); # prepare the statement
to
> read from the DB
> $sth->execute(); # execute the query
> $sth->finish;
> $databaseHandle->disconnect or warn "Disconnection failed:
> $DBI::errstr\n";
> }
> print "$2.$3.$4.$5.$6.$7.$8 $1 $9\n\n";
> } # if ($debug)
> }
>
> sub client_error {
> # Something went wrong with the syslog message
> # Figure out what to do, if anything, in this case later
> warn "BAD MESSAGE: $_[ARG0]";
> }
>
> What I'd like to do is collect the syslog data into an array while having
> another process pull the data out of that array and put into the
database.
> That way, I'm not creating database connections everytime I get a syslog
> message. Hopefully I'm clear in what I'm asking for. :-)
>
>