/// <summary> /// Logging a KeyValue pair - as you see fit. The logger will log some, that are generally useful - like OS /// Machine, CurrentDirectory etc.. /// </summary> /// <param name="key"> /// The <c>key</c> part of the pair. /// </param> /// <param name="value"> /// The <c>value</c> part of the pair. /// </param> /// <param name="message"> /// Further information related to the KeyValue pair - if any. /// </param> /// <param name="args"> /// The args. /// </param> /// <returns> /// The <see cref="int"/>. /// </returns> public int LogKeyValue(string key, string value, string message, params object[] args) { message = message.StfFormatString(args); var htmlLine = "<div class=\"line keyvalue\">\n"; htmlLine += $" <div class=\"el key\">{key}</div>\n"; htmlLine += $" <div class=\"el value\">{value}</div>\n"; htmlLine += $" <div class=\"el msg\">{message}</div>\n"; htmlLine += "</div>\n"; LogFileHandle.Write(htmlLine); return(htmlLine.Length); }
/// <summary> /// End html log file. /// </summary> /// <returns> /// The <see cref="bool"/>. /// </returns> private bool EndHtmlLogFile() { LogTestDuration(); LogKeyValue("Passed", NumberOfLoglevelMessages[StfLogLevel.Pass].ToString(), "Passed Tests"); LogKeyValue("Failed", NumberOfLoglevelMessages[StfLogLevel.Fail].ToString(), "Failed Tests"); LogKeyValue("Inconclusives", NumberOfLoglevelMessages[StfLogLevel.Inconclusive].ToString(), "Inconclusive Tests"); LogKeyValue("Errors", NumberOfLoglevelMessages[StfLogLevel.Error].ToString(), "Errors logged"); LogKeyValue("Warnings", NumberOfLoglevelMessages[StfLogLevel.Warning].ToString(), "Warnings logged"); var htmlLine = " </div>\n"; htmlLine += " </body>\n"; htmlLine += "</html>\n"; LogFileHandle.Write(htmlLine); return(true); }
/// <summary> /// Open and Start the logger /// </summary> /// <returns> /// The <see cref="bool"/>. /// </returns> /// private private bool BeginHtmlLogFile() { var htmlLine = "<!DOCTYPE html>\n"; htmlLine += "<html>\n"; htmlLine += " <head>\n"; htmlLine += " <meta charset=\"utf-8\" />\n"; htmlLine += $" <title>{Configuration.LogTitle}</title>\n"; htmlLine += " <style type=\"text/css\">\n"; htmlLine += GetStyleSheet(); htmlLine += " </style>\n<script type=\"text/javascript\">"; htmlLine += GetJavaScript(); htmlLine += " </script>\n</head>\n"; htmlLine += GetOpenBody(); LogFileHandle.Write(htmlLine); return(true); }
/// <summary> /// The log one image. /// </summary> /// <param name="level"> /// The level. /// </param> /// <param name="imageFile"> /// The image file. /// </param> /// <param name="message"> /// The message. /// </param> /// <returns> /// The <see cref="int"/>. /// </returns> private int LogOneImage(StfLogLevel level, string imageFile, string message) { if (!AddLoglevelToRunReport[level]) { return(-1); } var messageIdString = GetNextMessageId(); var logLevelString = Enum.GetName(typeof(StfLogLevel), level) ?? "Unknown StfLogLevel"; logLevelString = logLevelString.ToLower(); var html = string.Format("<div onclick=\"sa('{0}')\" id=\"{0}\" class=\"line {1} image\">\n", messageIdString, logLevelString); html += $" <div class=\"el time\">{DateTime.Now:HH:mm:ss}</div>\n"; html += $" <div class=\"el level\">{logLevelString}</div>\n"; html += $" <div class=\"el msg\">{message}</div>\n"; html += $" <p><img onclick=\"showImage(this)\" class=\"embeddedimage\" alt=\"{message}\" src=\"data:image/png;base64, {imageFile}\" /></p>"; html += "</div>\n"; LogFileHandle.Write(html); return(html.Length); }
/// <summary> /// The log one html Message. /// </summary> /// <param name="loglevel"> /// The log level. /// </param> /// <param name="message"> /// The Message. /// </param> /// <param name="args"> /// The args. /// </param> /// <returns> /// The <see cref="int"/>. /// </returns> private int LogOneHtmlMessage(StfLogLevel loglevel, string message, params object[] args) { ResetIdleTimer(); string htmlLine; if (!AddLoglevelToRunReport[loglevel]) { return(-1); } if (messageId == 0) { if (!InitLogfile()) { Console.WriteLine(@"Coulnd't initialise the logfile"); } } if (!LogFileHandle.Initialized) { return(-2); } var messageIdString = GetNextMessageId(); var logLevelString = Enum.GetName(typeof(StfLogLevel), loglevel) ?? "Unknown StfLogLevel"; var convertedToFoldableMessage = false; logLevelString = logLevelString.ToLower(); CheckForPerformanceAlert(); message = message.StfFormatString(args); if (Configuration.MapNewlinesToBr) { var count = message.Count(f => f == '\n'); if (count > 1) { var firstLineIndexOf = message.IndexOf(Environment.NewLine, StringComparison.Ordinal); if (firstLineIndexOf > 0) { var firstLineOfMessage = message.Substring(0, firstLineIndexOf); var firstLoggedLine = $"{Environment.NewLine}{firstLineOfMessage}"; message = GetMultilineMessage(messageIdString, firstLoggedLine, message); convertedToFoldableMessage = true; } } } if (ShouldMessageBeConvertedToClickable(message) && !convertedToFoldableMessage) { // todo: Implement :-) } switch (loglevel) { case StfLogLevel.Header: htmlLine = $"<div class=\"line logheader\">{message}</div>\n"; break; case StfLogLevel.SubHeader: htmlLine = $"<div class=\"line logsubheader\">{message}</div>\n"; break; default: htmlLine = string.Format( "<div onclick=\"sa('{0}')\" id=\"{0}\" class=\"line {1} \">\n", messageIdString, logLevelString); htmlLine += $" <div class=\"el time\">{timeOfLastMessage:HH:mm:ss}</div>\n"; htmlLine += $" <div class=\"el level\">{logLevelString}</div>\n"; htmlLine += $" <div class=\"el pad\">{IndentString()}</div>\n"; htmlLine += $" <div class=\"el msg\">{message}</div>\n"; htmlLine += "</div>\n"; break; } NumberOfLoglevelMessages[loglevel]++; LogFileHandle.Write(htmlLine); return(htmlLine.Length); }