Tag: Logs

Log4net: Including stack trace into the logs

The log4net version included in Sitecore doesn’t contains the stack trace. That means that you cannot use %stacktrace or %stacktracedetail in the conversionsPattern.

I have found the way of how to do it. As a workaround, you should override the appender!

First create the following class:

public class SitecoreLogFileWithStackTraceAppender : SitecoreLogFileAppender
{
 protected override void Append(LoggingEvent loggingEvent)
 {
 var msg = loggingEvent.MessageObject as string;
 if (msg != null)
 {
 var prop = loggingEvent.GetType().GetField("m_data", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
 var mData = (LoggingEventData)prop.GetValue(loggingEvent);
 mData.Message = $"{msg}{Environment.NewLine}{Environment.StackTrace}";
 prop.SetValue(loggingEvent, mData);
 }
base.Append(loggingEvent);
 }
}

Second step, register newly created log4net appender:

<appender name="StackFileAppender" type="AndreyVinda.Loggers.SitecoreLogFileWithStackTraceAppender, AndreyVinda.Loggers">
 <file value="$(dataFolder)/logs/log.Stacktraces.{date}.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%5t %d{yyyy-MM-dd HH:mm:ss.fff} %-5p %c - %m%n%n" />
</layout>
</appender>

For one of my projects I have chosen to log all the errors and all the messages that contains [SD] within the stacktrace. The config file is the following:

<appender name="StackFileAppender" type="AndreyVinda.Loggers.SitecoreLogFileWithStackTraceAppender, AndreyVinda.Loggers">
 <file value="$(dataFolder)/logs/log.Stacktraces.{date}.txt" />
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="[SD]"></stringToMatch>
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%5t %d{yyyy-MM-dd HH:mm:ss.fff} %-5p %c - %m%n%n" />
</layout>
</appender>

Enjoy!

Advertisements

Sitecore Adaptive Images – Huge Crawling Logs Problem

Some time ago I have noticed that on our production environment the Crawling Log files were abnormally big – between 500 MB and 1 GB. After some digging was found out that they were just filling up with exceptions while crawling the media library. The exceptions look like this:

WARN Could not compute value for ComputedIndexField: urllink for indexable: sitecore://master/{8EA15044-EE2C-41DB-81D6-0A9C42062814}?lang=en&amp;ver=1
Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Source: Sitecore.Kernel
at Sitecore.Context.PageMode.get_IsNormal()
at adaptiveImages.AdaptiveImagesMediaProvider.GetMediaUrl(MediaItem item)
at Sitecore.ContentSearch.ComputedFields.UrlLink.ComputeFieldValue(IIndexable indexable)
at Sitecore.ContentSearch.LuceneProvider.LuceneDocumentBuilder.AddComputedIndexFields()

Considering the case that there are a tons of media (over 2000 items) and languages (there is a separate exception for each language) we had some pretty serious index time performance issues and hard disk space problems.

Continue reading “Sitecore Adaptive Images – Huge Crawling Logs Problem”