{"id":611,"date":"2020-09-24T01:35:11","date_gmt":"2020-09-24T08:35:11","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/azure-sdk\/?p=611"},"modified":"2020-09-24T17:00:02","modified_gmt":"2020-09-25T00:00:02","slug":"java-logging-azure-functions","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/azure-sdk\/java-logging-azure-functions\/","title":{"rendered":"Azure SDK for Java Logging in Azure Functions"},"content":{"rendered":"<p>In this post we will learn about <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-java\">Azure SDK for Java<\/a> application and HTTP logging scenarios in an Azure Functions environment. We will look at the scenario of managing secrets in the Azure Key Vault with the Key Vault and Identity client libraries and how to activate and access the SDK logs in the Azure Functions environment. The Azure SDK logs are helpful to analyze the underlying behavior of the SDKs and help to debug and root cause issues experienced in the deployed production environment of Azure Functions.<\/p>\n<h3>What is Azure Functions?<\/h3>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/azure-functions\/\">Azure Functions<\/a> is a serverless computing service which allows developers to quickly deploy their code in the cloud and run the application at scale. It simplifies the application development and takes away the hassle of managing the infrastructure of the platform on which the code will be executed. The user can also configure a variety of triggers or events to execute their function, such as HTTP requests, scheduled runs, events, or notification hubs.<\/p>\n<h3>Setting up Azure Functions Development Environment<\/h3>\n<p>VSCode and IntelliJ both offer great support to quickly get started with setting up your development environment to run Azure Functions. You can use the instructions below to setup the Azure Functions project in your preferred IDE.<\/p>\n<h4>VSCode<\/h4>\n<p><strong>Prequisites:<\/strong><\/p>\n<ol>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/developer\/java\/fundamentals\/java-jdk-long-term-support\">Java Developer Kit<\/a>, version 8<\/li>\n<li><a href=\"https:\/\/maven.apache.org\/\">Apache Maven<\/a> 3.0 or above<\/li>\n<li><a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a><\/li>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=vscjava.vscode-java-pack\">Java Extension pack<\/a> for Visual Studio Code<\/li>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-azuretools.vscode-azurefunctions\">Azure Functions Extension<\/a> for Visual Studio Code<\/li>\n<\/ol>\n<p>Use the <a href=\"https:\/\/docs.microsoft.com\/azure\/azure-functions\/functions-create-first-function-vs-code?pivots=programming-language-java\">VSCode-quickstart<\/a> guide to setup your environment.<\/p>\n<h4>IntelliJ<\/h4>\n<p><strong>Prequisites:<\/strong><\/p>\n<ol>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/developer\/java\/fundamentals\/java-jdk-long-term-support\">Java Developer Kit<\/a>, version 8<\/li>\n<li><a href=\"https:\/\/maven.apache.org\/download.cgi\">Apache Maven<\/a> 3.5.0 or above.<\/li>\n<li><a href=\"https:\/\/www.jetbrains.com\/idea\/download\/\">IntelliJ IDEA<\/a> Ultimate Edition or Community Edition<\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-functions-core-tools\">Function Core Tools<\/a><\/li>\n<\/ol>\n<p>Use the <a href=\"https:\/\/docs.microsoft.com\/azure\/developer\/java\/toolkit-for-intellij\/quickstart-functions\">IntelliJ-quickstart<\/a> guide to setup your environment.<\/p>\n<p>Once you have setup the Azure Functions project in your preferred IDE, we will now begin adding the logic to connect to an Azure Key Vault using the <a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-security-keyvault-secrets\/4.2.0\/jar\">azure-security-keyvault-secrets<\/a> and <a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-identity\/1.1.0\/jar\">azure-identity<\/a> client libraries.<\/p>\n<p><strong>Maven Packages:<\/strong><\/p>\n<p>Add the following Azure SDK client libraries to your Azure Functions pom file:<\/p>\n<pre><code>&lt;dependency&gt;\n    &lt;groupId&gt;com.azure&lt;\/groupId&gt;\n    &lt;artifactId&gt;azure-security-keyvault-secrets&lt;\/artifactId&gt;\n    &lt;version&gt;4.2.0&lt;\/version&gt;\n&lt;\/dependency&gt;\n\n&lt;dependency&gt;\n    &lt;groupId&gt;com.azure&lt;\/groupId&gt;\n    &lt;artifactId&gt;azure-identity&lt;\/artifactId&gt;\n    &lt;version&gt;1.1.0&lt;\/version&gt;\n&lt;\/dependency&gt; \n<\/code><\/pre>\n<p>Latest packages for these client libraries can be found here:<\/p>\n<ol>\n<li><a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-security-keyvault-secrets\">azure-security-keyvault-secrets<\/a>.<\/li>\n<li><a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-identity\">azure-identity<\/a>.<\/li>\n<\/ol>\n<h3>Azure Functions Code Setup<\/h3>\n<p>In the Function Setup below, we use the Azure Identity client library to connect to the Azure Key Vault and then create a secret in the Key Vault.<\/p>\n<pre><code class=\"java\">@FunctionName(\"AzureKeyVaultFunction\")\n    public HttpResponseMessage run(\n            @HttpTrigger(\n                name = \"req\",\n                methods = {HttpMethod.GET, HttpMethod.POST},\n                authLevel = AuthorizationLevel.ANONYMOUS)\n                HttpRequestMessage&lt;Optional&lt;String&gt;&gt; request,\n            final ExecutionContext context) {\n        \/\/ Parse query parameter\n        final String vaultUrl = request.getQueryParameters().get(\"vaultUrl\");\n\n        if (vaultUrl == null) {\n            return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body(\"Please pass a vaultUrl on the query string or in the request body\").build();\n        }\n\n        SecretClient secretClient = new SecretClientBuilder()\n                .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))\n                .vaultUrl(vaultUrl)\n                .credential(new DefaultAzureCredentialBuilder().build())\n                .buildClient();\n\n        context.getLogger().info(\"Executing secret creation.\");\n        KeyVaultSecret secret = secretClient.setSecret(\"DummySecret\", \"DummyValue\");\n        context.getLogger().info(String.format(\"Successfully created secret with name: %s and value: %s\", secret.getName(), secret.getValue()));\n\n        return request.createResponseBuilder(HttpStatus.OK)\n                .build();\n    }\n\n<\/code><\/pre>\n<p>We use <code>DefaultAzureCredential<\/code> to authenticate <code>SecretClient<\/code> with Azure Active Directory (AAD). In the production environment where the code is deployed to the Azure Function, <code>ManagedIdentityCredential<\/code> will be used by the <code>DefaultAzureCredential<\/code> to authenticate.<\/p>\n<pre><code class=\"java\">SecretClient secretClient = new SecretClientBuilder()\n        .vaultUrl(vaultUrl)\n        .credential(new DefaultAzureCredentialBuilder().build())\n        .buildClient();\n<\/code><\/pre>\n<p>Creating a secret is as simple as this one line. Once executed, then we just print out the name and value of the created secret.<\/p>\n<pre><code class=\"java\">  context.getLogger().info(\"Executing secret creation.\");\n  KeyVaultSecret secret = secretClient.setSecret(\"DummySecret\", \"DummyValue\");\n  context.getLogger().info(String.format(\"Successfully created secret with name: %s and value: %s\", secret.getName(), secret.getValue()));\n<\/code><\/pre>\n<h3>Configuring logging in Azure SDKs<\/h3>\n<p><strong>HTTP logging<\/strong><\/p>\n<p>The HTTP logging will log all the HTTP requests being sent by the client. We will enable it in the above Azure Functions code via <code>HttpLogOptions<\/code>.<\/p>\n<p>We create and configure the http log options and then specify the options in the <code>SecretClientBuilder<\/code>.<\/p>\n<pre><code class=\"java\">SecretClient secretClient = new SecretClientBuilder()\n        .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))\n        .vaultUrl(vaultUrl)\n        .credential(credential)\n        .buildClient();\n<\/code><\/pre>\n<p><strong>SDK logging<\/strong><\/p>\n<p>Now, let\u2019s configure logging in the Azure client libraries being used in the code. The Azure SDK support logging via <a href=\"http:\/\/www.slf4j.org\/\">SLF4J<\/a>. This allows the applications to use their preferred logging framework with the Azure SDK. Detailed instructions to setup logging with Azure SDK can be found in the <a href=\"https:\/\/aka.ms\/azsdk\/java\/logging\">wiki<\/a>.<\/p>\n<p>We will be using log4j logging framework in this blog via following steps: 1. Add the slf4j log4j dependency to the pom file<\/p>\n<pre><code>&lt;dependency&gt; \n    &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\n    &lt;artifactId&gt;slf4j-log4j12&lt;\/artifactId&gt;\n    &lt;version&gt;1.7.29&lt;\/version&gt;\n&lt;\/dependency&gt;\n<\/code><\/pre>\n<ol>\n<li>Specify the log4j configuration in <code>src\/main\/resources<\/code> via <code>log4j.properties<\/code> file: We will be using a Rolling file appender to direct the output to a file instead of console and console output does not show up directly on Azure Functions console logs.<\/li>\n<\/ol>\n<pre># Configure the root logger with appender file\nlog4j.rootLogger = DEBUG, FILE\n\n# Configure the file appender\nlog4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender\n\n# Configure the name of the log file, it also contains the file system path of the Azure Functions environment to store the logs in this specific location. \nlog4j.appender.FILE.File=D:\/home\/LogFiles\/slf4j\/log.out\n\n# Configure the immediate flush to true (default)\nlog4j.appender.FILE.ImmediateFlush=true\n\n# Configure the threshold to debug mode\nlog4j.appender.FILE.Threshold=debug\n\n# Configure the append to true, should not overwrite\nlog4j.appender.FILE.Append=true\n\n# Configure the DatePattern\nlog4j.appender.FILE.DatePattern='.' yyyy-MM-dd-HH-mm\n\n# Configure the layout for file appender\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.conversionPattern=%m%n\n<\/pre>\n<h3>Deploy the Azure Function<\/h3>\n<ol>\n<li>\n<p>Let\u2019s now deploy the Azure Function and execute it in the cloud.<\/p>\n<p>VSCode and IntelliJ both support deploying the Azure Functions to the cloud from the IDE itself. Follow the deployment instructions in their respective deployment guides below:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/azure-functions\/functions-create-first-function-vs-code?pivots=programming-language-java#publish-the-project-to-azure\">VSCode-Azure-Functions-Deployment-Guide<\/a>.<\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/developer\/java\/toolkit-for-intellij\/quickstart-functions#deploy-your-function-app-to-azure\">IntelliJ-Azure-Functions-Deployment-Guide<\/a>.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Once your Azure Function application is deployed, now let\u2019s navigate to the portal.<\/p>\n<p>If your Functions app is configured to use Java 8 then click on <code>Configuration<\/code> and add a new <code>Application Setting<\/code> with name <code>FUNCTIONS_WORKER_JAVA_LOAD_APP_LIBS<\/code> and value <code>1<\/code><\/p>\n<p>If your Functions app is using Java 11, then you can skip this step.<\/p>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-function-add-configuration-setting.png\" alt=\"\" \/><\/p>\n<ol>\n<li>\n<p>To execute your function, click on Functions to see all the deployed functions in the app. <img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-function-select.png\" alt=\"\" \/><\/p>\n<\/li>\n<li>\n<p>Select your deployed function from the drop down.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-function-select-dropdown.png\" alt=\"\" \/><\/p>\n<\/li>\n<li>\n<p>Then execute your function through these steps:<\/p>\n<p>Before pressing the <code>Run<\/code> button to execute your function, add <code>vaulUrl<\/code> query parameter under <code>Query<\/code> section.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-function-execution.png\" alt=\"\" \/><\/p>\n<\/li>\n<li>\n<p>A terminal window will pop up showing the output logs and trace on the screen as following:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-function-output-logs.png\" alt=\"\" \/><\/p>\n<\/li>\n<\/ol>\n<p>The highlighted INFO logs are coming from the context logger in our code. The terminal in the Azure Functions will only show logs via Context logger and won\u2019t show any HTTP logs or SDK logs which have been enabled.<\/p>\n<pre><code class=\"java\">context.getLogger().info(\"Executing secret creation.\");\nKeyVaultSecret secret = secretClient.setSecret(\"DummySecret\", \"DummyValue\");\ncontext.getLogger().info(String.format(\"Successfully created secret with name: %s and value: %s\", secret.getName(), secret.getValue()));\n<\/code><\/pre>\n<h3>Accessing the Log4j logs<\/h3>\n<p>We will use <a href=\"https:\/\/github.com\/projectkudu\/kudu\/wiki\">KUDU<\/a> API Console to look at the SDK and HTTP logs which we enabled before via our log4j.properties previously.<\/p>\n<p>Our log4j settings indicated to write the logs to the file. The KUDU API console allows us to Access the filesystem of the platform on which Azure Functions is running and we can use it to look at our logs stored in the file.<\/p>\n<ol>\n<li>Log in at the KUDU API console at this URL <code>https:\/\/&lt;Function-App-Name&gt;.scm.azurewebsites.net<\/code><\/li>\n<li>\n<p>Once logged in you\u2019ll see the following window:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-kudu-loggedin.png\" alt=\"\" \/><\/p>\n<\/li>\n<li>\n<p>Navigate to Debug console -> Powershell<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-debug-console.png\" alt=\"\" \/><\/p>\n<\/li>\n<li>\n<p>Navigate to the log file output path configured in log4j.properties file.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-navigate-to-log-location.png\" alt=\"\" \/><\/p>\n<\/li>\n<li>\n<p>Execute <code>cat<\/code> command on the log file to look at the log4j of Azure SDKs. These screenshots below display the logs in the file.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-azure-sdk-logs-1.png\" alt=\"\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2020\/09\/20200914-azure-sdk-logs-2.png\" alt=\"\" \/><\/p>\n<\/li>\n<\/ol>\n<p>Azure Client libraries support configurable SDK and HTTP logging. The generated logs are helpful to debug and root cause issues experienced with the Azure SDKs in any environment. Enabling logging will create a negative impact on the performance of Azure client libraries, so to maximize the performance ensure that logging is disabled and only enable logging in situations where needed, for example, when debugging and investigating issues.<\/p>\n<p><!-- FOOTER: DO NOT EDIT OR REMOVE --><\/p>\n<p><div  class=\"d-flex justify-content-center\"><a class=\"cta_button_link btn-primary mb-24\" href=\"https:\/\/aka.ms\/azsdk\/releases\" target=\"_blank\">Azure SDK Releases<\/a><\/div><\/p>\n<h2>Azure SDK Blog Contributions<\/h2>\n<p>Thank you for reading this Azure SDK blog post! We hope that you learned something new and welcome you to share this post. We are open to Azure SDK blog contributions. Please contact us at <a href=\"&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#58;&#x61;z&#115;&#x64;&#107;&#x62;&#108;&#x6f;&#103;&#x40;&#109;&#105;&#x63;&#114;&#x6f;&#115;&#x6f;&#102;&#x74;&#46;&#x63;o&#109;\">&#x61;z&#115;&#x64;&#107;&#x62;&#108;&#x6f;&#103;&#x40;&#109;&#105;&#x63;&#114;&#x6f;&#115;&#x6f;&#102;&#x74;&#46;&#x63;o&#109;<\/a> with your topic and we&#8217;ll get you setup as a guest blogger.<\/p>\n<h2>Azure SDK Links<\/h2>\n<ul>\n<li>Azure SDK Website: <a href=\"https:\/\/aka.ms\/azsdk\">aka.ms\/azsdk<\/a><\/li>\n<li>Azure SDK Intro (3 minute video): <a href=\"https:\/\/aka.ms\/azsdk\/intro\">aka.ms\/azsdk\/intro<\/a><\/li>\n<li>Azure SDK Intro Deck (PowerPoint deck): <a href=\"https:\/\/aka.ms\/azsdk\/intro\/deck\">aka.ms\/azsdk\/intro\/deck<\/a><\/li>\n<li>Azure SDK Releases: <a href=\"https:\/\/aka.ms\/azsdk\/releases\">aka.ms\/azsdk\/releases<\/a><\/li>\n<li>Azure SDK Blog: <a href=\"https:\/\/aka.ms\/azsdk\/blog\">aka.ms\/azsdk\/blog<\/a><\/li>\n<li>Azure SDK Twitter: <a href=\"https:\/\/twitter.com\/AzureSDK\">twitter.com\/AzureSDK<\/a><\/li>\n<li>Azure SDK Design Guidelines: <a href=\"https:\/\/aka.ms\/azsdk\/guide\">aka.ms\/azsdk\/guide<\/a><\/li>\n<li>Azure SDKs &amp; Tools: <a href=\"https:\/\/azure.microsoft.com\/downloads\">azure.microsoft.com\/downloads<\/a><\/li>\n<li>Azure SDK Central Repository: <a href=\"https:\/\/github.com\/azure\/azure-sdk#azure-sdk\">github.com\/azure\/azure-sdk<\/a><\/li>\n<li>Azure SDK for .NET: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-net\">github.com\/azure\/azure-sdk-for-net<\/a><\/li>\n<li>Azure SDK for Java: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-java\">github.com\/azure\/azure-sdk-for-java<\/a><\/li>\n<li>Azure SDK for Python: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-python\">github.com\/azure\/azure-sdk-for-python<\/a><\/li>\n<li>Azure SDK for JavaScript\/TypeScript: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-js\">github.com\/azure\/azure-sdk-for-js<\/a><\/li>\n<li>Azure SDK for Android: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-android\">github.com\/Azure\/azure-sdk-for-android<\/a><\/li>\n<li>Azure SDK for iOS: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-ios\">github.com\/Azure\/azure-sdk-for-ios<\/a><\/li>\n<li>Azure SDK for Go: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-go\">github.com\/Azure\/azure-sdk-for-go<\/a><\/li>\n<li>Azure SDK for C: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-c\">github.com\/Azure\/azure-sdk-for-c<\/a><\/li>\n<li>Azure SDK for C++: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-cpp\">github.com\/Azure\/azure-sdk-for-cpp<\/a><\/li>\n<\/ul>\n<p><!-- FOOTER: DO NOT EDIT OR REMOVE --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post, we&#8217;ll cover the steps required to setup and access Azure SDK for Java logging in an Azure Functions environment.<\/p>\n","protected":false},"author":39317,"featured_media":621,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[750,757,160,756],"class_list":["post-611","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-sdk","tag-azure-sdk","tag-functions","tag-java","tag-logging"],"acf":[],"blog_post_summary":"<p>In this post, we&#8217;ll cover the steps required to setup and access Azure SDK for Java logging in an Azure Functions environment.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/users\/39317"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/comments?post=611"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/611\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media\/621"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media?parent=611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/categories?post=611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/tags?post=611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}