{"id":531,"date":"2015-06-29T08:51:00","date_gmt":"2015-06-29T08:51:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/premier_developer\/2015\/06\/29\/web-app-performance-are-you-listening-to-your-logs\/"},"modified":"2019-03-07T13:36:27","modified_gmt":"2019-03-07T20:36:27","slug":"web-app-performance-are-you-listening-to-your-logs","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/premier-developer\/web-app-performance-are-you-listening-to-your-logs\/","title":{"rendered":"Web App Performance : Are you listening to your logs?"},"content":{"rendered":"<p>In this post, <strong>Principal Application Developer Manager, Reed Robison <\/strong>explains how a periodic review of IIS Log data, often ignored and archived, provides valuable insight into the operational health and performance of web applications.<\/p>\n<hr style=\"width: 100%;\" width=\"100%\" \/>\n<p>&nbsp;<\/p>\n<p>We recently posted about how a focus on <a href=\"http:\/\/blogs.msdn.com\/b\/premier_developer\/archive\/2015\/03\/25\/devops-bridging-the-gap-between-development-and-deployment.aspx\">DevOps<\/a> is changing the way IT Operations and Developers work together to deliver higher quality solutions. IT\/Dev collaboration takes practice and finding ways to effectively work together might be a little different in every organization. Examples are always helpful, so let\u2019s talk about web application performance.<\/p>\n<h3>Performance Lifecycle<\/h3>\n<p>It is pretty common for teams to do performance testing before releasing an application. While testing, developers intensely analyze and optimize code. After applications are released into production, they rarely receive the same level of operational scrutiny. The focus tends to shift toward basic monitoring of a few high level metrics like CPU, memory, or response time. While this may be sufficient for daily monitoring, it can mask details and trends that <em>are<\/em> captured in logs and creep in over the lifecycle of an application. If testing is not a part of every release cycle, it\u2019s not uncommon to for new bottlenecks to manifest through code updates, changes in usage patterns, or a steady increase in load as business grows. These little problems may go unnoticed until they become big problems.\u00a0 A good way to regularly and comprehensively assess operational environments is through <a href=\"https:\/\/services.premier.microsoft.com\/assess?Culture=en-US&amp;CultureAutoDetect=true\">RAP as a Service<\/a>, however, you have data available right now that provides operational insight into the health of your web apps.\u00a0 Almost every organization records and archives web logs.\u00a0 In this post, we\u2019ll look at some tips to use IIS Logs to quickly produce operational insights about the performance of your application.<\/p>\n<h3>Using data you already have<\/h3>\n<p><img decoding=\"async\" class=\"size-full wp-image-35971 alignleft\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2015\/06\/log1.png\" alt=\"\" width=\"244\" height=\"164\" \/>In Premier Support, customers routinely engage us with performance and stability problems of web applications. While <a href=\"http:\/\/blogs.msdn.com\/b\/premier_developer\/archive\/2015\/01\/22\/premier-itsm-testing-services-features-and-benefits-part-1.aspx\">Testing Services<\/a> engagements can comprehensively help customers plan for and avoid capacity issues, not every application gets this level of attention. Similarly, there are many powerful diagnostics and monitoring tools that can help isolate problems after integrated into a solution, but they can require significant code and architectural changes. Sometimes, we have to work with whatever data we can get out of a live production system, and very often that means IIS Logs. Most operational teams can provide a history of IIS logs for any web application. It turns out that IIS Logs are generally full of valuable trend data that developers can use to isolate performance problems in their code.\u00a0 They also provide a historical record of valuable data to analyze trends over a period of days or months.<\/p>\n<p>In order to size up the health of a web application very quickly and with limited data, consider three things:<\/p>\n<ul>\n<li>Are the top requests completing quickly?<\/li>\n<li>How much load is the system handling on a given day?<\/li>\n<li>Are there any errors being thrown?<\/li>\n<\/ul>\n<p>IIS Logs record data that answers all these questions.\u00a0 Let\u2019s take a look at some of the data that IIS logs provide and examine how it is not only useful for isolating performance problems, be a great way to gain insight into the operational health of your web applications.<\/p>\n<h3><\/h3>\n<h3>IIS Log Parser \u2013 Fast and simple<\/h3>\n<p>A simple tool to that can quickly analyze log data and answer these questions is <a href=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=24659\">IIS Log Parser<\/a>. It has been around for years, you can download it for free, and it includes sample queries that quickly parse and present this data in a variety of formats. This tool is still really useful to quickly analyze activity for any app or service that records data into IIS log files. It\u2019s worth noting that there are many community tools\/<a href=\"http:\/\/blogs.iis.net\/carlosag\/analyze-your-iis-log-files-favorite-log-parser-queries\">samples<\/a> that build on Log Parser. I won\u2019t cover all those here, but I encourage you to explore all this tool can do.<\/p>\n<p>In the simplest form, running a command line query against log files in the current directory is as follows:<\/p>\n<p><strong>Logparser.exe file:..\\queries\\top20uris.sql<\/strong><\/p>\n<h3><\/h3>\n<h3>Using Samples and Building Queries<\/h3>\n<p><strong>Request per Hour<\/strong> quickly identifies how busy a system is and when peaks may be occurring.\u00a0 It\u2019s good to keep this number in mind when you are monitoring production load against tested capacity limits and to anticipate future growth. Every application has capacity limits and it is important to understand when these thresholds are being hit. This also tells you how much room you have to grow before adding more hardware or further optimizing the system. (RequestPerHour.sql form the LogParser Samples\\Queries directory)<\/p>\n<p><strong>Top 20 URIs<\/strong> is a health indicator of the top 20 most requested resources.\u00a0 Top requests are very important to overall performance and should be optimally tuned for the best response times possible.\u00a0 Anytime you see a page that is both a top requested page and a slow page, that\u2019s a red flag. (Top20URIs.sql from the LogParser Samples\\Queries directory)<\/p>\n<p><strong>Slow Pages<\/strong> are simply the top 25 slowest requests on average (in milliseconds).\u00a0 Every application will have different response time targets, but anytime the average response time exceeds the patience of a user waiting for data, that\u2019s a problem. Consider how long you will wait on a page before hitting F5 (refresh) or clicking on the same option to try again.\u00a0 Pay special attention to both Average and Max Times.\u00a0 Average Times represent how a page normally behaves.\u00a0 Max Times represent the slowest recorded case.<\/p>\n<p>LogParser does not include a sample of a slow page query, but you can find many examples in the LogParser community and query syntax in the Help file. I use something like this:<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: Times New Roman; font-size: x-small;\"><em>SELECT TOP 25 cs-uri-stem as URL, <\/em><\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: x-small;\"><em>MAX(time-taken) AS Max, <\/em><\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: x-small;\"><em>MIN(time-taken) AS Min, <\/em><\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: x-small;\"><em>Avg(time-taken) AS Average <\/em><\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: x-small;\"><em>FROM u_ex*.log <\/em><\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: x-small;\"><em>GROUP BY URL<\/em><\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: x-small;\"><em>ORDER BY Average DESC<\/em> <\/span><\/p>\n<p>Finally, it is always good to run an <strong>Errors<\/strong> query to identify any errors that are being reporting in the logs. Go through all of these errors and make sure you understand why they are occurring. If you are seeing 500s or applications errors that are the result of code exceptions, you should fix those immediately. (Errors.sql and AspErrors.sql from the LogParser Samples\\Queries directory)<\/p>\n<p>Log Parser can slice through megabytes of log files and can even aggregate multiple log files in a single query of you want to combine results from several servers together.<\/p>\n<h3><\/h3>\n<h3>Interpreting Log Parser Results<\/h3>\n<p>Requests per Hour provide insight into peak load times during a production day and exactly how many requests are being served. For example:<\/p>\n<p>In the query results below, you can see that the site is serving under 5000 requests per hour until about the 13<sup>th<\/sup> hour, then peaks at about 19k requests in hour 15. 19k requests is about 6 req\/s. It\u2019s a good time to think about: What is the tested capacity of this server? Do I need more servers in this farm? Do I need to look at optimizing code? Should I be able to achieve more than 6 req\/s?<\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">Hour\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Total TotBytesSent <\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8211; &#8212;&#8212;&#8212;&#8212;<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 00:00:00 5166 91816872<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 01:00:00 3271 11851947<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 02:00:00 3078 5350705<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 03:00:00 3004 15081820<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 04:00:00 3273 19099935<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 05:00:00 2880 3780950<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 06:00:00 2924 5315683<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 07:00:00 2879 3779657<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 08:00:00 2583 3375392<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 09:00:00 2880 3780215<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 10:00:00 2936 5903824<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 11:00:00 2951 7119071<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 12:00:00 5301 176485655<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 13:00:00 10797 671642461<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 14:00:00 16422 976279264<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\"><strong>2014-12-05 15:00:00 19052 935087820<\/strong><\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">2014-12-05 16:00:00 17926 981329410<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">\u2026<\/span><\/p>\n<p><strong>Top 20 URIs<\/strong> represent the requests that are going to be more important in terms of potential impact to site performance. These are the requests served up more than any other and they should be fast and healthy. If you see slow requests it\u2019s important to dig in to understand WHY.<\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">cs-uri-stem\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Total\u00a0 MaxTime AvgTime AvgBytesSent <\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;\u00a0 &#8212;&#8212; &#8212;&#8212;- &#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 141729 <strong>41965<\/strong>\u00a0\u00a0 <strong>6<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1305<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">\/Common\/Search.aspx\u00a0\u00a0 8224\u00a0\u00a0 305233\u00a0 7993\u00a0\u00a0\u00a0 <strong>140597<\/strong><\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">\/ScriptResource.axd\u00a0\u00a0 6729\u00a0\u00a0 3837\u00a0\u00a0\u00a0 70\u00a0\u00a0\u00a0\u00a0\u00a0 5398<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">\/CustomerProfile.aspx 5505\u00a0\u00a0 224034\u00a0 1043\u00a0\u00a0\u00a0 444144<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">\/SiteWrapper.aspx\u00a0\u00a0\u00a0\u00a0 5325\u00a0\u00a0 3822\u00a0\u00a0\u00a0 111\u00a0\u00a0\u00a0\u00a0 1530<\/span><\/p>\n<p><span style=\"font-family: Courier New; font-size: x-small;\">\u2026<\/span><\/p>\n<p>In the data above, the root page clearly requested more than any other page (141729 times). The average performance is very good (6ms) but there is was an instance where the page takes <strong><em>over 40 seconds.<\/em><\/strong> You could further explore the logs to understand when that request occurred and what else was going on with the system.<\/p>\n<p>More important is the Search page which is one of the most frequently requested pages. It takes an average of about 8 seconds to complete and in the worst case scenario, took almost 5 min to finish. That represents a huge bottleneck and could have significant impact on the site performance. That page is worth spending some time to tune and explore which search queries might lead to these results.<\/p>\n<p><strong>Slow Pages<\/strong> are a great way to spotlight any requests that do not meet your minimal performance requests for a site. It is a good, common practice to establish a response goal for any web site (every page returns in less than 5 seconds). A slow pages query can help you understand if you are meeting that goal. In addition, slow requests can be expensive requests in terms of resources (CPU, memory, complex database queries, etc.).\u00a0 They can block important worker threads and may represent opportunities to increase a sites performance. You never want to see Top URIs also showing up in the Slow Pages results.\u00a0 Simply put, slow pages are bad.\u00a0 It only takes a few slow pages that are also top requests pages to have a dramatic and negative impact on a site.<\/p>\n<p>Looking at the Slow Pages query results below, there are several pages that are taking over 10 seconds to complete on average.<\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">URL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Max\u00a0\u00a0\u00a0 Min\u00a0 Average <\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212; &#8212;- &#8212;&#8212;-<\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">SupervisorAudit.aspx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 349957 78\u00a0\u00a0 <strong>46376<\/strong><\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">Employee.aspx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 302409 0\u00a0\u00a0\u00a0 <strong>38396<\/strong><\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">FTEInformation.aspx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 38267\u00a0 156\u00a0 <strong>19211<\/strong><\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">HRDiscounts.aspx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 314297 31\u00a0\u00a0 <strong>13051<\/strong><\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">AllEmployees.aspx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 40202\u00a0 46\u00a0\u00a0 <strong>10336<\/strong><\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">NotificationHistory.aspx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 9672\u00a0\u00a0 9672 9672<\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">ChangesAndApprovals.aspx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 54709\u00a0 62\u00a0\u00a0 9463<\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">ManageEmployee.aspx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 184160 124\u00a0 8609<\/span><\/p>\n<p>While there is no hard rules about how long a request should be given to complete, the user experience is always paramount. Long running requests may be fine if done asynchronously and the use is properly informed about the progress and status. Requests that take 20-40 seconds to complete without informing the end user will lead to a bad experience and commonly leads to serious performance problems as the result of tying up worker threads. The real goal is to identify slow requests and ensure this behavior is what you expect. It\u2019s common to see sites that start out very well and degrade as infrastructure changes or as load increases (growth). Periodic review of this information will help ensure you stay ahead of capacity problems.<\/p>\n<p>Running the <strong>Errors<\/strong> query is a great way to see if there are significant errors occurring in your app as well as a good way to validate bad URI references and malicious activity\/security scans occurring within your environments.\u00a0 While 404 won\u2019t impact your performance, they can impact user experience if ignored.\u00a0 500s can represent a range of exceptions.\u00a0 It is advised that you investigate, understand, and eliminate all of these.\u00a0 If you see malicious looking requests, check the IP source (also in the logs) to see if it is coming from a known source (internal security scans) or unexpected sources to make the appropriate inquiries.<\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">Request\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Status Total <\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212; &#8212;&#8211;<\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">\/touch-icon.png\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 404.0 43<\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">Images\/MenuButtons\/tab_left_on.gif\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 404.0 40<\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">\/scripts\/biztalkhttpreceive.dll\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 404.0 1<\/span><\/p>\n<p><span style=\"font-family: courier; font-size: x-small;\">\/scripts\/..%2f..\/winnt\/system32\/cmd.exe?\/c+dir+c:\\ 500.0 1<\/span><\/p>\n<p>Even after applications are tested and turned over to production, it\u2019s important to pay attention operation health. Environments change. Use cases change. Companies grow and demand on operational services grow with them.<\/p>\n<ul>\n<li>If you write code for web apps, ask your IT\/Operation teams for production IIS logs periodically and review for ongoing awareness of health and performance insights.<\/li>\n<li>Use LogParser to run RPH, Top URI, Slow Pages, and Errors queries and see how production metrics hold up against the results you observed during performance benchmarks and against operational targets.\u00a0 Consider Requests Per Hour results to gauge how much your load has increased since initial release and how much room you have to grow.<\/li>\n<\/ul>\n<hr align=\"center\" size=\"3\" width=\"100%\" \/>\n<p><a href=\"https:\/\/blogs.msdn.com\/b\/premier_developer\/archive\/2014\/09\/15\/welcome.aspx\"><strong>Premier Support for Developers<\/strong><\/a> provides strategic technology guidance, critical support coverage, and a range of essential services to help teams optimize development lifecycles and improve software quality.\u00a0 Contact your Application Development Manager (ADM) or <a href=\"https:\/\/blogs.msdn.microsoft.com\/premier_developer\/contact-us\/\"><strong>email us<\/strong><\/a> to learn more about what we can do for you.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post, Principal Application Developer Manager, Reed Robison explains how a periodic review of IIS Log data, often ignored and archived, provides valuable insight into the operational health and performance of web applications. &nbsp; We recently posted about how a focus on DevOps is changing the way IT Operations and Developers work together to [&hellip;]<\/p>\n","protected":false},"author":582,"featured_media":37840,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[137,21,101,3,111,107],"class_list":["post-531","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-permierdev","tag-advisory","tag-devops","tag-performance","tag-team","tag-testing","tag-webbrowser"],"acf":[],"blog_post_summary":"<p>In this post, Principal Application Developer Manager, Reed Robison explains how a periodic review of IIS Log data, often ignored and archived, provides valuable insight into the operational health and performance of web applications. &nbsp; We recently posted about how a focus on DevOps is changing the way IT Operations and Developers work together to [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts\/531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/users\/582"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/comments?post=531"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts\/531\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/media\/37840"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/media?parent=531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/categories?post=531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/tags?post=531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}