{"action":"created","comment":{"url":"https://api.github.com/repos/aspnet/Docs/pulls/comments/81436660","pull_request_review_id":2412277,"id":81436660,"diff_hunk":"@@ -126,105 +180,251 @@ Debug          dbug\n Trace          trce\n =============  =============\n \n-Scopes\n-^^^^^^\n+Log event ID\n+------------\n \n-In the course of logging information within your application, you can group a set of logical operations within a *scope*. A scope is an ``IDisposable`` type returned by calling the ``ILogger.BeginScope<TState>`` method, which lasts from the moment it is created until it is disposed. The built-in ``TraceSource`` logger returns a scope instance that is responsible for starting and stopping tracing operations. Any logging state, such as a transaction id, is attached to the scope when it is created.\n+Each time you write a log, you can specify an *event ID*. The following example does this by using a locally-defined ``LoggingEvents`` enum:\n \n-Scopes are not required, and should be used sparingly, if at all. They're best used for operations that have a distinct beginning and end, such as a transaction involving multiple resources.\n+.. literalinclude:: logging/sample/src/TodoApi/Controllers/TodoController.cs\n+  :language: c#\n+  :start-after: snippet_CallLogMethods\n+  :end-before: endregion\n+  :emphasize-lines: 3,7\n \n-Configuring Logging in your Application\n-----------------------------------------\n+.. literalinclude:: logging/sample/src/TodoApi/Core/LoggingEvents.cs\n+  :language: c#\n+  :start-after: snippet_LoggingEvents\n+  :end-before: endregion\n \n-To configure logging in your ASP.NET Core application, you should resolve ``ILoggerFactory`` in the ``Configure`` method of your ``Startup`` class. ASP.NET Core will automatically provide an instance of ``ILoggerFactory`` using :doc:`dependency-injection` when you add a parameter of this type to the ``Configure`` method.\n+An event ID is an integer value that you can use to associate a set of logged events with one another. For instance, you might associate adding an item to a shopping cart as event ID 1000 and completing a purchase as event ID 1001. This allows intelligent filtering and searching of logs that have been written to a storage medium.\n \n-.. literalinclude:: logging/sample/src/TodoApi/Startup.cs\n+You don't have to use an enum for the event ID parameter of the ``Log`` methods; you can use an integer value directly.\n+\n+Depending on the provider and the destination storage medium, the event ID may be stored in a field or included in the text message.  The Debug provider doesn't show event IDs, but the Console provider shows them in brackets after the category:\n+\n+.. code-block:: none\n+\n+  info: TodoApi.Controllers.TodoController[1002]\n+        Getting item invalidid\n+  warn: TodoApi.Controllers.TodoController[4000]\n+        GetById(invalidid) NOT FOUND\n+\n+If you want to see the event ID in logs, but the logging provider you're using doesn't automatically show it, you can include it in the message string.\n+\n+Log message format string\n+-------------------------\n+\n+Each time you write a log, you provide a text message and optionally a set of arguments that provide data to incorporate into the message. The message string can contain \"holes\" into which the argument values are placed, as in the example code that specifies a string with a placeholder for the ID and then provides the ID as an argument.\n+\n+.. literalinclude:: logging/sample/src/TodoApi/Controllers/TodoController.cs\n   :language: c#\n-  :lines: 23-25\n-  :dedent: 4\n-  :emphasize-lines: 25\n+  :start-after: snippet_CallLogMethods\n+  :end-before: endregion\n+  :emphasize-lines: 3,7\n \n-Once you've added ``ILoggerFactory`` as a parameter, you configure loggers within the ``Configure`` method by calling methods (or extension methods) on the logger factory. We have already seen an example of this configuration at the beginning of this article, when we added console logging by calling ``loggerFactory.AddConsole``.\n+The order of placeholders, not their names, determines which parameters are used for them. For example, if you have the following code:\n \n-.. note:: You can optionally configure logging when setting up :doc:`hosting`, rather than in ``Startup``.\n+.. code-block:: c#\n \n-Each logger provides its own set of extension methods to ``ILoggerFactory``. The console, debug, and event log loggers allow you to specify the minimum logging level at which those loggers should write log messages. The console and debug loggers provide extension methods accepting a function to filter log messages according to their logging level and/or category (for example, ``logLevel => logLevel >= LogLevel.Warning`` or ``(category, loglevel) => category.Contains(\"MyController\") && loglevel >= LogLevel.Trace``). The event log logger provides a similar overload that takes an ``EventLogSettings`` instance as argument, which may contain a filtering function in its ``Filter`` property. The TraceSource logger does not provide any of those overloads, since its logging level and other parameters are based on the  ``SourceSwitch`` and ``TraceListener`` it uses.\n+  string p1 = \"parm1\";\n+  string p2 = \"parm2\";\n+  _logger.LogInformation(\"Parameter values: {p2}, {p1}\", p1, p2);\n \n-A LoggerFactory instance can optionally be configured with custom ``FilterLoggerSettings``. The example below configures custom log levels for different scopes, limiting system and Microsoft built-in logging to warnings while allowing the app to log at debug level by default. The ``WithFilter`` method returns a new ``ILoggerFactory`` that will filter the log messages passed to all logger providers registered with it. It does not affect any other ``ILoggerFactory`` instances, including the original ``ILoggerFactory`` instance.\n+The resulting log message would look like this:\n \n-.. literalinclude:: logging/sample/src/TodoApi/Startup.cs\n+.. code-block:: none\n+\n+  Parameter values: parm1, parm2\n+\n+The logging framework does message formatting in this way to make it possible for logging providers to implement `semantic logging, also known as structured logging <http://programmers.stackexchange.com/questions/312197/benefits-of-structured-logging-vs-basic-logging>`__.  Because the arguments themselves are passed to the logging system, not just the formatted message string, logging providers can store the parameter values as fields in addition to the message string. For example, if you are directing your log output to Azure Table Storage, and your logger method call looks like this:\n+\n+.. code-block:: c#\n+\n+  _logger.LogInformation(\"Getting item {ID} at {RequestTime}\", id, DateTime.Now);\n+\n+Each Azure Table entity could have ``ID`` and ``RequestTime`` properties and you could write a query to find all logs within a particular ``RequestTime`` range, without having to parse the time out of the text message.\n+\n+Logging exceptions\n+------------------\n+\n+The logger methods that you call to create a log have overloads that let you pass in an exception, as in the following example:\n+\n+.. literalinclude:: logging/sample/src/TodoApi/Controllers/TodoController.cs\n   :language: c#\n-  :lines: 27-34\n+  :start-after: snippet_LogException\n+  :end-before: snippet_LogException\n+  :emphasize-lines: 3\n   :dedent: 12\n \n-Configuring TraceSource Logging\n-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n+Different providers handle the exception information in different ways. Here's an example of what the Debug provider shows as a result of the code shown above.\n \n-When running on the full .NET Framework you can configuring logging to use the existing `System.Diagnostics.TraceSource <https://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource(v=vs.110).aspx>`_ libraries and providers, including easy access to the Windows event log. ``TraceSource`` allows you to route messages to a variety of listeners and is already in use by many organizations.\n+.. code-block:: none\n \n-First, be sure to add the ``Microsoft.Extensions.Logging.TraceSource`` package to your project (in *project.json*), along with any specific trace source packages you'll be using (in this case, ``TextWriterTraceListener``):\n+  TodoApi.Controllers.TodoController:Warning: GetById(036dd898-fb01-47e8-9a65-f92eb73cf924) NOT FOUND\n \n-.. literalinclude:: logging/sample/src/TodoApi/project.json\n-  :language: javascript\n-  :lines: 8-18\n-  :dedent: 2\n-  :emphasize-lines: 7,10\n+  System.Exception: Item not found exception.\n+   at TodoApi.Controllers.TodoController.GetById(String id) in C:\\logging\\sample\\src\\TodoApi\\Controllers\\TodoController.cs:line 226\n+\n+Log filtering\n+-------------\n+\n+Some logging providers let you specify when logs should be written or ignored based on log level and category.  For example, on the console you might want to see only logs of Warning level and higher, while in the Debug window you want Information level and higher.  Or you might want to see Information and higher for framework-written logs (category begins with \"Microsoft\" or \"System\") and Debug or higher for application logs (category begins with \"TodoAPI\" for this article's sample app).\n \n-The following example demonstrates how to configure a ``TraceSourceLogger`` instance for an application, logging only ``Warning`` or higher priority messages. Each call to ``AddTraceSource`` takes a ``TraceListener``. The call configures a ``TextWriterTraceListener`` to write to the console window. This log output will be in addition to the console logger that was already added to this sample, but its behavior is slightly different.\n+The ``AddConsole`` and ``AddDebug`` extension methods provide overloads that let you pass in a minimum log level, or a function that specifies log levels. The following sample code causes the console to ignore logs below Warning level, while the Debug window ignores logs that the framework creates but includes application-created logs of Trace level and above. \n \n .. literalinclude:: logging/sample/src/TodoApi/Startup.cs\n   :language: c#\n-  :lines: 36-40\n-  :dedent: 12\n+  :start-after: snippet_AddConsoleAndDebugWithFilter\n+  :end-before: endregion\n+  :emphasize-lines: 6-7\n \n-The ``sourceSwitch`` is configured to use ``SourceLevels.Warning``, so only ``Warning`` (or higher) log messages are picked up by the ``TraceListener`` instance.\n+The event log logger provides a similar overload that takes an ``EventLogSettings`` instance as argument, which may contain a filtering function in its ``Filter`` property. The TraceSource logger does not provide any of those overloads, since its logging level and other parameters are based on the  ``SourceSwitch`` and ``TraceListener`` it uses.\n+\n+An ``ILoggerFactory`` instance can optionally be configured with custom ``FilterLoggerSettings``. The example below limits system and Microsoft built-in logging to warnings while allowing the app to log at debug level by default.\n \n-The API action below logs a warning when the specified ``id`` is not found:\n+.. literalinclude:: logging/sample/src/TodoApi/Startup.cs\n+  :language: c#\n+  :start-after: snippet_FactoryFilter\n+  :end-before: endregion\n+  :emphasize-lines: 6-11\n+\n+If you want to use filtering to prevent all logs from being written for a particular category, you can specify ``LogLevel.None`` for that category. The integer value of ``LogLevel.None`` is 6, which is higher than ``LogLevel.Critical`` (5), so if you make this the minimum log level for a category or a provider, no logs will be written.\n+\n+The ``WithFilter`` extension method is provided by the `Microsoft.Extensions.Logging.Filter` NuGet package. The method returns a new ``ILoggerFactory`` instance that will filter the log messages passed to all logger providers registered with it. It does not affect any other ``ILoggerFactory`` instances, including the original ``ILoggerFactory`` instance.\n+\n+To see more detailed logging from the ASP.NET Core framework code, you can adjust the `LogLevel` specified to your logging provider to something more verbose, like `Debug` or `Trace`. For example, if you modify the `AddConsole` call in the `Configure` method to specify a minimum level of `LogLevel.Trace`, the result is much more framework-level detail about each request.  Here's an example:\n+\n+.. code-block:: none\n+\n+  info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]\n+        Request starting HTTP/1.1 GET http://localhost:5000/api/todo/0\n+  dbug: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[4]\n+        The request path /api/todo/0 does not match a supported file type\n+  dbug: Microsoft.AspNetCore.Routing.Tree.TreeRouter[1]\n+        Request successfully matched the route with name 'GetTodo' and template 'api/Todo/{id}'.\n+  dbug: Microsoft.AspNetCore.Mvc.Internal.ActionSelector[2]\n+        Action 'TodoApi.Controllers.TodoController.Update (TodoApi)' with id '6cada879-f7a8-4152-b244-7b41831791cc' did not match the constraint 'Microsoft.AspNetCore.Mvc.Internal.HttpMethodActionConstraint'\n+  dbug: Microsoft.AspNetCore.Mvc.Internal.ActionSelector[2]\n+        Action 'TodoApi.Controllers.TodoController.Delete (TodoApi)' with id '529c0e82-aea6-466c-bbe2-e77ded858853' did not match the constraint 'Microsoft.AspNetCore.Mvc.Internal.HttpMethodActionConstraint'\n+  dbug: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]\n+        Executing action TodoApi.Controllers.TodoController.GetById (TodoApi)\n+  info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]\n+        Executing action method TodoApi.Controllers.TodoController.GetById (TodoApi) with arguments (0) - ModelState is Valid\n+  info: TodoApi.Controllers.TodoController[1002]\n+        Getting item 0\n+  warn: TodoApi.Controllers.TodoController[4000]\n+        GetById(0) NOT FOUND\n+  dbug: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]\n+        Executed action method TodoApi.Controllers.TodoController.GetById (TodoApi), returned result Microsoft.AspNetCore.Mvc.NotFoundResult.\n+  info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]\n+        Executing HttpStatusCodeResult, setting HTTP status code 404\n+  info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]\n+        Executed action TodoApi.Controllers.TodoController.GetById (TodoApi) in 198.8402ms\n+  info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]\n+        Request finished in 550.6837ms 404\n+  dbug: Microsoft.AspNetCore.Server.Kestrel[9]\n+        Connection id \"0HKV8M5ARIH5P\" completed keep alive response.\n+\n+Log scopes\n+----------\n+\n+You can group a set of logical operations within a *scope* in order to attach the same data to each log that is created as part of that set.  For example, you might want every log created as part of processing a transaction to include the transaction ID.\n+\n+Scopes are not required, are not supported by all providers, and should be used sparingly. They're best used for operations that have a distinct beginning and end, such as a transaction involving multiple resources.\n+\n+A scope is an ``IDisposable`` type returned by calling the ``ILogger.BeginScope<TState>`` method, which lasts from the moment it is created until it is disposed. You use a scope by wrapping your logger calls in a ``using`` block, as shown here:\n \n .. literalinclude:: logging/sample/src/TodoApi/Controllers/TodoController.cs\n   :language: c#\n-  :lines: 32-43\n-  :emphasize-lines: 8\n+  :start-after: snippet_Scopes\n+  :end-before: snippet_Scopes\n+  :emphasize-lines: 4-5,13\n   :dedent: 8\n \n-To test out this code, you can trigger logging a warning by running the app from the console and navigating to ``http://localhost:5000/api/Todo/0``. You should see output similar to the following:\n+The Console logging provider supports scopes. To use them, you pass in an ``includeScopes`` parameter to the ``AddConsole`` extension method, as shown here:\n \n-.. image:: logging/_static/trace-source-console-output.png\n+.. literalinclude:: logging/sample/src/TodoApi/Startup.cs\n+  :language: c#\n+  :start-after: snippet_Scopes\n+  :end-before: endregion\n+  :emphasize-lines: 6\n+  :dedent: 8\n+\n+Each log message shown on the console includes the specified additional information:\n+\n+.. code-block:: none\n+\n+  info: TodoApi.Controllers.TodoController[1002]\n+        => RequestId:0HKV9C49II9CK RequestPath:/api/todo/0 => TodoApi.Controllers.TodoController.GetById (TodoApi) => This message is attached to all logs written within the using block\n+        Getting item 0\n+  warn: TodoApi.Controllers.TodoController[4000]\n+        => RequestId:0HKV9C49II9CK RequestPath:/api/todo/0 => TodoApi.Controllers.TodoController.GetById (TodoApi) => This message is attached to all logs written within the using block\n+        GetById(0) NOT FOUND \n \n-The yellow line with the \"warn: \" prefix, along with the following line, is output by the ``ConsoleLogger``. The next line, beginning with \"TodoApi.Controllers.TodoController\", is output from the TraceSource logger. There are many other TraceSource listeners available, and the ``TextWriterTraceListener`` can be configured to use any ``TextWriter`` instance, making this a very flexible option for logging.\n+TraceSource Logging\n+-------------------\n \n-Configuring Other Providers\n-^^^^^^^^^^^^^^^^^^^^^^^^^^^\n+Applications that run on the full .NET Framework can use the `System.Diagnostics.TraceSource <https://msdn.microsoft.com/library/system.diagnostics.tracesource.aspx>`_ libraries and providers. ``TraceSource`` allows you to route messages to a variety of `listeners <https://msdn.microsoft.com/library/4y5y10s7.aspx>`__, including the `EventLogTraceListener <https://msdn.microsoft.com/library/system.diagnostics.eventlogtracelistener.aspx>`__ and the `EventProviderTraceListener <https://msdn.microsoft.com/library/system.diagnostics.eventing.eventprovidertracelistener.aspx>`__ for `ETW tracing <https://msdn.microsoft.com/library/ms751538.aspx>`__.\n \n-In addition to the built-in loggers, you can configure logging to use other providers. Add the appropriate package to your *project.json* file, and then configure it just like any other provider. Typically, these packages include extension methods on ``ILoggerFactory`` to make it easy to add them.\n+To use ``TraceSource``, add the ``Microsoft.Extensions.Logging.TraceSource`` package to your project, along with any specific trace source packages you'll be using, such as ``TextWriterTraceListener`` in the sample application that goes with this article.","path":"aspnet/fundamentals/logging.rst","position":465,"original_position":465,"commit_id":"cc8c398b773e9adf2db0e4e29d92fcd022bcf3ac","original_commit_id":"154b89b6a09bd5f28b5cb283fc36c82aee4ce02d","user":{"login":"Rick-Anderson","id":3605364,"avatar_url":"https://avatars.githubusercontent.com/u/3605364?v=3","gravatar_id":"","url":"https://api.github.com/users/Rick-Anderson","html_url":"https://github.com/Rick-Anderson","followers_url":"https://api.github.com/users/Rick-Anderson/followers","following_url":"https://api.github.com/users/Rick-Anderson/following{/other_user}","gists_url":"https://api.github.com/users/Rick-Anderson/gists{/gist_id}","starred_url":"https://api.github.com/users/Rick-Anderson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Rick-Anderson/subscriptions","organizations_url":"https://api.github.com/users/Rick-Anderson/orgs","repos_url":"https://api.github.com/users/Rick-Anderson/repos","events_url":"https://api.github.com/users/Rick-Anderson/events{/privacy}","received_events_url":"https://api.github.com/users/Rick-Anderson/received_events","type":"User","site_admin":false},"body":" ``TraceSource`` requires the ``Microsoft.Extensions.Logging.TraceSource``. The sample include here also uses ``TextWriterTraceListener``.","created_at":"2016-10-01T00:06:47Z","updated_at":"2016-10-01T00:34:30Z","html_url":"https://github.com/aspnet/Docs/pull/1936#discussion_r81436660","pull_request_url":"https://api.github.com/repos/aspnet/Docs/pulls/1936","_links":{"self":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/comments/81436660"},"html":{"href":"https://github.com/aspnet/Docs/pull/1936#discussion_r81436660"},"pull_request":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/1936"}}},"pull_request":{"url":"https://api.github.com/repos/aspnet/Docs/pulls/1936","id":87568232,"html_url":"https://github.com/aspnet/Docs/pull/1936","diff_url":"https://github.com/aspnet/Docs/pull/1936.diff","patch_url":"https://github.com/aspnet/Docs/pull/1936.patch","issue_url":"https://api.github.com/repos/aspnet/Docs/issues/1936","number":1936,"state":"open","locked":false,"title":"logging rewrite","user":{"login":"tdykstra","id":1569635,"avatar_url":"https://avatars.githubusercontent.com/u/1569635?v=3","gravatar_id":"","url":"https://api.github.com/users/tdykstra","html_url":"https://github.com/tdykstra","followers_url":"https://api.github.com/users/tdykstra/followers","following_url":"https://api.github.com/users/tdykstra/following{/other_user}","gists_url":"https://api.github.com/users/tdykstra/gists{/gist_id}","starred_url":"https://api.github.com/users/tdykstra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdykstra/subscriptions","organizations_url":"https://api.github.com/users/tdykstra/orgs","repos_url":"https://api.github.com/users/tdykstra/repos","events_url":"https://api.github.com/users/tdykstra/events{/privacy}","received_events_url":"https://api.github.com/users/tdykstra/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-09-30T21:21:19Z","updated_at":"2016-10-01T00:34:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5512263a3541a61dbc74a778be15733ab2485962","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/aspnet/Docs/pulls/1936/commits","review_comments_url":"https://api.github.com/repos/aspnet/Docs/pulls/1936/comments","review_comment_url":"https://api.github.com/repos/aspnet/Docs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/aspnet/Docs/issues/1936/comments","statuses_url":"https://api.github.com/repos/aspnet/Docs/statuses/cc8c398b773e9adf2db0e4e29d92fcd022bcf3ac","head":{"label":"aspnet:logging","ref":"logging","sha":"cc8c398b773e9adf2db0e4e29d92fcd022bcf3ac","user":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":28239455,"name":"Docs","full_name":"aspnet/Docs","owner":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Docs","description":"Documentation for ASP.NET Core","fork":false,"url":"https://api.github.com/repos/aspnet/Docs","forks_url":"https://api.github.com/repos/aspnet/Docs/forks","keys_url":"https://api.github.com/repos/aspnet/Docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Docs/teams","hooks_url":"https://api.github.com/repos/aspnet/Docs/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Docs/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Docs/events","assignees_url":"https://api.github.com/repos/aspnet/Docs/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Docs/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Docs/tags","blobs_url":"https://api.github.com/repos/aspnet/Docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Docs/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Docs/languages","stargazers_url":"https://api.github.com/repos/aspnet/Docs/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Docs/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Docs/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Docs/subscription","commits_url":"https://api.github.com/repos/aspnet/Docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Docs/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Docs/merges","archive_url":"https://api.github.com/repos/aspnet/Docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Docs/downloads","issues_url":"https://api.github.com/repos/aspnet/Docs/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Docs/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Docs/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Docs/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Docs/releases{/id}","deployments_url":"https://api.github.com/repos/aspnet/Docs/deployments","created_at":"2014-12-19T17:38:02Z","updated_at":"2016-09-29T13:32:53Z","pushed_at":"2016-09-30T22:38:25Z","git_url":"git://github.com/aspnet/Docs.git","ssh_url":"git@github.com:aspnet/Docs.git","clone_url":"https://github.com/aspnet/Docs.git","svn_url":"https://github.com/aspnet/Docs","homepage":"","size":64309,"stargazers_count":733,"watchers_count":733,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1415,"mirror_url":null,"open_issues_count":188,"forks":1415,"open_issues":188,"watchers":733,"default_branch":"master"}},"base":{"label":"aspnet:master","ref":"master","sha":"093cc68e1b03cf8dd8105ba625543641d85aa2c2","user":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":28239455,"name":"Docs","full_name":"aspnet/Docs","owner":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Docs","description":"Documentation for ASP.NET Core","fork":false,"url":"https://api.github.com/repos/aspnet/Docs","forks_url":"https://api.github.com/repos/aspnet/Docs/forks","keys_url":"https://api.github.com/repos/aspnet/Docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Docs/teams","hooks_url":"https://api.github.com/repos/aspnet/Docs/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Docs/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Docs/events","assignees_url":"https://api.github.com/repos/aspnet/Docs/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Docs/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Docs/tags","blobs_url":"https://api.github.com/repos/aspnet/Docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Docs/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Docs/languages","stargazers_url":"https://api.github.com/repos/aspnet/Docs/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Docs/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Docs/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Docs/subscription","commits_url":"https://api.github.com/repos/aspnet/Docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Docs/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Docs/merges","archive_url":"https://api.github.com/repos/aspnet/Docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Docs/downloads","issues_url":"https://api.github.com/repos/aspnet/Docs/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Docs/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Docs/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Docs/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Docs/releases{/id}","deployments_url":"https://api.github.com/repos/aspnet/Docs/deployments","created_at":"2014-12-19T17:38:02Z","updated_at":"2016-09-29T13:32:53Z","pushed_at":"2016-09-30T22:38:25Z","git_url":"git://github.com/aspnet/Docs.git","ssh_url":"git@github.com:aspnet/Docs.git","clone_url":"https://github.com/aspnet/Docs.git","svn_url":"https://github.com/aspnet/Docs","homepage":"","size":64309,"stargazers_count":733,"watchers_count":733,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1415,"mirror_url":null,"open_issues_count":188,"forks":1415,"open_issues":188,"watchers":733,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/1936"},"html":{"href":"https://github.com/aspnet/Docs/pull/1936"},"issue":{"href":"https://api.github.com/repos/aspnet/Docs/issues/1936"},"comments":{"href":"https://api.github.com/repos/aspnet/Docs/issues/1936/comments"},"review_comments":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/1936/comments"},"review_comment":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/1936/commits"},"statuses":{"href":"https://api.github.com/repos/aspnet/Docs/statuses/cc8c398b773e9adf2db0e4e29d92fcd022bcf3ac"}}}}
{"actor":{"display_login":"Rick-Anderson"}}