Progress 4GL:当多个进程使用相同的时间戳时,如何生成不同的日志文件名?
Progress 4GL: How to generate different log file name when multiple processes using the same Timestamp?
我正在使用此代码生成带有时间戳的日志文件,这样每次当过程被一个进程调用时,它都会生成唯一的日志文件名。但问题是,当两个进程同时调用同一个过程时,日志文件就会被覆盖。我不想要这个。我想知道程序何时被多个进程调用,需要生成不同的日志文件名。
DEFINE VARIABLE TimeStamp AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPath AS CHARACTER NO-UNDO.
ASSIGN
TimeStamp = string(month(today),"99") + string(day(today),"99") +~
string(year(today),"9999") + substring(string(time,"hh:mm:ss"),1,2) +~
substring(string(time,"hh:mm:ss"),4,2) +~
substring(string(time,"hh:mm:ss"),7,2)
cPath = "cim_" + STRING(TimeStamp) + ".log".
PROCEDURE generatecimlogfile:
OUTPUT TO VALUE(cPath).
MESSAGE "Inside a file".
END PROCEDURE.
RUN generatecimlogfile. /*(This procedure called by multiple processes at a time).*/
您可以将时间戳精确到毫秒,而不是精确到秒。 NOW
函数将为您提供精确到毫秒的日期时间。这段代码会return这样一个时间戳:
DEFINE VARIABLE cTimestamp AS CHARACTER NO-UNDO.
RUN createTimestamp (OUTPUT cTimestamp).
MESSAGE cTimestamp VIEW-AS ALERT-BOX INFORMATION.
PROCEDURE createTimestamp :
DEFINE OUTPUT PARAMETER pcTimeStr AS CHARACTER NO-UNDO.
DEFINE VARIABLE cNow AS CHARACTER NO-UNDO.
DEFINE VARIABLE dtDate AS DATE NO-UNDO.
DEFINE VARIABLE cDate AS CHARACTER NO-UNDO.
DEFINE VARIABLE cTime AS CHARACTER NO-UNDO.
cNow = STRING(NOW, "99/99/9999 HH:MM:SS.SSS").
cDate = ENTRY(1, cNow, " ").
ASSIGN dtDate = DATE(cDate) NO-ERROR.
cTime = ENTRY(2, cNow, " ").
cTime = REPLACE(cTime, ":", "").
cTime = REPLACE(cTime, ".", "").
cTime = REPLACE(cTime, ",", "").
ASSIGN pcTimeStr = STRING(YEAR(dtDate), "9999") + STRING(MONTH(dtDate), "99") + STRING(DAY(dtDate), "99") + cTime NO-ERROR.
IF pcTimeStr = ? THEN pcTimeStr = "00000000000000000".
END PROCEDURE.
如果这还不够好,您可以通过向时间戳添加 GUID 来保证文件名的唯一性:
DEFINE VARIABLE cTimestamp AS CHARACTER NO-UNDO.
DEFINE VARIABLE cGUID AS CHARACTER NO-UNDO.
cGUID = GUID(GENERATE-UUID).
cTimestamp = "20200802123456789" + cGUID.
MESSAGE cTimestamp VIEW-AS ALERT-BOX INFORMATION.
我正在使用此代码生成带有时间戳的日志文件,这样每次当过程被一个进程调用时,它都会生成唯一的日志文件名。但问题是,当两个进程同时调用同一个过程时,日志文件就会被覆盖。我不想要这个。我想知道程序何时被多个进程调用,需要生成不同的日志文件名。
DEFINE VARIABLE TimeStamp AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPath AS CHARACTER NO-UNDO.
ASSIGN
TimeStamp = string(month(today),"99") + string(day(today),"99") +~
string(year(today),"9999") + substring(string(time,"hh:mm:ss"),1,2) +~
substring(string(time,"hh:mm:ss"),4,2) +~
substring(string(time,"hh:mm:ss"),7,2)
cPath = "cim_" + STRING(TimeStamp) + ".log".
PROCEDURE generatecimlogfile:
OUTPUT TO VALUE(cPath).
MESSAGE "Inside a file".
END PROCEDURE.
RUN generatecimlogfile. /*(This procedure called by multiple processes at a time).*/
您可以将时间戳精确到毫秒,而不是精确到秒。 NOW
函数将为您提供精确到毫秒的日期时间。这段代码会return这样一个时间戳:
DEFINE VARIABLE cTimestamp AS CHARACTER NO-UNDO.
RUN createTimestamp (OUTPUT cTimestamp).
MESSAGE cTimestamp VIEW-AS ALERT-BOX INFORMATION.
PROCEDURE createTimestamp :
DEFINE OUTPUT PARAMETER pcTimeStr AS CHARACTER NO-UNDO.
DEFINE VARIABLE cNow AS CHARACTER NO-UNDO.
DEFINE VARIABLE dtDate AS DATE NO-UNDO.
DEFINE VARIABLE cDate AS CHARACTER NO-UNDO.
DEFINE VARIABLE cTime AS CHARACTER NO-UNDO.
cNow = STRING(NOW, "99/99/9999 HH:MM:SS.SSS").
cDate = ENTRY(1, cNow, " ").
ASSIGN dtDate = DATE(cDate) NO-ERROR.
cTime = ENTRY(2, cNow, " ").
cTime = REPLACE(cTime, ":", "").
cTime = REPLACE(cTime, ".", "").
cTime = REPLACE(cTime, ",", "").
ASSIGN pcTimeStr = STRING(YEAR(dtDate), "9999") + STRING(MONTH(dtDate), "99") + STRING(DAY(dtDate), "99") + cTime NO-ERROR.
IF pcTimeStr = ? THEN pcTimeStr = "00000000000000000".
END PROCEDURE.
如果这还不够好,您可以通过向时间戳添加 GUID 来保证文件名的唯一性:
DEFINE VARIABLE cTimestamp AS CHARACTER NO-UNDO.
DEFINE VARIABLE cGUID AS CHARACTER NO-UNDO.
cGUID = GUID(GENERATE-UUID).
cTimestamp = "20200802123456789" + cGUID.
MESSAGE cTimestamp VIEW-AS ALERT-BOX INFORMATION.