📄 fmtlog.cpp
字号:
cout << "Usage: FmtLog FORMAT LOGFILE <Log File> NEWFILE <New File>" << endl << " [LEVELBITSTRING] [FIELDSEP <Field Separator>]" << endl;}void writeLogRecordToString(STAFString &output, const LogRecord &logRecord, const STAFString &sep, const STAFString &endOfLine, bool levelAsBits){ unsigned int year = logRecord.date / 10000; unsigned int month = (logRecord.date % 10000) / 100; unsigned int day = logRecord.date % 100; unsigned int hour = logRecord.secondsPastMidnight / 3600; unsigned int minute = (logRecord.secondsPastMidnight % 3600) / 60; unsigned int second = logRecord.secondsPastMidnight % 60; STAFTimestamp theTimestamp(year, month, day, hour, minute, second); output += theTimestamp.asString(); output += sep; output += logRecord.machine; output += sep; output += STAFString(logRecord.handle); output += sep; output += logRecord.handleName; output += sep; output += logRecord.user; output += sep; output += logRecord.endpoint; output += sep; output += convertLogLevelToString(logRecord.logLevel, levelAsBits); output += sep; output += logRecord.message; output += endOfLine;}unsigned int readLogRecordFromFile(istream &logfile, LogRecord &logRecord){ unsigned int totalLength = 0; readUIntFromFile(logfile, logRecord.recordFormatID, 1); if (logfile.eof()) return kReadLogEndOfFile; if (logRecord.recordFormatID == sCurrRecordFormatID) { // This format added endpoint to the log record readUIntFromFile(logfile, logRecord.date); readUIntFromFile(logfile, logRecord.secondsPastMidnight, 3); readUIntFromFile(logfile, logRecord.logLevel); readUIntFromFile(logfile, logRecord.handle); readStringFromFile(logfile, logRecord.machine); readStringFromFile(logfile, logRecord.handleName); readStringFromFile(logfile, logRecord.user); readStringFromFile(logfile, logRecord.endpoint); readStringFromFile(logfile, logRecord.message); } else if (logRecord.recordFormatID == 3) { // This format added user to the log record for Feature #627135 readUIntFromFile(logfile, logRecord.date); readUIntFromFile(logfile, logRecord.secondsPastMidnight, 3); readUIntFromFile(logfile, logRecord.logLevel); readUIntFromFile(logfile, logRecord.handle); readStringFromFile(logfile, logRecord.machine); readStringFromFile(logfile, logRecord.handleName); readStringFromFile(logfile, logRecord.user); readStringFromFile(logfile, logRecord.message); logRecord.endpoint = "tcp://" + logRecord.machine; } else if (logRecord.recordFormatID == 2) { readUIntFromFile(logfile, logRecord.date); readUIntFromFile(logfile, logRecord.secondsPastMidnight, 3); readUIntFromFile(logfile, logRecord.logLevel); readUIntFromFile(logfile, logRecord.handle); readStringFromFile(logfile, logRecord.machine); readStringFromFile(logfile, logRecord.handleName); readStringFromFile(logfile, logRecord.message); logRecord.user = sUnauthenticatedUser; logRecord.endpoint = "tcp" + sSpecSeparator + logRecord.machine; } else if (logRecord.recordFormatID == 1) { // This is the format used by the last couple of implementations // of the Log service written in Rexx readUIntFromFile(logfile, logRecord.date); readUIntFromFile(logfile, logRecord.secondsPastMidnight, 3); readUIntFromFile(logfile, logRecord.logLevel); readUIntFromFile(logfile, totalLength); // Get a buffer and read the rest of the data STAFRefPtr<char> data = STAFRefPtr<char>(new char[totalLength], STAFRefPtr<char>::INIT); logfile.read(data, totalLength); STAFString dataString(data, totalLength, STAFString::kCurrent); // Find the separation points for the other fields unsigned int sepLoc1 = dataString.find(sOldSep); unsigned int sepLoc2 = dataString.find(sOldSep, sepLoc1 + 1); unsigned int sepLoc3 = dataString.find(sOldSep, sepLoc2 + 1); logRecord.machine = dataString.subString(0, sepLoc1); logRecord.handle = dataString.subString(sepLoc1 + 1, sepLoc2 - sepLoc1 - 1).asUInt(); logRecord.handleName = dataString.subString(sepLoc2 + 1, sepLoc3 - sepLoc2 - 1); logRecord.message = dataString.subString(sepLoc3 + 1); logRecord.user = sUnauthenticatedUser; logRecord.endpoint = "tcp" + sSpecSeparator + logRecord.machine; } else if (logRecord.recordFormatID == 0) { // This is the format used by the first few implementations of the // log service written in Rexx readUIntFromFile(logfile, totalLength); readUIntFromFile(logfile, logRecord.date); readUIntFromFile(logfile, logRecord.secondsPastMidnight, 3); // Remove date and time length from totalLength totalLength -= 7; // Get a buffer and read the rest of the data STAFRefPtr<char> data = STAFRefPtr<char>(new char[totalLength], STAFRefPtr<char>::INIT); logfile.read(data, totalLength); STAFString dataString(data, totalLength, STAFString::kCurrent); // Find the separation points for the other fields unsigned int sepLoc1 = dataString.find(sOldSep); unsigned int sepLoc2 = dataString.find(sOldSep, sepLoc1 + 1); unsigned int sepLoc3 = dataString.find(sOldSep, sepLoc2 + 1); logRecord.machine = dataString.subString(0, sepLoc1); logRecord.handle = dataString.subString(sepLoc1 + 1, sepLoc2 - sepLoc1 - 1).asUInt(); logRecord.handleName = dataString.subString(sepLoc2 + 1, sepLoc3 - sepLoc2 - 1); logRecord.message = dataString.subString(sepLoc3 + 5); logRecord.logLevel = *(reinterpret_cast<unsigned int *>( const_cast<char *>(dataString.buffer() + sepLoc3 + 1))); // Fixup log level from Rexx's big-endian to native format logRecord.logLevel = STAFUtilConvertLEUIntToNative(STAFUtilSwapUInt(logRecord.logLevel)); logRecord.user = sUnauthenticatedUser; logRecord.endpoint = "tcp" + sSpecSeparator + logRecord.machine; } else { return kReadLogInvalidFormat; } return kReadLogOk;}void readUIntFromFile(istream &input, unsigned int &data, unsigned int length){ union { char bytes[4]; unsigned int uint; }; uint = 0; input.read(&bytes[4 - length], length); data = STAFUtilConvertLEUIntToNative(STAFUtilSwapUInt(uint));}void readStringFromFile(istream &input, STAFString &inString){ // First read in the UTF-8 data unsigned int stringLength = 0; readUIntFromFile(input, stringLength); char *inputData = new char[stringLength]; input.read(inputData, stringLength); try { inString = STAFString(inputData, stringLength, STAFString::kUTF8); } catch(...) { delete [] inputData; throw; } delete [] inputData;}STAFString &convertLogLevelToString(unsigned int logLevel, bool levelAsBits){ if (logLevel == 0x00000001) return levelAsBits ? sFATALBits : sFATALPretty; else if (logLevel == 0x00000002) return levelAsBits ? sERRORBits : sERRORPretty; else if (logLevel == 0x00000004) return levelAsBits ? sWARNINGBits : sWARNINGPretty; else if (logLevel == 0x00000008) return levelAsBits ? sINFOBits : sINFOPretty; else if (logLevel == 0x00000010) return levelAsBits ? sTRACEBits : sTRACEPretty; else if (logLevel == 0x00000020) return levelAsBits ? sTRACE2Bits : sTRACE2Pretty; else if (logLevel == 0x00000040) return levelAsBits ? sTRACE3Bits : sTRACE3Pretty; else if (logLevel == 0x00000080) return levelAsBits ? sDEBUGBits : sDEBUGPretty; else if (logLevel == 0x00000100) return levelAsBits ? sDEBUG2Bits : sDEBUG2Pretty; else if (logLevel == 0x00000200) return levelAsBits ? sDEBUG3Bits : sDEBUG3Pretty; else if (logLevel == 0x00000400) return levelAsBits ? sSTARTBits : sSTARTPretty; else if (logLevel == 0x00000800) return levelAsBits ? sSTOPBits : sSTOPPretty; else if (logLevel == 0x00001000) return levelAsBits ? sPASSBits : sPASSPretty; else if (logLevel == 0x00002000) return levelAsBits ? sFAILBits : sFAILPretty; else if (logLevel == 0x00004000) return levelAsBits ? sSTATUSBits : sSTATUSPretty; else if (logLevel == 0x01000000) return levelAsBits ? sUSER1Bits : sUSER1Pretty; else if (logLevel == 0x02000000) return levelAsBits ? sUSER2Bits : sUSER2Pretty; else if (logLevel == 0x04000000) return levelAsBits ? sUSER3Bits : sUSER3Pretty; else if (logLevel == 0x08000000) return levelAsBits ? sUSER4Bits : sUSER4Pretty; else if (logLevel == 0x10000000) return levelAsBits ? sUSER5Bits : sUSER5Pretty; else if (logLevel == 0x20000000) return levelAsBits ? sUSER6Bits : sUSER6Pretty; else if (logLevel == 0x40000000) return levelAsBits ? sUSER7Bits : sUSER7Pretty; else if (logLevel == 0x80000000) return levelAsBits ? sUSER8Bits : sUSER8Pretty; else return levelAsBits ? sUNKNOWNBits : sUNKNOWNPretty;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -