# Logs & Error Handling

The `getLogs` method retrieves and returns the logs of the circuit. The logs provide a chronological record of events and actions that have taken place in the execution of the circuit. This can be helpful for debugging purposes or for recording the progression of circuit tasks.

{% hint style="info" %}
You can optionally specify a category to get logs of that category only. There are three categories:&#x20;

* Error: Returns errors logged in the circuit.
* Response: Returns a stringified JSON of the Lit Action response object.
* Condition: Returns the matched or unmatched status for each conditional check and the Emitted Value from the Contract or Webhook Event.&#x20;
* Broadcast: Returns the broadcast Transaction Hash for broadcast `ContractActions`.
* Execution: Returns when Conditional Logic or Execution Constraints are updated.
  {% endhint %}

{% hint style="warning" %}
The SDK retains a rolling log of the most recent **1000** entries; for more extensive or permanent log storage, please consider using an external database or logging service.
{% endhint %}

<pre class="language-typescript" data-overflow="wrap" data-full-width="true"><code class="lang-typescript"><strong>import { LogCategory } from "lit-listener-sdk"
</strong>
/* returns all logs recorded by the circuit.*/
const allLogs = newCircuit.getLogs()

/* the returned value is array of objects with both category, message and responseObject fields, the category is the enum type and the message is the log description and the responseObject is the returned response object.*/
const { category, message, responseObject } = allLogs[0];

/* returns only the error logs recorded by the circuit.*/
const errorLogsOnly = newCircuit.getLogs(LogCategory.Error)
</code></pre>

When a log is recorded a log event is also emitted. You can subscribe to the events in real time through the `.on` method.

{% code overflow="wrap" fullWidth="true" %}

```typescript
import { ILogEntry } from "lit-listener-sdk"

newCircuit.on('log', (logEntry: ILogEntry) => {
    console.log("new log recorded", logEntry);
})
```

{% endcode %}

#### Lit Action Response Object

The Response returned by the Lit.Actions.setResponse() method is a concatenated response object of all responses logged in the code, including error handling. It is found as a stringified JSON in the `responseObject.response` field of the returned log.&#x20;

Every action is wrapped in a function with a unique name based on its type and priority, for example `custom0`, `fetch1`, `contract2`, etc.&#x20;

When an action is executed the result is saved in the `concatenatedResponse` object under a key with the same name as the action function.

If you have a `CustomAction` with a priority of `0`, and that action function returns the string "Custom Action 1", then the `concatenatedResponse` object will have a key-value pair of: `custom0: "Custom Action 1"`.

For `ContractActions` the returned response value is the `generatedUnsignedTransactionData`, for `FetchActions` the returned response value is an object value found at the response path under the value key, and a boolean under signed, indicating whether the transaction was signed or not according to any `signCondition`. For `CustomActions` the custom indicated response object is returned.

Any console logs or signatures created when executing the Lit Action are also returned in the `responseObject` under the `signatures` and `logs` fields.

Each signature is named according to the `SetAction` **type** and **priority** order for `FetchActions` and `ContractActions`.

<pre class="language-typescript"><code class="lang-typescript"><strong>{
</strong><strong>    category: 1,
</strong><strong>    message: "Circuit executed successfully. Lit Action Response."
</strong><strong>    responseObject: {
</strong><strong>        signatures: {
</strong><strong>            
</strong><strong>            },
</strong><strong>        response: {
</strong><strong>            custom0: "Custom Action 1 Returned Response",
</strong>            contract1: {
                "to": "0x46C0Fa7Ef8384E356C62E7e4cC2578bD70D829aa",
                "nonce": 0,
                "chainId": 137,
                "gasLimit": "50000",
                "maxFeePerGas": "2601315606",
                "maxPriorityFeePerGas": "650328901",
                "from": "0x4F9DDeb2Fe6AB63809dC6A026F493B77F7df4400",
                "data": "0xa9059cbb00000000000000000000000046c0fa7ef8384e356c62e7ecc2578bd70d829aa0000000000000000000000000000000000000000000000016345785d8a0000",
                "value": 0,
                "type": 2
            },
            fetch2: {
                value: "returned fetch value",
                signed: true,
            } 
        }
        logs: "",
    }
  date: "2023-07-23T12:34:56.789Z"
<strong>}
</strong></code></pre>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.irrevocable.dev/errors-and-logs/logs-and-error-handling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
