search

Prev Next

Overview

You can look up Effective Log Search & Analytics logs by project.

Request

API URL

POST
https://elsa.apigw.ntruss.com/api/v1/logs/search

Request headers

The request headers specified in common settings are required.
Go to the creation guide of NAVER Cloud Platform authentication key and signature

x-ncp-apigw-timestamp: {current timestamp}
x-ncp-iam-access-key: {your iam access key}
x-ncp-apigw-signature-v2: {generated signature}

Request parameters

Parameter name Requirement status Type Restrictions Description
projectKey Yes string 1-53 Project key

Example:
“projectKey”:“Pbxxxxx_elsa-test”
projectId Yes int Project ID

Example:
"projectId": 8171
from Yes int Timestamp to start the search (UTC millisecond)

Example:
"from": 1381190400000
to Yes int Timestamp to end the search (UTC millisecond)

Example:
"to": 1381190400000
offset No int offset+limit<=10000 Default value: 0
You can specify an offset value at the beginning of the search results. 0 means it starts with the first record.

Example:
"offset": 100
limit No int 1 - 1000 Default: 10
Specifies the number of logs to return for a request. Returns the specified number of logs based on the offset value.

Example:
"limit": 500
sorts No Default: [{"logTime":"DESC"}]
You can specify the sort criteria and method.
Some aspects apply only when using the sorts feature. If the field to be sorted is a string-type field other than the specified fields (projectName, logTime, logLevel, host, projectVersion), you must append ".raw" to the field name.
If you are unsure whether a field requiring sorting should have “.raw” appended, you can check via the /api/v1/fields API.

Example:
“sorts”: [{"logType.raw":"DESC"}]
“sorts”: [{"projectVersion":"ASC"},{"logType.raw":"DESC"}]
query No string Boolean operators
AND OR NOT + -
For more information on how to use these operators, see Query String Syntax and Lucene Query Syntax.

JSON special characters.
To search for JSON special characters like the ones below, use a \ before the character.
"
\


Example:
Source: "query": "NOT logLevel:"FATAL" AND projectName:"elsa-test" AND (agent:"iPhone" OR agent:"iPod")"

After escaping: "query": "NOT logLevel:\"FATAL\" AND projectName:\"elsa-test\" AND (agent:\"iPhone\" OR agent:\"iPod\")"
includeFields No [string] This is a list of field names needed to query logs.

Example:
"includeFields": ["logSource", "logType","body"]
excludeFields No [string] This is the list of field names that is not needed to look up logs.

Example:
“excludeFields”: [“DmpReport”,” logType”]

Request body

{
  "projectId": 8171,
  "projectKey": "Pbxxxxx_elsa-test",
  "from": 1381190400000,
  "to": 1381190400000,
  "offset": 0,
  "limit": 1000,
  "query": "NOT logLevel:\"FATAL\" AND projectName:\" elsa-test\" AND (agent:\"iPhone\" OR agent:\"iPod\")",
  "includeFields": [
    "logSource",
    "logType",
    "body"
  ],
  "sorts": [
    {
      "projectVersion": "ASC"
    },
    {
      "logType.raw": "DESC"
    }
  ]
}

Request example

import hashlib
import hmac
import base64
import time
import requests

def make_signature(access_key, secret_key, timestamp, url):
    timestamp = str(timestamp)
    secret_key = bytes(secret_key, 'UTF-8')
    method = "POST"

    message = method + " " + url + "\n" + timestamp + "\n" + access_key
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
    return signingKey.decode('UTF-8')


def log_search():
    baseurl = "https://elsa.apigw.ntruss.com" #{OpenAPI endpoint}
    url = "/api/v1/logs/search"

    access_key = "accessKey" #{Main / Sub Account Access Key}
    secret_key = "secretKey" #{Main / Sub Account Secret Key}
    timestamp = int(time.time() * 1000)

    signature = make_signature(access_key, secret_key, timestamp, url)
    url = baseurl + url

    payload = {
      "projectId": 8171,
      "projectKey": "Pbxxxxx_elsa-test",
      "from": 1381190400000,
      "to": 1381190400000,
      "offset": 0,
      "limit": 1000,
      "query": "NOT logLevel:\"FATAL\" AND projectName:\" elsa-test\" AND (agent:\"iPhone\" OR agent:\"iPod\")",
      "includeFields": ["logSource","logType","body"],
      "sorts":[{"projectVersion":"ASC"},{"logType.raw":"DESC"}]
    }


    headers = {
        "x-ncp-apigw-timestamp": str(timestamp),
        "x-ncp-iam-access-key": access_key,
        "x-ncp-apigw-signature-v2": str(signature)
    }

    response = requests.post(url=url,
                  json=payload,
                  verify=True,
                  headers=headers
                  )

Response

Response body

{
  "data": {
    "total": 2,
    "logs": [
      {
        "sort": [
          "9.9.9",
          "elsa-log"
        ],
        "id": "27mt7eQqk9xILgiLdJcgxxxx",
        "existDmp": false,
        "source": {
          "logType": "elsa-log",
          "logSource": "json",
          "body": "Hello, I am [ xxx ], Nice to meet you !"
        }
      },
      {
        "sort": [
          "9.9.9",
          "nelo2-log"
        ],
        "id": "55mt7eQqk9xILgiLdJcgxxxx",
        "existDmp": false,
        "source": {
          "logType": " elsa-log ",
          "logSource": "json",
          "body": "Hello, I am [ xxx ], Nice to meet you !"
        }
      }
    ]
  },
  "status": 200
}