Icon View Thread

The following is the text of the current message along with any replies.
Messages 1 to 2 of 2 total
Thread Log to DBISAM table
Fri, May 19 2017 11:37 AMPermanent Link

Shedden

Hi All,

I needed to be able to query server log files, so I wrote a bit of code and thought it might help someone else. Its not complete, just to get you started. Sorry, I'm a C++ guy....

In reading the forums, I noticed someone asking for something like this, but I couldn't find the thread again to attach this to. As always, use at your own peril! It's nice to be able to transfer the table information to Excel and discuss it with a client. Debugging is hard enough from the server side.

AnsiString TForm1::nameLogCategory(TLogCategory t)
{
AnsiString rslt="";
switch(t)
{
 case lcInformation: rslt="Information";
  break;
 case lcWarning: rslt="Warning";
  break;
 case lcError: rslt="Error";
  break;
}
return(rslt);
}

AnsiString TForm1::nameLogEvent(TLogEventType t)
{
AnsiString rslt="";
switch(t)
{
 case leNone: rslt="None";
  break;
 case leServerStart: rslt="ServerStart";
  break;
 case leServerStop: rslt="ServerStop";
  break;
 case leConnect: rslt="Connect";
  break;
 case leReconnect: rslt="Reconnect";
  break;
 case leDisconnect: rslt="Disconnect";
  break;
 case leLogin: rslt="Login";
  break;
 case leLogout: rslt="Logout";
  break;
 case leDeadSession: rslt="DeadSession";
  break;
 case leNoSession: rslt="NoSession";
  break;
 case leAddressBlock: rslt="AddressBlock";
  break;
 case leMaxConnect: rslt="MaxConnect";
  break;
 case leInvalidLogin: rslt="InvalidLogin";
  break;
 case leLoginDenied: rslt="LoginDenied";
  break;
 case leConfiguration: rslt="Configuration"; //loading or saving server config file
  break;
 case leScheduledEvent: rslt="ScheduledEvent";
  break;
 case leEncryptionMismatch: rslt="EncryptionMismatch";
  break;
 case leVersionMismatch: rslt="VersionMismatch";
  break;
}
return(rslt);
}

void TForm1::getParseServerLog()
{
TDBISAMTable* tbl = new TDBISAMTable(NULL);
TLogRecord logRec;
int remoteLogCount;
int idx;
AnsiString s;

setStatusBar("Retrieving Server Log...");
tbl->SessionName="localData";
tbl->Active = false;
tbl->DatabaseName=fldRptDir->Text;
tbl->TableName = "serverLog";
tbl->FieldDefs->Clear();
if(tbl->Exists)
tbl->DeleteTable();

TDBISAMFieldDef *pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "time";
pNewDef->DataType = ftDateTime;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "user";
pNewDef->DataType = ftString;
pNewDef->Size=30;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "address";
pNewDef->DataType = ftString;
pNewDef->Size=16; //spec says 60, who knows why change if it truncates

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "session";
pNewDef->DataType = ftInteger;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "thread";
pNewDef->DataType = ftInteger;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "category";
pNewDef->DataType = ftString;
pNewDef->Size=11;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "event";
pNewDef->DataType = ftString;
pNewDef->Size=18;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "text";
pNewDef->DataType = ftString;
pNewDef->Size=255; //limited to short string by server implementation

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "request";
pNewDef->DataType = ftString;
pNewDef->Size=30;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "ServerVersion";
pNewDef->DataType = ftFloat;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "ClientVersion";
pNewDef->DataType = ftFloat;

pNewDef = tbl->FieldDefs->AddFieldDef();
pNewDef->Name = "encrypted";
pNewDef->DataType = ftBoolean;


//__________create table
tbl->IndexDefs->Clear();
tbl->CreateTable();
tbl->Exclusive=true;
tbl->Active=true;
//
remoteAdmin->Active=true;
remoteLogCount=remoteAdmin->GetRemoteLogCount();
for(idx=1; idx<=remoteLogCount; idx++)
{
logRec=remoteAdmin->GetRemoteLogRecord(idx);
tbl->Append();

tbl->FieldByName("time")->AsDateTime=logRec.DateTime;

s=logRec.ClientUser;
tbl->FieldByName("user")->AsAnsiString=s;

s=logRec.ClientAddress;
tbl->FieldByName("address")->AsAnsiString=s;

tbl->FieldByName("session")->AsInteger=logRec.ClientSession;

tbl->FieldByName("thread")->AsInteger=logRec.ClientThread;

s=nameLogCategory(logRec.Category);
tbl->FieldByName("category")->AsAnsiString=s;

s=nameLogEvent(logRec.EventType);
tbl->FieldByName("event")->AsAnsiString=s;

s=logRec.Text;
tbl->FieldByName("text")->AsAnsiString=s;

s=logRec.ClientRequestName;
tbl->FieldByName("request")->AsAnsiString=s;

tbl->FieldByName("ServerVersion")->AsFloat=logRec.ServerVersion;

tbl->FieldByName("ClientVersion")->AsFloat=logRec.ClientVersion;

tbl->FieldByName("encrypted")->AsBoolean=logRec.ClientEncrypted;

tbl->Post();
}
tbl->Active=false;
remoteAdmin->Active=false;
delete tbl;
setStatusBar("Done.");
}

All the best,
Jim Shedden
Fri, May 19 2017 2:05 PMPermanent Link

Tim Young [Elevate Software]

Elevate Software, Inc.

Avatar

Email timyoung@elevatesoft.com

James,

<< I needed to be able to query server log files, so I wrote a bit of code and thought it might help someone else. Its not complete, just to get you started. Sorry, I'm a C++ guy....

In reading the forums, I noticed someone asking for something like this, but I couldn't find the thread again to attach this to. As always, use at your own peril! It's nice to be able to transfer the table information to Excel and discuss it with a client. Debugging is hard enough from the server side. >>

Nice, thanks for the code. Smile

Tim Young
Elevate Software
www.elevatesoft.com
Image