結論としてはエラーログ出力にはToStringを使うべき。
なぜならば、ToStringは再帰的に内部エラーのスタックトレース出力をしてくれるから。
Exception.InnerException プロパティ
https://docs.microsoft.com/ja-jp/dotnet/api/system.exception.innerexception?view=netframework-4.8#System_Exception_InnerException
現在の例外を発生させた内部例外オブジェクト。
具体的には、例外の new Exception(String, Exception) コンストラクターに渡されたExceptionを返す。
内部例外が存在しない場合はnull。
Exception.GetBaseException メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.exception.getbaseexception?view=netframework-4.8#System_Exception_GetBaseException
例外のチェイン(内部例外のチェイン)で、スローされた最初の例外を取得する。
内部例外が存在しない場合は、自身を取得するのでnullになることは無い。
Exception.ToString メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.exception.tostring?view=netframework-4.8#System_Exception_ToString
自身の例外メッセージ、自身のスタックトレース、再帰的に内部例外でToStringを呼び出した結果を取得する。