{
  "encassConfigs": [
    {
      "goid": "e5f6a7b8555546669777888899990000",
      "guid": "e5f6a7b8-5555-4666-9777-888899990000",
      "name": "CaptureLogInfo-1.0",
      "description": "Structured per-request logging for the Layer7 API Developer Portal. Emits a single JSON-line audit detail (Audit Detail assertion at INFO level) per request containing the request's identity, auth context, response code, and routing time, in a format suitable for SIEM ingestion. Verbosity is publisher-selectable via a Log Verbosity drop-down: 'minimal' (api_id, method, action, response_code, routing_time_ms), 'standard' (minimal + auth_type, apikey_id, app_name, org_name, source_ip), or 'verbose' (standard + service_id, app_uuid, org_uuid, host, user_agent). Designed to run LAST in a Policy Template Category chain, after CaptureMetrics has finalised every portal.analytics.* variable. Optional and Flexible category - skip it on APIs that do not need application-level logging.",
      "policyName": "CaptureLogInfo-1.0",
      "encassArgs": [
        {
          "name": "portal.managed.service.apiId",
          "type": "STRING",
          "ordinal": 1,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.action",
          "type": "STRING",
          "ordinal": 2,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.api.uuid",
          "type": "STRING",
          "ordinal": 3,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.apikey",
          "type": "STRING",
          "ordinal": 4,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.application.name",
          "type": "STRING",
          "ordinal": 5,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.application.uuid",
          "type": "STRING",
          "ordinal": 6,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.authType",
          "type": "STRING",
          "ordinal": 7,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.organization.name",
          "type": "STRING",
          "ordinal": 8,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.organization.uuid",
          "type": "STRING",
          "ordinal": 9,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.response.code",
          "type": "STRING",
          "ordinal": 10,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.routingTotalTime",
          "type": "STRING",
          "ordinal": 11,
          "guiPrompt": false
        },
        {
          "name": "l7.enum.verbosity",
          "type": "STRING",
          "ordinal": 12,
          "guiPrompt": true,
          "guiLabel": "Log Verbosity *"
        },
        {
          "name": "l7.enum.verbosity.minimal",
          "type": "STRING",
          "ordinal": 13,
          "guiPrompt": true,
          "guiLabel": "minimal"
        },
        {
          "name": "l7.enum.verbosity.standard",
          "type": "STRING",
          "ordinal": 14,
          "guiPrompt": true,
          "guiLabel": "standard"
        },
        {
          "name": "l7.enum.verbosity.verbose",
          "type": "STRING",
          "ordinal": 15,
          "guiPrompt": true,
          "guiLabel": "verbose"
        }
      ],
      "encassResults": [],
      "properties": [
        {
          "name": "allowTracing",
          "value": "false"
        },
        {
          "name": "paletteFolder",
          "value": "customAssertions"
        },
        {
          "name": "passMetricsToParent",
          "value": "false"
        }
      ]
    }
  ],
  "policies": [
    {
      "goid": "f6a7b8c9666647779888999900001111",
      "guid": "f6a7b8c9-6666-4777-9888-999900001111",
      "name": "CaptureLogInfo-1.0",
      "policyType": "FRAGMENT",
      "enabled": true,
      "folderPath": "/Portal Templates",
      "soap": false,
      "policy": {
        "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<wsp:Policy xmlns:L7p=\"http://www.layer7tech.com/ws/policy\" xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2002/12/policy\">\n    <wsp:All wsp:Usage=\"Required\">\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"CaptureLogInfo-1.0 - structured per-request logging for SIEM / log-aggregation ingestion. Emits one JSON-line audit detail per request at INFO level. Verbosity is publisher-selectable: minimal / standard / verbose.\"/>\n        </L7p:CommentAssertion>\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"Copy the publisher-selected drop-down value into a short local variable for cleaner branch reads.\"/>\n        </L7p:CommentAssertion>\n        <L7p:SetVariable>\n            <L7p:Base64Expression stringValue=\"JHtsNy5lbnVtLnZlcmJvc2l0eX0=\"/>\n            <L7p:VariableToSet stringValue=\"verbosity\"/>\n        </L7p:SetVariable>\n        <wsp:OneOrMore wsp:Usage=\"Required\">\n            <wsp:All wsp:Usage=\"Required\">\n                <L7p:CommentAssertion>\n                    <L7p:Comment stringValue=\"Verbosity: minimal - api_id, method, action, response_code, routing_time_ms.\"/>\n                </L7p:CommentAssertion>\n                <L7p:ComparisonAssertion>\n                    <L7p:CaseSensitive booleanValue=\"false\"/>\n                    <L7p:Expression1 stringValue=\"${verbosity}\"/>\n                    <L7p:Operator operatorNull=\"null\"/>\n                    <L7p:Predicates predicates=\"included\">\n                        <L7p:item dataType=\"included\">\n                            <L7p:Type variableDataType=\"string\"/>\n                        </L7p:item>\n                        <L7p:item binary=\"included\">\n                            <L7p:CaseSensitive booleanValue=\"false\"/>\n                            <L7p:RightValue stringValue=\"minimal\"/>\n                        </L7p:item>\n                    </L7p:Predicates>\n                </L7p:ComparisonAssertion>\n                <L7p:AuditDetailAssertion>\n                    <L7p:Detail stringValue=\"{&quot;ts&quot;:${gateway.time},&quot;api_id&quot;:&quot;${portal.analytics.api.uuid}&quot;,&quot;method&quot;:&quot;${request.http.method}&quot;,&quot;action&quot;:&quot;${portal.analytics.action}&quot;,&quot;response_code&quot;:&quot;${portal.analytics.response.code}&quot;,&quot;routing_time_ms&quot;:&quot;${portal.analytics.routingTotalTime}&quot;}\"/>\n                    <L7p:Level stringValue=\"INFO\"/>\n                </L7p:AuditDetailAssertion>\n            </wsp:All>\n            <wsp:All wsp:Usage=\"Required\">\n                <L7p:CommentAssertion>\n                    <L7p:Comment stringValue=\"Verbosity: standard - minimal + auth_type, apikey_id, app_name, org_name, source_ip.\"/>\n                </L7p:CommentAssertion>\n                <L7p:ComparisonAssertion>\n                    <L7p:CaseSensitive booleanValue=\"false\"/>\n                    <L7p:Expression1 stringValue=\"${verbosity}\"/>\n                    <L7p:Operator operatorNull=\"null\"/>\n                    <L7p:Predicates predicates=\"included\">\n                        <L7p:item dataType=\"included\">\n                            <L7p:Type variableDataType=\"string\"/>\n                        </L7p:item>\n                        <L7p:item binary=\"included\">\n                            <L7p:CaseSensitive booleanValue=\"false\"/>\n                            <L7p:RightValue stringValue=\"standard\"/>\n                        </L7p:item>\n                    </L7p:Predicates>\n                </L7p:ComparisonAssertion>\n                <L7p:AuditDetailAssertion>\n                    <L7p:Detail stringValue=\"{&quot;ts&quot;:${gateway.time},&quot;api_id&quot;:&quot;${portal.analytics.api.uuid}&quot;,&quot;method&quot;:&quot;${request.http.method}&quot;,&quot;action&quot;:&quot;${portal.analytics.action}&quot;,&quot;auth_type&quot;:&quot;${portal.analytics.authType}&quot;,&quot;apikey_id&quot;:&quot;${portal.analytics.apikey}&quot;,&quot;app_name&quot;:&quot;${portal.analytics.application.name}&quot;,&quot;org_name&quot;:&quot;${portal.analytics.organization.name}&quot;,&quot;source_ip&quot;:&quot;${request.tcp.remoteAddress}&quot;,&quot;response_code&quot;:&quot;${portal.analytics.response.code}&quot;,&quot;routing_time_ms&quot;:&quot;${portal.analytics.routingTotalTime}&quot;}\"/>\n                    <L7p:Level stringValue=\"INFO\"/>\n                </L7p:AuditDetailAssertion>\n            </wsp:All>\n            <wsp:All wsp:Usage=\"Required\">\n                <L7p:CommentAssertion>\n                    <L7p:Comment stringValue=\"Verbosity: verbose - standard + service_id, app_uuid, org_uuid, host, user_agent. Add request-correlation IDs (e.g. ${requestId} or ${request.id}, depending on Gateway version) here if your SIEM ingestion needs them.\"/>\n                </L7p:CommentAssertion>\n                <L7p:ComparisonAssertion>\n                    <L7p:CaseSensitive booleanValue=\"false\"/>\n                    <L7p:Expression1 stringValue=\"${verbosity}\"/>\n                    <L7p:Operator operatorNull=\"null\"/>\n                    <L7p:Predicates predicates=\"included\">\n                        <L7p:item dataType=\"included\">\n                            <L7p:Type variableDataType=\"string\"/>\n                        </L7p:item>\n                        <L7p:item binary=\"included\">\n                            <L7p:CaseSensitive booleanValue=\"false\"/>\n                            <L7p:RightValue stringValue=\"verbose\"/>\n                        </L7p:item>\n                    </L7p:Predicates>\n                </L7p:ComparisonAssertion>\n                <L7p:AuditDetailAssertion>\n                    <L7p:Detail stringValue=\"{&quot;ts&quot;:${gateway.time},&quot;api_id&quot;:&quot;${portal.analytics.api.uuid}&quot;,&quot;service_id&quot;:&quot;${portal.managed.service.apiId}&quot;,&quot;method&quot;:&quot;${request.http.method}&quot;,&quot;action&quot;:&quot;${portal.analytics.action}&quot;,&quot;auth_type&quot;:&quot;${portal.analytics.authType}&quot;,&quot;apikey_id&quot;:&quot;${portal.analytics.apikey}&quot;,&quot;app_name&quot;:&quot;${portal.analytics.application.name}&quot;,&quot;app_uuid&quot;:&quot;${portal.analytics.application.uuid}&quot;,&quot;org_name&quot;:&quot;${portal.analytics.organization.name}&quot;,&quot;org_uuid&quot;:&quot;${portal.analytics.organization.uuid}&quot;,&quot;source_ip&quot;:&quot;${request.tcp.remoteAddress}&quot;,&quot;host&quot;:&quot;${request.http.header.host}&quot;,&quot;user_agent&quot;:&quot;${request.http.header.user-agent}&quot;,&quot;response_code&quot;:&quot;${portal.analytics.response.code}&quot;,&quot;routing_time_ms&quot;:&quot;${portal.analytics.routingTotalTime}&quot;}\"/>\n                    <L7p:Level stringValue=\"INFO\"/>\n                </L7p:AuditDetailAssertion>\n            </wsp:All>\n            <wsp:All wsp:Usage=\"Required\">\n                <L7p:CommentAssertion>\n                    <L7p:Comment stringValue=\"Fallback: drop-down selection missing or did not match a known profile. Emit the standard line so the request is not silently un-logged.\"/>\n                </L7p:CommentAssertion>\n                <L7p:AuditDetailAssertion>\n                    <L7p:Detail stringValue=\"{&quot;ts&quot;:${gateway.time},&quot;api_id&quot;:&quot;${portal.analytics.api.uuid}&quot;,&quot;method&quot;:&quot;${request.http.method}&quot;,&quot;action&quot;:&quot;${portal.analytics.action}&quot;,&quot;auth_type&quot;:&quot;${portal.analytics.authType}&quot;,&quot;apikey_id&quot;:&quot;${portal.analytics.apikey}&quot;,&quot;app_name&quot;:&quot;${portal.analytics.application.name}&quot;,&quot;org_name&quot;:&quot;${portal.analytics.organization.name}&quot;,&quot;source_ip&quot;:&quot;${request.tcp.remoteAddress}&quot;,&quot;response_code&quot;:&quot;${portal.analytics.response.code}&quot;,&quot;routing_time_ms&quot;:&quot;${portal.analytics.routingTotalTime}&quot;}\"/>\n                    <L7p:Level stringValue=\"INFO\"/>\n                </L7p:AuditDetailAssertion>\n            </wsp:All>\n        </wsp:OneOrMore>\n    </wsp:All>\n</wsp:Policy>\n"
      }
    }
  ],
  "properties": {
    "defaultAction": "NEW_OR_UPDATE",
    "meta": {
      "name": "CaptureLogInfo-1.0 Bundle",
      "schema": "11.2.1"
    },
    "mappings": {}
  }
}