Advanced Configuration
While logging can be enabled on the command line), specifying a configuration file allows for much more flexibility in what gets logged. The file is an XML file called LogConfiguration.xml, and should be created in %LOCALAPPDATA%\JetBrains\{HostFullIdentifier}\v{WaveVersion}.
When running the ReSharper Platform in an experimental instance of Visual Studio, the logging subsystem will also look for a file called LogConfiguration.Debug.xml, allowing for a separate configuration for debugging extensions in experimental instances. This file is looked for first, and if it doesn't exist, the LogConfiguration.xml file is used instead.
The best way to set up a log file is via the Logging Options Page which is only visible when in Internal Mode.
The file format is fairly straightforward:
The appender element defines an appender/listener, which is the class that will listen for events and output them.
name- thenameattribute is required so the appender can be referenced later in the file.class- theclassattribute is the fully qualified type name of the appender class. The class must implement theILogEventListenerinterface.pattern- thepatternattribute (not shown) defines a pattern that can be used to define the output pattern for messages. See below for more details.arg- theargelement is used to pass arguments to the constructor of the appender. Multiple childargelements are allowed, and are passed as-is, as strings, to the appender. It is up to the appender to interpret the argument value. For example, theFileLogEventListenerwill substitute the current date in the valueC:\logs\resharer-{date}.log.
The root element defines the logging level and appenders that apply for all categories, unless otherwise overridden. It is the default way of setting the logging details for the Platform.
level- this is the logging level, as text. See here for the list of logging levels.appender-ref- theappender-refchild elements specify the name of the appenders that are to be used to log events. The appenders need to be created inappenderelements at the head of the file.
The logger element defines the logging level and appenders to use for a category. When creating a logger, the code can specify a category, usually a namespace. This allows for logging to be configured differently for different parts of the Platform. For example, the JetBrains.Platform.Util category can be set to OFF to disable all logging from components in the JetBrains.Platform.Util namespace, or the JetBrains.DataFlow namespace can be configured to output to a different file, and capture events at a different logging level.
name- thenameattribute is required to specify the category that is to be configured.level- thelevelattribute allows overriding therootlogging level.additivity- theadditivityattribute is a boolean value to control if previously declared appenders are also used for this category. The default value istrue.appender-ref- theappender-refchild elements can be used to specify one or more appenders that will be used to output the log events. More than one element can be specified. All appenders must be specified inappenderelements at the head of the file.
The ReSharper Platform will pick up changes to the file automatically, without requiring a restart.
Built in appenders
The ReSharper Platform ships with a number of appenders:
JetBrains.Util.Logging.DebugOutputLogEventListeneroutputs log events to an attached debugger, using theOutputDebugStringmethod.It can accept a single string argument that defines a prefix to be output before each event.
JetBrains.Util.Logging.FileLogEventListeneroutputs log events to a file.It requires a single string argument specifying the file path. It will process the string and substitute special variables to make the log file unique.
{pid}- process ID{pname}- process name{temp}- full path to the%TEMP%folder.{date}- the current date.
JetBrains.Util.Logging.MessageBoxListenerwill display a message box when an event's message matches a given regular expression.It requires two string arguments. The first is a regular expression that must match an event's message. The second is the text to be shown when the event matches.
LogEventListeneris a listener that will call a givenAction<LogEvent>when an event is logged. It isn't intended to be used from the configuration file, but from code.TextWriterLogEventListeneris also intended to be used by code, writing events to a givenTextWriter.ConsoleToolLogger,MsBuildToolLoggerandTeamCityToolLoggerare all used by command line tools to log events when running in the command line, as MSBuild tasks, or in Team City. They are automatically configured by the console host.
Appender patterns
The pattern attribute of the appender element can be used to format log messages. Control sequences beginning with the percent symbol % can be used to substitute parameters, e.g. %L is substituted with the log level.
%d- date. Accepts option parameter in curly braces. E.g.%d{hh:mm:ss}%m- original message.%M- message, including exception with stack trace if present.%e- short exception.%E- long exception.%n- new line.%l- log level's first character, e.g.VforVERBOSE.%L- log level.%c- category (i.e. namespace). Accepts optional parameter in curly braces to limit length of namespace segments, e.g.%c{2}will output the categoryA.B.C.DasC.D.%t- thread ID.%T- thread name.%p- process ID.%P- process name.
Also, the width of the parameter can be specified between the percent symbol and the control character, e.g. %{min}.{max}c will ensure that the output value has at least {min} characters and at most {max}. If there are fewer characters than {min}, the text is right justified (padded with leading spaces). By specifying a negative number for {min}, the text is left justified (padded with trailing spaces).