TheApplication().TraceOn("TraceFile_$p_$t.log", "Allocation", "All");results in name like
TraceFile_7382_8188.logSo the trick is to create this file then read the relevant values out of the name. To do so, I create the file with a unique name that will be known to the script creating it:
var unique = TheApplication().LoginName()+"-"+TimeStamp("DateTimeMilli");
TheApplication().TraceOn(path+"Trace-"+unique+"_$p_$t.log", "Allocation", "All");
To get the values I am interested in, I need to output the directory listing of only this known file to a log I can then open and read, then use format of the name of this file to extract the two values I am interested in:
function SetThreadPID() { var pid = TheApplication().GetProfileAttr("XXX OS PID"); var threadId = TheApplication().GetProfileAttr("PPT OS Thread ID"); var line, pidThread, path, command, outs; try { if (threadId == "") { if (TheApplication().GetProfileAttr("IsStandaloneWebClient") == "TRUE") { path = gsLogPath; } else { path = TheApplication().GetProfileAttr("Syspref Error Trace Temp Loc"); } if (path != "" && path.toUpperCase() != "FALSE") { var unique = TheApplication().LoginName()+"-"+TimeStamp("DateTimeMilli"); TheApplication().TraceOn(path+"Trace-"+unique+"_$p_$t.log", "Allocation", "All"); TheApplication().Trace("TEST"); TheApplication().TraceOff(); command = "dir "+path+"Trace-"+unique+"_*.log > "+path+"Trace-"+unique+".log"; outs = Clib.system(command); var fp:File = Clib.fopen(path+"Trace-"+unique+".log","r"); if (fp != null){ while(Clib.feof(fp) == 0){ line = Clib.fgets(fp); if (line.length > 0){ if (line.indexOf(unique)>=0) { pidThread = line.substring(line.indexOf(unique)+unique.length+1, line.length - 5) pid = pidThread.substring(0, pidThread.indexOf("_")); threadId = pidThread.substring(pidThread.indexOf("_")+1); TheApplication().SetProfileAttr("PPT OS PID", pid); TheApplication().SetProfileAttr("PPT OS Thread ID", threadId); Clib.fclose(fp); outs = Clib.remove(path+"Trace-"+unique+"_"+pid+"_"+threadId+".log") outs = Clib.remove(path+"Trace-"+unique+".log") break; } } } } } } } catch(e) { RaiseError(e); } finally { fp = null; } }
Once the PID and Thread are stored in profile attributes they are available to the business layer to for instance set a PID or thread column on a custom error table.
Note that 'Syspref Error Trace Temp Loc' is a custom field added to the 'Personalization Profile' BC which has the calculation:
SystemPreference("PPT Error Trace Temp Loc")This is then set to a directory that the Siebel application server has access to (the Siebel temp directory can generally be used safely).
No comments:
Post a Comment