Tracing and logging

Use tracing to troubleshoot a plug-in or custom workflow activity (custom code). Tracing assists developers by recording run-time information as an aid in diagnosing the cause of code failures. Tracing is supported for synchronous or asynchronous execution.

Recording of run-time tracing information for Microsoft Dataverse is provided by a service named ITracingService. Information provided to this service by custom code can be recorded in three different places as identified here.

  • Trace log

    Trace log records are written to the PluginTraceLog Table. Writing of these records is controlled by the trace settings mentioned in Enable trace logging.

    This data can be found in model-driven applications by navigating to Settings and choosing the Plug-in Trace Log tile. The tile is only visible if you have access to the trace log table records in your assigned security role.

    You may find it easier to view this data by using the Web API in your browser using the example shown in Use Tracing or by using the Plug-in trace viewer community tool.

    Important

    Trace logging takes up organization storage space especially when many traces and exceptions are generated. You should only turn trace logging on for debugging and troubleshooting, and turn it off after your investigation is completed.

  • Error dialog

    A synchronous registered plug-in or custom workflow activity that returns an exception from the platform results in an error dialog box in the web application presented to the logged on user. The user may select the Download Log File button in the dialog to view the log containing exception and trace output.

  • System job

    For asynchronous registered plug-in or custom workflow activities that returns an exception, the tracing information is shown in the Details area of the System Job form in the web application.

Enable trace logging

Whether trace logs will be written depends on the value of the Organization table PluginTraceLogSetting column value. You can enable trace logging by programmatically updating the PluginTraceLogSetting value.

A second method to enable trace logging is through the legacy web application. Navigate to Settings > Administration > System Settings. In the Customization tab, locate the drop-down menu labeled Enable logging to plug-in trace log and select one of the available options.

A third option can be found in the Plug-in Registration tool. After connecting the tool to your organization (environment), select Settings > Logging to Plug-in Trace Log and then select one of the available options.

Value Option Description
0 Off Writing to the trace log is disabled. No PluginTraceLog records will be created. However, custom code can still call the Trace(String, Object[]) method even though no log is written.
1 Exceptions Trace information is written to the log if an exception is passed back to the platform from custom code.
2 All Trace information is written to the log upon code completion or an exception is passed back to the platform from the custom code.

If the trace logging setting is set to Exception and your custom code returns an exception back to the platform, a trace log record is created and tracing information is also written to one other location. For custom code that executes synchronously, the information is presented to the user in an error dialog box, otherwise, for asynchronous code, the information is written to the related system job.

Write to the tracing service

Before writing to the tracing service, you must first extract the tracing service object from the passed execution context. Afterwards, simply add Trace(String, Object[]) calls to your custom code where appropriate passing any relevant diagnostic information in that method call.

//Extract the tracing service for use in debugging plug-ins.
ITracingService tracingService =
    (ITracingService)serviceProvider.GetService(typeof(ITracingService));

// Use the tracing service 
tracingService.Trace("Write your message here.");

Next, build and deploy the plug-in or custom workflow activity. During execution of the custom code, the information provided in the Trace method calls is written to a trace log table record by ITracingService, if supported by your organization and enabled, and may also be made available to the user in a Web dialog or system job as described in the previous section. Tracing information written to the trace log is configured in the trace settings. For more information see Enable trace logging.

Note

If your custom code executes within a database transaction, and an exception occurs that causes a transaction rollback, all table data changes by your code will be undone. However, the PluginTraceLog records will remain after the rollback completes.

Additional information about the tracing service

The ITracingService batches the information provided to it through the Trace method. The information is written to a new PluginTraceLog record after the custom code successfully runs to completion or an exception is thrown.

Each Trace call is logged as a new line in the PluginTraceLog MessageBlock column. Only 10kb of text can be written. Older trace lines will be removed to meet this limit so that only the most recent lines will be saved.

PluginTraceLog records have a finite lifetime. A bulk deletion background job runs once per day to delete records that are older than 24 hours from creation.

Caution

While this job can be disabled or the frequency in which it occurs can be adjusted, failure to set it back to the original setting is frequently discovered to be the cause of performance issues later on.

Community tools

Plug-in trace viewer

Plug-in Trace Viewer is a tool that XrmToolbox community developed. Please see the Community tools for Dataverse topic for community developed tools.

Note

The community tools are not a product of Microsoft and does not extend support to the community tools. If you have questions pertaining to the tool, please contact the publisher. More Information: XrmToolBox.

See also

Plug-ins
Debug a plug-in
View trace logs
Tracing service
PluginTraceLog Table