Configure xConnect operation logging

Abstract

How to configure xConnect operation logging to track xConnect commands and states of operations.

Extended xConnect logging includes tracking xConnect commands and the states of operations before and after running the command.

Each operation has a unique batch ID. If an operation fails, it logs the predecessor’s and successor’s operations IDs as well. It is disabled by default.

The xConnect operation log output contains log entries for each command run and a BatchId field. You can find logs of related commands using this BatchId.

The log output contains:

  • A batch ID.

  • The operation name.

  • The operation ID in the batch.

  • The status of the operation run.

  • The operation parameters (for example, contact IDs, identifier fields, and facet information).

  • The operation IDs of predecessors or successors.

Enable xConnect operation logging

To enable xConnect operation logging:

  • Enable the file \App_Data\Config\Sitecore\Collection\sc.XConnect.Collection.Web.Logging.xml.disabled by renaming the file to \App_Data\Config\Sitecore\Collection\sc.XConnect.Collection.Web.Logging.xml.

xConnect operation log example

The xConnect operation log output contains log entries for each command run. For example:

2021-05-31 21:26:20.695 +03:00 [Verbose] Operation trace 
{ 
  "BatchId": "e24aa982-875e-4c2e-a2d8-3ef61dba68a9", 
  "Command": "Executed", 
  "Operations": [ 
    { 
      "BatchId": "e24aa982-875e-4c2e-a2d8-3ef61dba68a9", 
      "BatchIndex": 0, 
      "OperationName": "AddContactOperation", 
      "OperationId": 9, 
      "Status": "Succeeded", 
      "OperationType": "Create", 
      "Info": [ 
        { 
          "Name": "Parameters", 
          "Value": [ 
            { 
              "Name": "Contact id", 
              "Value": "edb8f791-b618-0000-0000-062578a79910" 
            }, 
            { 
              "Name": "Identifiers", 
              "Value": [ 
                [ 
                  { 
                    "Name": "Identifier type", 
                    "Value": "Anonymous" 
                  }, 
                  { 
                    "Name": "Source", 
                    "Value": "Tests.contact.source" 
                  }, 
                  { 
                    "Name": "Value", 
                    "Value": ".13.M.MergeOperationShouldFailIfOneOfContactsIsNull7a7bd39e7bb94f09905d3184d3df4d2c" 
                  } 
                ], 
                [ 
                  { 
                    "Name": "Identifier type", 
                    "Value": "Anonymous" 
                  }, 
                  { 
                    "Name": "Source", 
                    "Value": "Alias" 
                  }, 
                  { 
                    "Name": "Value", 
                    "Value": "903aa80a-556f-4b9c-9149-9846dea55718" 
                  } 
                ] 
              ] 
            } 
          ] 
        }, 
        { 
          "Name": "Successors Ids", 
          "Value": "[ 11 ]" 
        } 
      ] 
    }, 
    { 
      "BatchId": "e24aa982-875e-4c2e-a2d8-3ef61dba68a9", 
      "BatchIndex": 2, 
      "OperationName": "SetFacetOperation`1", 
      "OperationId": 11, 
      "Status": "Succeeded", 
      "OperationType": "Update", 
      "Info": [ 
        { 
          "Name": "Parameters", 
          "Value": [ 
            { 
              "Name": "Entity type", 
              "Value": "Contact" 
            }, 
            { 
              "Name": "Entity id", 
              "Value": "edb8f791-b618-0000-0000-062578a79910" 
            }, 
            { 
              "Name": "Facet key", 
              "Value": "Personal" 
            } 
          ] 
        }, 
        { 
          "Name": "Predecessors Ids", 
          "Value": "[ 9 ]" 
        } 
      ] 
    } 
  ] 
} 

Change the log level

If the xConnect operation throws an exception while it runs, it logs one of the following types:

  • Only type (only the type of the exception).

  • Medium (the type of the exception and a message).

  • Full (the full information that the exception instance contains).

By default, the log type level is Medium.

To change the log type level:

  • Open the config file \App_Data\Config\Sitecore\Collection\sc.XConnect.Collection.Web.Logging.xml and modify the value of the Settings/Sitecore/XConnect/Collection/Services/ExceptionLogFormatter/Options/ExceptionLogLevel node.

    <ExceptionLogLevel>Medium</ExceptionLogLevel>

OnlyType level exception example

The following is an example of the log output with a OnlyType log level:

2021-05-31 21:59:14.581 +03:00 [Verbose] Operation trace 
{ 
  "BatchId": "3813c258-ae24-4a61-974f-62daa2f83bee", 
  "Command": "Executed", 
  "Operations": [ 
    { 
      "BatchId": "3813c258-ae24-4a61-974f-62daa2f83bee", 
      "BatchIndex": 0, 
      "OperationName": "AddContactOperation", 
      "OperationId": 1, 
      "Status": "Failed", 
      "OperationType": "Create", 
      "Info": [ 
        { 
          "Name": "Exception", 
          "Value": "ShardManagementException" 
        } 
      ] 
    } 
  ] 
}

Medium level exception example:

The following is an example of the log output with a Medium log level:

2021-05-31 21:52:23.726 +03:00 [Verbose] Operation trace 
{ 
  "BatchId": "a2e0e099-9be3-428b-98c9-a6c45c334859", 
  "Command": "Executed", 
  "Operations": [ 
    { 
      "BatchId": "a2e0e099-9be3-428b-98c9-a6c45c334859", 
      "BatchIndex": 0, 
      "OperationName": "AddContactOperation", 
      "OperationId": 1, 
      "Status": "Failed", 
      "OperationType": "Create", 
      "Info": [ 
        { 
          "Name": "Exception", 
          "Value": { 
            "Name": "ShardManagementException", 
            "Message": "Store Error: Login failed for user 'sa'.. The error occurred while attempting to perform the 
            underlying storage operation during 'Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.StoreException
            : Error occurred while performing store operation. See the inner SqlException for details. ---> System
            .Data.SqlClient.SqlException: Login failed for user 'sa'.\r\n   at System.Data.SqlClient
            .SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, 
            SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean 
            redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, 
            DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, 
            SqlAuthenticationProviderManager sqlAuthProviderManager)\r\n   at System.Data.SqlClient.SqlConnectionFactory
            .CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, 
            DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)\r\n   at System.Data
            .ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, 
            DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)\r\n   at System
            .Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)\r\n   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest
            (DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)\r\n   at 
            System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 
            waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions 
            userOptions, DbConnectionInternal& connection)\r\n   at System.Data.ProviderBase.DbConnectionPool
            .TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, 
            DbConnectionInternal& connection)\r\n   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection
            (DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, 
            DbConnectionInternal oldConnection, DbConnectionInternal& connection)\r\n   at System.Data.ProviderBase
            .DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory 
            connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)\r\n   at System.Data
            .SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)\r\n   at System.Data.SqlClient
            .SqlConnection.TryOpen(TaskCompletionSource`1 retry)\r\n   at System.Data.SqlClient.SqlConnection.Open()\r\n   at Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.SqlUtils.WithSqlExceptionHandling(Action 
            operation)\r\n   --- End of inner exception stack trace ---\r\n   at Microsoft.Azure.SqlDatabase
            .ElasticScale.ShardManagement.SqlUtils.WithSqlExceptionHandling(Action operation)\r\n   at Microsoft.Azure
            .SqlDatabase.ElasticScale.ShardManagement.StoreOperationGlobal.<Do>b__10_0()\r\n   at Microsoft.Azure
            .SqlDatabase.ElasticScale.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)\r\n   at 
            Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.StoreOperationGlobal.Do()' operation on the shard 
            map manager database. See the inner StoreException for details." 
          } 
        } 
      ] 
    } 
  ] 
} 

Full level exception example:

The following is an example of the log output with a Full log level:

2021-05-31 22:02:03.197 +03:00 [Verbose] Operation trace 
{ 
  "BatchId": "febf5249-fbf6-4d52-a9ef-3941cac2c31b", 
  "Command": "Executed", 
  "Operations": [ 
    { 
      "BatchId": "febf5249-fbf6-4d52-a9ef-3941cac2c31b", 
      "BatchIndex": 0, 
      "OperationName": "AddContactOperation", 
      "OperationId": 1, 
      "Status": "Failed", 
      "OperationType": "Create", 
      "Info": [ 
        { 
          "Name": "Exception", 
          "Value": { 
            "ErrorCategory": 0, 
            "ErrorCode": 17, 
            "ClassName": "Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementException", 
            "Message": "Store Error: Login failed for user 'sa'.. The error occurred while attempting to perform the 
            underlying storage operation during 'Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.StoreException
            : Error occurred while performing store operation. See the inner SqlException for details. ---> System
            .Data.SqlClient.SqlException: Login failed for user 'sa'.\r\n   at System.Data.SqlClient
            .SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, 
            SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean 
            redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, 
            DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, 
            SqlAuthenticationProviderManager sqlAuthProviderManager)\r\n   at System.Data.SqlClient.SqlConnectionFactory
            .CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, 
            DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)\r\n   at System.Data
            .ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, 
            DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)\r\n   at System
            .Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)\r\n   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest
            (DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)\r\n   at 
            System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 
            waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions 
            userOptions, DbConnectionInternal& connection)\r\n   at System.Data.ProviderBase.DbConnectionPool
            .TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, 
            DbConnectionInternal& connection)\r\n   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection
            (DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, 
            DbConnectionInternal oldConnection, DbConnectionInternal& connection)\r\n   at System.Data.ProviderBase
            .DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory 
            connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)\r\n   at System.Data
            .SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)\r\n   at System.Data.SqlClient
            .SqlConnection.TryOpen(TaskCompletionSource`1 retry)\r\n   at System.Data.SqlClient.SqlConnection.Open()\r\n   at Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.SqlUtils.WithSqlExceptionHandling(Action 
            operation)\r\n   --- End of inner exception stack trace ---\r\n   at Microsoft.Azure.SqlDatabase
            .ElasticScale.ShardManagement.SqlUtils.WithSqlExceptionHandling(Action operation)\r\n   at Microsoft.Azure
            .SqlDatabase.ElasticScale.ShardManagement.StoreOperationGlobal.<Do>b__10_0()\r\n   at Microsoft.Azure
            .SqlDatabase.ElasticScale.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)\r\n   at 
            Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.StoreOperationGlobal.Do()' operation on the shard 
            map manager database. See the inner StoreException for details.", 
            "Data": null, 
            "InnerException": null, 
            "HelpURL": null, 
            "StackTraceString": "at Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.StoreOperationGlobal.Do
            ()\r\n   at Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardMapManagerFactory
            .GetSqlShardMapManager(String connectionString, SqlCredential secureCredential, ShardMapManagerLoadPolicy 
            loadPolicy, RetryBehavior retryBehavior, EventHandler`1 retryEventHandler, Boolean throwOnFailure)\r\n   at 
            Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardMapManagerFactory.TryGetSqlShardMapManager
            (String connectionString, SqlCredential secureCredential, ShardMapManagerLoadPolicy loadPolicy, 
            RetryBehavior retryBehavior, ShardMapManager& shardMapManager)\r\n   at Sitecore.Xdb.Collection.Data
            .SqlServer.Configuration.ElasticScaleConnectionManager.InitializeShardMapManager()\r\n   at Sitecore.Xdb
            .Collection.Data.SqlServer.Configuration.ElasticScaleConnectionManager.get_ShardMapManager()\r\n   at 
            Sitecore.Xdb.Collection.Data.SqlServer.Configuration.ElasticScaleConnectionManager.GetRangeShardMap(String 
            rangeShardMapName)\r\n   at Sitecore.Xdb.Collection.Data.SqlServer.Configuration
            .ElasticScaleConnectionManager.<>c__DisplayClass33_0.<GetRangeMappings>b__0()\r\n   at System.Lazy`1
            .CreateValue()\r\n   at System.Lazy`1.LazyInitValue()\r\n   at Sitecore.Xdb.Collection.Data.SqlServer
            .Configuration.MemoryCacheManager.AddOrGetExistingFromCache[T](String key, Func`1 valueFactory)\r\n   at 
            Sitecore.Xdb.Collection.Data.SqlServer.Configuration.ElasticScaleConnectionManager.MapRecordsToShards[T]
            (String rangeShardMapName, IReadOnlyCollection`1 records, Func`2 getShardKey)\r\n   at Sitecore.Xdb
            .Collection.Data.SqlServer.Managers.SqlContactRecordsManager.<SaveContactIdentifierIndexRecords>d__29
            .MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System
            .Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at Sitecore.Xdb.Collection.Data.SqlServer
            .Managers.SqlContactRecordsManager.<TrySaveChangesAsync>d__18.MoveNext()\r\n--- End of stack trace 
            from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices
            .ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter
            .HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Sitecore.Xdb.Collection.Data.SqlServer
            .SqlDataProvider.<Save>d__16.MoveNext()\r\n--- End of stack trace from previous location where 
            exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at 
            System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at 
            Sitecore.Xdb.Collection.DataProviderCountersDecorator.<Save>d__24.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices
            .ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter
            .HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Sitecore.Xdb.Collection.Repository.<Save>d__12.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at 
            System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices
            .TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Sitecore.XConnect.Service
            .RepositorySaveOperationInvoker.<Execute>d__10.MoveNext()", 
            "RemoteStackTraceString": null, 
            "RemoteStackIndex": 0, 
            "ExceptionMethod": "8\nDo\nMicrosoft.Azure.SqlDatabase.ElasticScale.Client, Version=2.1.0.0, Culture=neutral, PublicKeyToken=null\nMicrosoft.Azure.SqlDatabase.ElasticScale.ShardManagement.StoreOperationGlobal\nMicrosoft.Azure.SqlDatabase.ElasticScale.ShardManagement.IStoreResults Do()", 
            "HResult": -2146233088, 
            "Source": "Microsoft.Azure.SqlDatabase.ElasticScale.Client", 
            "WatsonBuckets": null 
          } 
        } 
      ] 
    } 
  ] 
}