Skip to content

Logs

Logs are a very powerful way to track the execution of your automation and collect metrics.

The logs are available for visualization and download via the Execution Log menu.

Logs

When selecting a log to view, you can filter by date and immediately download a CSV, JSON, or Excel file of your data.

Logs List

Create log using the BotCity Maestro

Through the BotCity Maestro interface, you can create and manipulate custom logs for each of your needs.

Clicking on the New Log button will take you to the Log creation screen where you can define the Log label, which is the unique ID to be used when interacting with this Log via the BotCity Maestro SDK or API as well as the columns.

New Log

You can create as many logs as you desire to better organize your data and automation management.

How to create a log entry using the Maestro SDK

You can easily create a new log entry using the Maestro SDK in your automation code.

Warning

To be able to create a new log entry via code, the log structure must be already created in Maestro.

Installation

If you don't have the dependency installed yet, just follow these instructions:

pip install botcity-maestro-sdk

Important

In addition to installing, remember to include the dependency in the bot's requirements.txt file.

<repositories>
    <repository>
        <id>nexus-botcity-public</id>
        <url>https://devtools.botcity.dev:8081/repository/botcity-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

<dependencies>
    <!-- Your other dependencies -->
    <dependency>
        <groupId>dev.botcity</groupId>
        <artifactId>maestro-sdk</artifactId>
        <version>2.0.3</version>
    </dependency>
</dependencies>
npm i @botcity/botcity-maestro-sdk
npm i @botcity/botcity-maestro-sdk

Importing the SDK

After installation, import the dependency and instantiate the Maestro SDK:

# Import for integration with BotCity Maestro SDK
from botcity.maestro import *

# Disable errors if we are not connected to Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

# Instantiating the Maestro SDK
maestro = BotMaestroSDK.from_sys_args()
# Fetching the details of the current task being executed
execution = maestro.get_execution()
// Import for integration with BotCity Maestro SDK
import dev.botcity.maestro_sdk.*;
...

public void action(BotExecution botExecution) {

    try {
        // Instantiating the Maestro SDK
        BotMaestroSDK maestro = new BotMaestroSDK();
        maestro.login(botExecution);
    ...
// Import for integration with BotCity Maestro SDK
const { BotMaestroSdk } = require('@botcity/botcity-maestro-sdk')

// Getting parameters passed by Runner
const args = process.argv.slice(2)
const [server, taskid, token] = args

// Login with information from the Dev. Environment page
const maestro = new BotMaestroSdk()
maestro.login("YOUR_SERVER_HERE", "YOUR_USER_HERE", "YOUR_KEY_HERE")

// Fetching the details of the current task being executed
const executionTask = await maestro.getTask(taskid)
// Import for integration with BotCity Maestro SDK
import { BotMaestroSdk } from '@botcity/botcity-maestro-sdk'

// Getting parameters passed by Runner
const args = process.argv.slice(2)
const [server, taskid, token] = args

// Login with information from the Dev. Environment page
const maestro: BotMaestroSdk = new BotMaestroSdk()
maestro.login("YOUR_SERVER_HERE", "YOUR_USER_HERE", "YOUR_KEY_HERE")

// Fetching the details of the current task being executed
const executionTask: Task = await maestro.getTask(taskid)

Creating a new log entry

# Importing datetime library to define the timestamp of the execution
import datetime
# Creating a new log entry in the BotCity Maestro
maestro.new_log_entry(
    activity_label="logLabel",
    values = {
        "timestamp": datetime.datetime.now().strftime("%Y-%m-%d_%H-%M"),
        "records": "10",
        "status": "SUCCESS"
    }
)
// Defining the day and time of execution
String timestamp = new SimpleDateFormat("yyyy-MM-dd_HH-mm").format(new java.util.Date());

// Creating a new log entry in the BotCity Maestro
Map<String,Object> values = new HashMap<String,Object>();
values.put("timestamp", timestamp);
values.put("records", "10");
values.put("status", "SUCCESS");

maestro.newLogEntry("logLabel", values);
// Creating a new log entry in the BotCity Maestro
await maestro.logEntry(
    "logLabel",
    {
        timestamp: new Date().toISOString(),
        records: "10",
        status: "SUCCESS"
    }
)   
// Creating a new log entry in the BotCity Maestro
await maestro.logEntry(
    "logLabel",
    {
        timestamp: new Date().toISOString(),
        records: "10",
        status: "SUCCESS"
    }
)

Complete code

from botcity.core import DesktopBot
from botcity.maestro import *

# Importing datetime library to define the timestamp of the execution
import datetime

# Disable errors if we are not connected to Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

def main():
    maestro = BotMaestroSDK.from_sys_args()
    execution = maestro.get_execution()

    # Creating a new log entry in the BotCity Maestro
    maestro.new_log_entry(
        activity_label="ResultsLog",
        values = {
            "timestamp": datetime.datetime.now().strftime("%Y-%m-%d_%H-%M"),
            "records": "10",
            "status": "SUCCESS"
        }
    )

    bot = DesktopBot()
    # Implement here your logic...
    ...

def not_found(label):
    print(f"Element not found: {label}")

if __name__ == '__main__':
    main()
import dev.botcity.framework.bot.DesktopBot;
import dev.botcity.maestro_sdk.BotExecutor;
import dev.botcity.maestro_sdk.BotMaestroSDK;
import dev.botcity.maestro_sdk.model.AlertType;
import dev.botcity.maestro_sdk.runner.BotExecution;
import dev.botcity.maestro_sdk.runner.RunnableAgent;

public class FirstBot extends DesktopBot implements RunnableAgent
{
    public FirstBot() {
        try {
            setResourceClassLoader(this.getClass().getClassLoader());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void action(BotExecution botExecution) {

        try {
            BotMaestroSDK maestro = new BotMaestroSDK();
            maestro.login(botExecution);

            // Defining the day and time of execution
            String timestamp = new SimpleDateFormat("yyyy-MM-dd_HH-mm").format(new java.util.Date());

            // Creating a new log entry in the BotCity Maestro
            Map<String,Object> values = new HashMap<String,Object>();
            values.put("timestamp", timestamp);
            values.put("records", "10");
            values.put("status", "SUCCESS");

            maestro.newLogEntry("ResultsLog", values);

            // Implement here your logic...
            ...

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private void notFound(String label) {
        System.out.println("Element not found: "+label);
    }

    public static void main(String[] args) {
        BotExecutor.run(new FirstBot(), args);
    }
}
const main = async () => {
    const { BotMaestroSdk } = require('@botcity/botcity-maestro-sdk')

    const args = process.argv.slice(2)
    const [server, taskid, token] = args

    const maestro = new BotMaestroSdk()
    maestro.login("YOUR_SERVER_HERE", "YOUR_USER_HERE", "YOUR_KEY_HERE")

    const executionTask = await maestro.getTask(taskid)

    // Creating a new log entry in the BotCity Maestro
    await maestro.logEntry(
        "ResultsLog",
        {
            timestamp: new Date().toISOString(),
            records: "10",
            status: "SUCCESS"
        }
    )   
}

main()
const main = async () => {
    import { BotMaestroSdk } from '@botcity/botcity-maestro-sdk'

    const args = process.argv.slice(2)
    const [server, taskid, token] = args

    const maestro: BotMaestroSdk = new BotMaestroSdk()
    maestro.login("YOUR_SERVER_HERE", "YOUR_USER_HERE", "YOUR_KEY_HERE")

    const executionTask: Task = await maestro.getTask(taskid)

    // Creating a new log entry in the BotCity Maestro
    await maestro.logEntry(
        "ResultsLog",
        {
            timestamp: new Date().toISOString(),
            records: "10",
            status: "SUCCESS"
        }
    )
}

main()

Tip

Look at the other operations we can do with logs using the BotCity Maestro SDK and BotCity Maestro API.