|
LoggerCLSLets you easily use log files
File Name : LoggerCLS.js Requirement : none Author : Branimir Petrovic Submitted : 03/09/2001 Category : Class To use a class, follow this syntax : var MyObjClass = new MyClass; WScript.Echo(MyObjClass.MyMethod()); // FileName: LoggerCLS(sFQfN, DEBUG, TIME).js
//////////////////////////////////////////////////////////////////////
if (WScript.ScriptName == "LoggerCLS.js") demoLogger();
// ======================== CLASS ====================================
function LoggerCLS(sFQfN, DEBUG, TIME) {
// Author: Branimir Petrovic
// Date: 15 August 2001
//
// Depends on: acces to "flashMessage(sMsg, nTime, sTitl, Type).js" global function
//
// Methods: - getClassName() Returns string "LoggerCLS"
// - setLogName(sName) Will change log file name from current name to "sName"
// (default name is "LoggerCLS(sFQfN, DEBUG, TIME).log")
// - renameUsingTimeStamp() Will add time stamp to existing log file name
// "activity_YYYYMMDD_hhmmss.log
// - Write(sLine, fTimeStamp, nLeftMargine)
// Last two params are optional;
// if fTimeStamp omitted, time stamp will be added to the beginning of line
// if nLeftMargine omitted, left margine starts at 0
// - WriteBlankLines(nNumber) Will write nNumber of blank lines to log
// - ReadAll() Returns string containing the whole log file
//
//
// NOTE: "sFQfN", "DEBUG" and "TIME" are all optional parameters
//
// "sFQfN" is fully qualified name to log file
// "DEBUG" when true will cause debug messages to pop up, so you can see what's cookin'
// "TIME" will determine how many seconds debug messages will be visible
//
// If "sFQfN" is missing - sLogFQfN is set to point to %ScriptPath%\history\%SciptName%.log
// If DEBUG is missing fDebug is set to default value - false
// If TIME is missing, nTime is set to default value of 1 Sec
//
// By intention this class tries to create sLogFldr very early, if it fails to do so
// (and it can fail due to lack of permissions), the whole script is aborted
// on a pretext of no point in running the script when its actions can not be logged.
String.prototype.trim = function () { return this.replace(/(^\s*)|(\s*$)/g, ""); }
// --- Private Data Members ---
var SELF = "LoggerCLS";
var sMsg;
var sTitl;
var oFSO = new ActiveXObject("Scripting.FileSystemObject");
var fDebug = false; // false by default (true will cause debug messages to flash)
var nTime = 1; // 1 Sec by default (debug messages will flash nTime seconds)
var sLogFQfN;
var sScriptPath;
var sLogFldr = "history"; // set this to "" if you do not want to log into subfolder
var sLogName;
// --- Public Methods ---
this.getClassName = function () {return SELF; }
this.setLogName = setLogName;
this.renameUsingTimeStamp = renameUsingTimeStamp;
this.Write = Write;
this.WriteBlankLines = WriteBlankLines;
this.ReadAll = ReadAll;
// --- "LoggerCLS" Constructor ---
if (typeof(DEBUG) != "undefined") fDebug = DEBUG;
if (typeof(TIME) != "undefined") setTimeout(TIME);
if (typeof(sFQfN) == "undefined") {
setDefaults();
} else if (isFQfN(sFQfN)) {
// passed string has proper "Fully Qualified file Name" format
if ( oFSO.DriveExists(oFSO.GetDriveName(sFQfN)) ) {
// make sure that drive name really exists
// (if drive name exists - all other folders in sFQfN can be created)
sLogFQfN = sFQfN;
sScriptPath = oFSO.GetParentFolderName(WScript.ScriptFullName);
sLogName = oFSO.GetFileName(sLogFQfN);
if (createFolder(oFSO.GetParentFolderName(sLogFQfN))) {
if (fDebug) {
flashMessage("\"" + sLogFQfN + "\"", nTime ,
"Consturctor \"LoggerCLS(sFQfN, DEBUG, TIME)\" have set sLogFQfN to:", "I");
}
}
} else {
setDefaults();
}
} else {
setDefaults();
}
return; // >>> --- End of Consturctor --- >>>
// ---------------- Functions Implementing Public Methods -------
function setLogName(sName) {
// Sets (or changes) name of the log file.
if (typeof(sName) == "undefined") return;
sLogName = sName;
var sTmp = oFSO.GetParentFolderName(sLogFQfN);
var sNewLogFQfN = oFSO.BuildPath(sTmp, sName);
if ( (oFSO.FileExists(sLogFQfN))&&(sLogFQfN!=sNewLogFQfN) ) {
// will rename existing log file
try {
oFSO.GetFile(sLogFQfN).Name = sName;
} catch (e) {
// for some reason renaming failed, pause 1 Sec & try again
WScript.Sleep(1000);
try {
flashMessage("Second attempt to rename LOG file to:\n\n" + sName,
60, SELF + "::setLogName()", "E");
oFSO.GetFile(sLogFQfN).Name = sName;
} catch (e) {
// will record error condition to "error.log"
var sParentFQFN = oFSO.GetParentFolderName(sName);
var sErrorFQfN = oFSO.BuildPath(sParentFQFN, "error.log");
var FOR_APPENDING = 8;
var oErrLog = oFSO.OpenTextFile(sErrorFQfN, FOR_APPENDING, true)
var sLine = getNow() + "\tFailed to rename \"" + oFSO.GetFileName(sLogFQfN) +
"\" to \"" + oFSO.GetFileName(sName) + "\" due to:\r\n";
sLine += "\t\t\t\t\"" + e.description + "\"\r\n";
oErrLog.Write(sLine);
oErrLog.Close();
return; // >>>>>
}
}
}
sLogFQfN = sNewLogFQfN;
if (fDebug) {
flashMessage("\"" + sLogFQfN + "\"", nTime, SELF + "::setLogName(\"" + sName + "\")", "I");
}
}
// --------------------------------------------------------------
function renameUsingTimeStamp() {
// adds time stamp to existin log file name
// (Like: "activity_YYYYMMDD_hhmmss.log")
if (!oFSO.FileExists(sLogFQfN)) return; // >>>
var sBaseName = oFSO.GetBaseName(sLogFQfN);
var sExtName = oFSO.GetExtensionName(sLogFQfN);
setLogName(sBaseName + getTimeStamp() + "." + sExtName);
}
// --------------------------------------------------------------
function Write(sLine, fTimeStamp, nLeftMargine) {
// Will append "sLine" to existing (or newely created) log file;
// if sLine == "" or is missing, new empty line is added
//
// nLeftMargine is optional parameter defining where will the left margine start;
// if missing, nLeftMargine == 0
//
// fTimeStamp is optional parameter;
// if missing, timestamp will be added to every new line (except to the empty ones),
// if false, there will be no timestamp
//
if (typeof(sLine)=="undefined") return; // >>>
var sMsg;
var sTitl;
var fTime = (typeof(fTimeStamp) == "undefined") ? true : fTimeStamp
var nLeftM = (typeof(nLeftMargine) == "undefined") ? 0 : nLeftMargine;
if (nLeftM>60) nLeftM = 30; // left margine limited to 30
var sLN = leftJustify("", nLeftM); // pads margine with " "
var TIMESTAMP_LENGTH = 30;
if (fTime) sLN += leftJustify(getNow(), TIMESTAMP_LENGTH);
var nShift = sLN.toString().length;
if (sLine!="") {
var sAry = new Array();
if (sLine.indexOf("\r\n")!=-1) {
// "\r\n" is in the passed line, brake it up to separate lines
sAry = sLine.split("\r\n");
} else if (sLine.indexOf("\n")!=-1) {
// "\n" is in the passed line, brake it up to separate lines
sAry = sLine.split("\n");
}
if (sAry.length>1) {
for (var i=0; i<sAry.length; i++) {
if (i==0) {
// text starts from nShift position, before that there is a time stamp and left margine
sLN += leftJustify(sAry[i], nShift) + "\r\n";
continue;
}
// text is starts from nShift position, up to nShift padded with " "
sLN += leftJustify("", nShift) + leftJustify(sAry[i], nShift) + "\r\n";
}
} else {
sLN += sLine + "\r\n";
}
}
var FOR_APPENDING = 8;
try {
var oTxt = oFSO.OpenTextFile(sLogFQfN, FOR_APPENDING, true)
oTxt.Write(sLN);
oTxt.Close();
oTxt = null;
return; // >>>>>
} catch(e) {
sTitl = "LoggerCLS::Write(sLine, fTimeStamp, nLeftMargine)";
sMsg = "File: \n\n\"" + sLogFQfN +"\"\n\nCould not be written to (see why)!";
flashMessage(sMsg, 0, sTitl, "C");
WScript.Quit(); // >>>>> ABORTING SCRIPT >>>>>
}
function leftJustify(sStr, nCellWidth) {
// Will pad with " " to nCellWidth and left justify passed string
var nDelta = nCellWidth - sStr.toString().length;
if (nDelta>0) sStr = sStr + new Array(nDelta+1).join(" ");
return sStr; // >>>
}
}
// --------------------------------------------------------------
function WriteBlankLines(nNumber) {
var sTitl;
var sMsg;
var FOR_APPENDING = 8;
try {
var oTxt = oFSO.OpenTextFile(sLogFQfN, FOR_APPENDING, true)
if (typeof(nNumber)=="undefined") {
oTxt.WriteBlankLines(1);
oTxt.Close();
} else {
oTxt.WriteBlankLines(nNumber);
oTxt.Close();
}
} catch(e) {
sTitl = "LoggerCLS::WriteBlankLines(" + nNumber + ")";
sMsg = "File: \n\n\"" + sLogFQfN +"\"\n\nCould not be written to (see why)!";
flashMessage(sMsg, 0, sTitl, "C");
WScript.Quit(); // >>>>> ABORTING SCRIPT >>>>>
}
}
// --------------------------------------------------------------
function ReadAll() {
var FOR_READING = 1;
if (!oFSO.FileExists(sLogFQfN)) return ""; // >>>
try {
var oTxt = oFSO.OpenTextFile(sLogFQfN, FOR_READING);
return oTxt.ReadAll(); // >>>
} catch (e) {
sTitl = "LoggerCLS::ReadAll()";
sMsg = "File: \n\n\"" + sLogFQfN +"\"\n\nCould not be read (see why)!";
flashMessage(sMsg, 0, sTitl, "E");
}
return ""; // >>>
} // ----------------------------------------------------------
// ---------------- Helper Functions ----------------------------
function setTimeout(nT) { nTime = (nT>60)? 0: nT; }
// --------------------------------------------------------------
function setDefaults() {
// initializes three private vars to default values
sScriptPath = oFSO.GetParentFolderName(WScript.ScriptFullName);
sLogName = oFSO.GetBaseName(WScript.ScriptFullName) + ".log";
sLogFQfN = oFSO.BuildPath(oFSO.BuildPath(sScriptPath, sLogFldr), sLogName);
if (createFolder(oFSO.GetParentFolderName(sLogFQfN))) {
if (fDebug) {
flashMessage("\"" + sLogFQfN + "\"", nTime ,
"Constructor \"LoggerCLS()\" have set sLogFQfN to:", "I");
}
}
}
// --------------------------------------------------------------
function isFQfN(sFQfN) {
// Will return true if passed string is in fully qualified file name format
// (will NOT try to find out and confirm if file really exists)
//
// Will match ONLY LOCAL PATH: C:\myfile.ext OR
// C:\MyFldr1\ ... \myfile.ext
re = /^[A-Za-z]:\(?:[^\*/\?<>\|]+\)*(?:[^\*/\?<>\|]+\.[^\*/\?<>\|]+)$/;
return (re.test(sFQfN)==true) ? true : false // >>>
}
// --------------------------------------------------------------
function getTimeStamp() {
// returns date as _20010808_174905
var oDate = new Date();
var sNow = "_" + oDate.getFullYear();
sNow += padWithZero(oDate.getMonth()+1);
sNow += padWithZero(oDate.getDate());
sNow += "_" + padWithZero(oDate.getHours());
sNow += padWithZero(oDate.getMinutes());
sNow += padWithZero(oDate.getSeconds());
return sNow;
}
// --------------------------------------------------------------
function getNow() {
// duplicates VBScript's getNow() functionality, returns string
var oDate = new Date();
var sNow = padWithZero(oDate.getDate());
sNow += " " + toNamedMonth(oDate.getMonth()+1);
sNow += " " + oDate.getFullYear() + " ";
sNow += padWithZero(oDate.getHours()) + ":";
sNow += padWithZero(oDate.getMinutes()) + ":";
sNow += padWithZero(oDate.getSeconds());
return sNow; // >>>
}
// --------------------------------------------------------------
function toNamedMonth(iMonth) {
switch (iMonth) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "Jun";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return iMonth;
}
}
// --------------------------------------------------------------
function padWithZero(iNum) {
if (iNum<10) iNum = "0" + iNum;
return iNum;
}
// --------------------------------------------------------------
function createFolder(FQFP) {
// will create FQFP (node by node) if it does not exist,
if (oFSO.FolderExists(FQFP)) return; // >>>
var sAry = FQFP.split("\");
for (var i=0; i<sAry.length; i++) {
if (i==0) { var sPath = sAry[i] + "\"; continue; }
sPath = oFSO.BuildPath(sPath, sAry[i]);
if (!oFSO.FolderExists(sPath)) {
try {
oFSO.CreateFolder(sPath);
} catch(e) {
sTitl = "Could NOT Create Folder";
sMsg = "Failed to create: \t\"" + sSrc + "\"\n\r\n\r";
sMsg += "\tCheck your NTFS permissions! \n\r\n\r\tABORTING SCRIPT";
flashMessage(sMsg, 0, sTitl, "STOP");
WScript.Quit(); // >>>>> ABORTING SCRIPT >>>>>
}
}
}
sTitl = "LoggerCLS's Private Function: createFolder(\"" + FQFP + "\")";;
if (fDebug) flashMessage("Just created: \n\r\n\r" + FQFP, nTime, sTitl, "INFORMATION");
return true;
} // --- end of function createFolder()
} // ======================== END OF CLASS =========================
// ==================================================================
function demoLogger() {
var oLog = new LoggerCLS();
oLog.setLogName("activity.log");
//oLog.WriteBlankLines(1);
oLog.Write("LoggerCLS >>> Just a plain simple demo...\nMore stuff,\nand some more.");
oLog.setLogName("DailyActivity.log"); // log file name can be changed any time
oLog.renameUsingTimeStamp(); // appends timestamp to log file name
WScript.Echo(oLog.ReadAll());
oLog = null;
}
// ================================================================== |
|||||
|
|