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. :-)
>
>


Reply via email to