|
|
sybperl-l Archive
Up Prev Next
From: "Natarajan (Ravi) Murugaiyan" <murugaiy at ncsa dot uiuc dot edu>
Subject: Client and Server messages
Date: Jul 21 1998 7:11PM
I have a need in my sybperl script to log client and server messages to a
log file.
All server messages by default come to the xterm. I tried
to redirect STDERR and STDOUT to logfile as follows:
$ myscript >> logfile 2>&1
With this approach, server messages are not logged to 'logfile' in the right
order. That is, I see server messages(from a stored procedure) even before
debug output which indicates that a stored procedure is going to be executed.
I tried to register my own client and server message callbacks.
The callbacks were copied from the code in lib/site_perl/ctutil.pl with
STDERR changed to my log file handle. When I do this, I get several
client messages which I don't know how to get around.
Here is a test program which has my own client and server message callbacks:
-----------------------------------------------------------
use Sybase::CTlib;
open(OUTFILE, ">> logfile") || die " cannot open logfile";
$conn = Sybase::CTlib->ct_connect('murugaiy', , 'SYBASE');
ct_callback(CS_CLIENTMSG_CB, \&my_msg_cb);
ct_callback(CS_SERVERMSG_CB, \&my_srv_cb);
$cmd = "use pubs";
if ($conn->ct_sql($cmd)) {
print OUTFILE "$cmd succeeded\n"
} else {
print OUTFILE "$cmd failed\n";
}
sub my_msg_cb {
my ($layer, $origin, $severity, $number, $msg, $osmsg) = @_;
printf OUTFILE "\nOpen Client Message: (my_msg_cb)\n";
printf OUTFILE "Message Number: LAYER = (%ld) ORIGIN = (%ld) ",
$layer, $origin;
printf OUTFILE "SEVERITY = (%ld) NUMBER = (%ld) \n",
$severity, $number;
printf OUTFILE "Message String: %s\n", $msg;
if (defined($osmsg)) {
printf OUTFILE "Operating System Error: %s\n", $osmsg;
}
CS_SUCCEED;
}
sub my_srv_cb {
my($cmd, $number, $severity, $state, $line, $server, $proc, $msg) = @_;
if ($severity > 10) {
printf OUTFILE "\n Server message: (my_srv_cb)\n";
printf OUTFILE "Message number: %ld, Severity %ld, ",
$number, $severity;
printf OUTFILE "State %ld, Line %ld\n", $state, $line;
if (defined($server)) {
printf OUTFILE "Server '%s'\n", $server;
}
if (defined($proc)) {
printf OUTFILE "Procedure '%s'\n", $proc;
}
print OUTFILE "Message String: $msg\n";
}
}
When I run this script, I see following messages in the "logfile":
use pubs succeeded
Open Client Message: (my_msg_cb)
Message Number: LAYER = (1) ORIGIN = (1) SEVERITY = (1) NUMBER = (50)
Message String: ct_results(): user api layer: external error: The connection has
been marked dead.
use pubs succeeded
Open Client Message: (my_msg_cb)
Message Number: LAYER = (1) ORIGIN = (1) SEVERITY = (1) NUMBER = (50)
Message String: ct_cmd_drop(): user api layer: external error: The connection ha
s been marked dead.
When the two calls to 'ct_callback()' are commented out, above messages
disappear.
How can I get around these messages?
Is there a better way to log client and server messages to a log file?
Thanks,
-------------------------------------------------------------------------
Natarajan Murugaiyan(Ravi) Phone (217) 333 - 1112
Alliance Information Management Email murugaiy@ncsa.uiuc.edu
270 CAB(Mail Code 476)
NCSA, University of Illinois at Urbana/Champaign
|