{"id":21201,"date":"2025-09-16T15:28:30","date_gmt":"2025-09-16T13:28:30","guid":{"rendered":"https:\/\/trifork.nl\/blog\/?p=21201"},"modified":"2025-09-16T15:28:31","modified_gmt":"2025-09-16T13:28:31","slug":"structured-logging-from-azure-app-service-applications-to-datadog","status":"publish","type":"post","link":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/","title":{"rendered":"Structured Logging from Azure App Service applications to Datadog"},"content":{"rendered":"\n<p>A new year, a new blog! Well, the year isn&#8217;t actually new, but I haven&#8217;t blogged for a while so it&#8217;s about time. If you think that the title of this one is oddly specific then you have a point, although I like to think of it as &#8220;highly SEO optimized&#8221;.<br>Another option would&#8217;ve been &#8220;Yo dawg, we heard you like JSON, so we put some JSON in your JSON so you can log while you log&#8221; but not enough people would understand the reference, I&#8217;m afraid&#8230;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">The Situation<\/h1>\n\n\n\n<p>For a client we&#8217;re deploying Spring Boot web applications to <a href=\"https:\/\/azure.microsoft.com\/nl-nl\/products\/app-service\" target=\"_blank\" rel=\"noreferrer noopener\">Azure App Service<\/a>. We&#8217;re actually deploying a WAR file to a managed Tomcat, mostly because the applications are still using JSPs. Apart from that, we&#8217;re using modern versions of everything and cloud native best practices, including structured logging. In our case, this has been set up with Log4J2&#8217;s <a href=\"https:\/\/logging.apache.org\/log4j\/2.x\/manual\/json-template-layout.html\" target=\"_blank\" rel=\"noreferrer noopener\">JSON Template Layout<\/a>, but there are many ways to enable this and recently Spring Boot even added <a href=\"https:\/\/spring.io\/blog\/2024\/08\/23\/structured-logging-in-spring-boot-3-4\" target=\"_blank\" rel=\"noreferrer noopener\">direct support<\/a>. <\/p>\n\n\n\n<p>For observability this client has chosen <a href=\"https:\/\/www.datadoghq.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Datadog<\/a>, which has built-in and deep Azure integration. In the case of Azure App Services, that means that the logs from your Apache HTTP Server, Apache Tomcat <em>and <\/em>application are automatically sent to Datadog. For application logs that means &#8220;everything written to the console&#8221;. Sounds easy? Yes, but also too good to be true.<\/p>\n\n\n\n<p>What happens is that every log line written to STDOUT is simply taken as-is and stuffed in a JSON document as a field called &#8220;resultDescription&#8221;, to which a whole bunch of other fields are added and shipped to Datadog. In Datadog there&#8217;s a default logging pipeline for logging coming from the so-called &#8220;azure.web&#8221; source, and eventually you end up with something like this:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"763\" src=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-1024x763.png\" alt=\"\" class=\"wp-image-21202\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-1024x763.png 1024w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-300x223.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-768x572.png 768w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image.png 1195w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>As you can see, we don&#8217;t have a log message, the level is wrong and effectively no info is taken from our application logging, because it\u2019s all wrapped up inside the <code>resultDescription<\/code> field.<br>Note that the value of that field is a single string with JSON: that&#8217;s because the Azure Datadog integration actually escapes the application&#8217;s JSON logging, as it doesn&#8217;t know (and cannot assume) that the logging uses JSON formatting. If it had included the JSON as-is, then Datadog would have shown nested fields under the <code>resultDescription<\/code> instead. <\/p>\n\n\n\n<h1 class=\"wp-block-heading\">The Solution<\/h1>\n\n\n\n<p>Typically I&#8217;d try to remedy this at the side that&#8217;s <em>producing <\/em>the logs: configure the Datadog agent, set up an <a href=\"https:\/\/www.datadoghq.com\/product\/observability-pipelines\/\" target=\"_blank\" rel=\"noreferrer noopener\">observability pipeline<\/a>. However, in this case we&#8217;re leaning on built-in App Service integration and there&#8217;s no dedicated agent to configure. Although you can configure a <a href=\"https:\/\/azure.github.io\/AppService\/2025\/03\/19\/datadog-sidecar-extension.html\" target=\"_blank\" rel=\"noreferrer noopener\">Datadog side car in Azure App Service<\/a>, I&#8217;d prefer to do without that for every individual application (and also am not sure that our pipeline will be able to configure this, or if this is a UI-only feature). <br>You can also forego the whole Datadog integration and use <a href=\"https:\/\/docs.datadoghq.com\/serverless\/azure_app_service\/windows_code\/?tab=java#application-logging\" target=\"_blank\" rel=\"noreferrer noopener\">Agentless logging<\/a>, but that doesn&#8217;t work with Log4J2 (which is what this client is using) and has other issues.<\/p>\n\n\n\n<p>So, in this case I opted for a solution on the Datadog side: we need a custom logging pipeline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Datadog Logging Pipelines<\/h2>\n\n\n\n<p>With Datadog you can set up ingestion pipelines for your logging that teach the tool how to process incoming log statements. For well-known sources, integrations can set up predefined pipelines, but you can also define your own.\u00a0<\/p>\n\n\n\n<p>As we\u2019re using the built-in Azure integration for our App Service-based applications, there is a default pipeline for logs with an \u201cAzure Web\u201d source. This one isn\u2019t sufficient for our case, though, as it doesn\u2019t know about the custom <code>resultDescription<\/code> field and its JSON contents.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Defining a custom logging pipeline<\/h2>\n\n\n\n<p>The trick is to define an additional pipeline that runs BEFORE the built-in one for the application logs. This is how I&#8217;ve done that:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"368\" src=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-1.png\" alt=\"\" class=\"wp-image-21203\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-1.png 700w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-1-300x158.png 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>This is what the definition containing the filter of that new pipeline looks like:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"979\" height=\"369\" src=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-2.png\" alt=\"\" class=\"wp-image-21204\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-2.png 979w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-2-300x113.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-2-768x289.png 768w\" sizes=\"auto, (max-width: 979px) 100vw, 979px\" \/><\/figure>\n\n\n\n<p>By filtering on category and the fx_version (note the wildcard!) we know that we&#8217;re matching console logs  and that they come from a Java Tomcat web application (we don&#8217;t want to accidentally match applications from other teams here). The Azure App Service integration also sends HTTP server logs and Tomcat logs, and these do not use structured JSON logging and also do not result in a <code>resultDescription <\/code>field, so we want to ensure we&#8217;re matching only our custom application logs that we know to contain JSON. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Processors<\/h2>\n\n\n\n<p>The most important goal is to let Datadog parse the JSON in the <code>resultDescription<\/code> and extract the contents as top-level fields of the log event. <\/p>\n\n\n\n<p>As shown in the screenshot above, the pipeline first contains a Grok processor that does exactly this, and then some processors that handle the resulting fields.<\/p>\n\n\n\n<p>This is the Grok processor:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"618\" height=\"525\" src=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-4.png\" alt=\"\" class=\"wp-image-21206\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-4.png 618w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-4-300x255.png 300w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><\/figure>\n\n\n\n<p>Under the Advanced Settings we configure the field, and then the rule itself becomes trivial. You can read about processing nested JSON <a href=\"https:\/\/docs.datadoghq.com\/logs\/log_configuration\/parsing\/?tab=matchers#nested-json\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>. It&#8217;s very nice that we can indicate that the processor should apply to a specific field: I was worried that I&#8217;d had to come up with a complex Grok rule that would match the entire JSON message sent by the Azure integration, but as you can see there&#8217;s no need for that at all.<\/p>\n\n\n\n<p>The following two processors map <code>message<\/code>\u00a0as the message and <code>service.name<\/code>\u00a0as the service. The latter is added by our code to every log message to identity the Java service that&#8217;s producing the logging. <\/p>\n\n\n\n<p>The next two remap <code>@timestamp<\/code> to <code>time<\/code> and <code>status<\/code> to <code>level<\/code> <em>without <\/em>preserving the original attributes: the reason is that the log event already contains those fields (but not with the value that we want) and the built-in azure.web pipeline already defines how to handle those fields. It&#8217;s better to reuse them and remove our own fields, that also means there&#8217;s less data to store in Datadog.<\/p>\n\n\n\n<p>The final two remap <a href=\"https:\/\/www.elastic.co\/docs\/reference\/ecs\/ecs-field-reference\">ECS keys<\/a> produced by a custom filter of our applications to the corresponding <a href=\"https:\/\/docs.datadoghq.com\/standard-attributes\/\" target=\"_blank\" rel=\"noreferrer noopener\">Datadog default attribute names<\/a> (again, without preserving the original fields).\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Effect<\/h2>\n\n\n\n<p>With this additional pipeline in place, our logging now looks as expected. The logger and thread name are picked up automatically as those fields have the expected names already, and the rest is handled by the pipeline:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"820\" height=\"859\" src=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-5.png\" alt=\"\" class=\"wp-image-21207\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-5.png 820w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-5-286x300.png 286w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/image-5-768x805.png 768w\" sizes=\"auto, (max-width: 820px) 100vw, 820px\" \/><\/figure>\n\n\n\n<p>As can be seen, Datadog understands that this is a DEBUG message, the service is now &#8220;JiraTalker&#8221; rather than &#8220;azure&#8221; and the logging contains the actual message. There&#8217;s no <code>@timestamp<\/code> nor <code>status<\/code> field, as they&#8217;ve been remapped.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>The nice thing about this solution is that it doesn&#8217;t require anything on the Azure side: no log files, no side cars, no API keys for Datadog, nothing. Everything is handled at the Datadog side. <br>The log messages there also still contain the same fields as all other App Services logging, we just change the service name.\u00a0<\/p>\n\n\n\n<p>We are stuck with the resultDescription field itself, but if its size would become an issue then you could configure Datadog to not index it or you could remap some other small field onto it: it seems like there&#8217;s no way to simply drop a field using a logging pipeline processor.<\/p>\n\n\n\n<p><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A new year, a new blog! Well, the year isn&#8217;t actually new, but I haven&#8217;t blogged for a while so it&#8217;s about time. If you think that the title of this one is oddly specific then you have a point, although I like to think of it as &#8220;highly SEO optimized&#8221;.Another option would&#8217;ve been &#8220;Yo [&hellip;]<\/p>\n","protected":false},"author":62,"featured_media":21209,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[88,337,31,1],"tags":[],"class_list":["post-21201","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","category-from-the-trenches","category-java","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Structured Logging from Azure App Service applications to Datadog - Trifork Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Structured Logging from Azure App Service applications to Datadog - Trifork Blog\" \/>\n<meta property=\"og:description\" content=\"A new year, a new blog! Well, the year isn&#8217;t actually new, but I haven&#8217;t blogged for a while so it&#8217;s about time. If you think that the title of this one is oddly specific then you have a point, although I like to think of it as &#8220;highly SEO optimized&#8221;.Another option would&#8217;ve been &#8220;Yo [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/\" \/>\n<meta property=\"og:site_name\" content=\"Trifork Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-16T13:28:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-16T13:28:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/datadog-azure.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"420\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Joris Kuipers\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joris Kuipers\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/\",\"url\":\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/\",\"name\":\"Structured Logging from Azure App Service applications to Datadog - Trifork Blog\",\"isPartOf\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/datadog-azure.jpeg\",\"datePublished\":\"2025-09-16T13:28:30+00:00\",\"dateModified\":\"2025-09-16T13:28:31+00:00\",\"author\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/265bd41e503f7176742258a927de598b\"},\"breadcrumb\":{\"@id\":\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#primaryimage\",\"url\":\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/datadog-azure.jpeg\",\"contentUrl\":\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/datadog-azure.jpeg\",\"width\":800,\"height\":420},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/trifork.nl\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Structured Logging from Azure App Service applications to Datadog\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/trifork.nl\/blog\/#website\",\"url\":\"https:\/\/trifork.nl\/blog\/\",\"name\":\"Trifork Blog\",\"description\":\"Keep updated on the technical solutions Trifork is working on!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/trifork.nl\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/265bd41e503f7176742258a927de598b\",\"name\":\"Joris Kuipers\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9ab8da0d60582bad84342d4602d23dbd?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9ab8da0d60582bad84342d4602d23dbd?s=96&d=mm&r=g\",\"caption\":\"Joris Kuipers\"},\"sameAs\":[\"http:\/\/www.trifork.nl\"],\"url\":\"https:\/\/trifork.nl\/blog\/author\/jorisk\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Structured Logging from Azure App Service applications to Datadog - Trifork Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/","og_locale":"en_US","og_type":"article","og_title":"Structured Logging from Azure App Service applications to Datadog - Trifork Blog","og_description":"A new year, a new blog! Well, the year isn&#8217;t actually new, but I haven&#8217;t blogged for a while so it&#8217;s about time. If you think that the title of this one is oddly specific then you have a point, although I like to think of it as &#8220;highly SEO optimized&#8221;.Another option would&#8217;ve been &#8220;Yo [&hellip;]","og_url":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/","og_site_name":"Trifork Blog","article_published_time":"2025-09-16T13:28:30+00:00","article_modified_time":"2025-09-16T13:28:31+00:00","og_image":[{"width":800,"height":420,"url":"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/datadog-azure.jpeg","type":"image\/jpeg"}],"author":"Joris Kuipers","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Joris Kuipers","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/","url":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/","name":"Structured Logging from Azure App Service applications to Datadog - Trifork Blog","isPartOf":{"@id":"https:\/\/trifork.nl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#primaryimage"},"image":{"@id":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#primaryimage"},"thumbnailUrl":"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/datadog-azure.jpeg","datePublished":"2025-09-16T13:28:30+00:00","dateModified":"2025-09-16T13:28:31+00:00","author":{"@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/265bd41e503f7176742258a927de598b"},"breadcrumb":{"@id":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#primaryimage","url":"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/datadog-azure.jpeg","contentUrl":"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2025\/09\/datadog-azure.jpeg","width":800,"height":420},{"@type":"BreadcrumbList","@id":"https:\/\/trifork.nl\/blog\/structured-logging-from-azure-app-service-applications-to-datadog\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/trifork.nl\/blog\/"},{"@type":"ListItem","position":2,"name":"Structured Logging from Azure App Service applications to Datadog"}]},{"@type":"WebSite","@id":"https:\/\/trifork.nl\/blog\/#website","url":"https:\/\/trifork.nl\/blog\/","name":"Trifork Blog","description":"Keep updated on the technical solutions Trifork is working on!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/trifork.nl\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/265bd41e503f7176742258a927de598b","name":"Joris Kuipers","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9ab8da0d60582bad84342d4602d23dbd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9ab8da0d60582bad84342d4602d23dbd?s=96&d=mm&r=g","caption":"Joris Kuipers"},"sameAs":["http:\/\/www.trifork.nl"],"url":"https:\/\/trifork.nl\/blog\/author\/jorisk\/"}]}},"_links":{"self":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/21201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/users\/62"}],"replies":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/comments?post=21201"}],"version-history":[{"count":1,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/21201\/revisions"}],"predecessor-version":[{"id":21208,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/21201\/revisions\/21208"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media\/21209"}],"wp:attachment":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media?parent=21201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/categories?post=21201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/tags?post=21201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}