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
- thename
attribute is required so the appender can be referenced later in the file.class
- theclass
attribute is the fully qualified type name of the appender class. The class must implement theILogEventListener
interface.pattern
- thepattern
attribute (not shown) defines a pattern that can be used to define the output pattern for messages. See below for more details.arg
- thearg
element is used to pass arguments to the constructor of the appender. Multiple childarg
elements 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, theFileLogEventListener
will 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-ref
child elements specify the name of the appenders that are to be used to log events. The appenders need to be created inappender
elements 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
- thename
attribute is required to specify the category that is to be configured.level
- thelevel
attribute allows overriding theroot
logging level.additivity
- theadditivity
attribute is a boolean value to control if previously declared appenders are also used for this category. The default value istrue
.appender-ref
- theappender-ref
child 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 inappender
elements 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.DebugOutputLogEventListener
outputs log events to an attached debugger, using theOutputDebugString
method.It can accept a single string argument that defines a prefix to be output before each event.
JetBrains.Util.Logging.FileLogEventListener
outputs 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.MessageBoxListener
will 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.
LogEventListener
is 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.TextWriterLogEventListener
is also intended to be used by code, writing events to a givenTextWriter
.ConsoleToolLogger
,MsBuildToolLogger
andTeamCityToolLogger
are 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.V
forVERBOSE
.%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.D
asC.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).