Skip to Content
Platforms
MobileLogs & Artifacts

Logs & Artifacts

After a test run completes, you can find logs and artifacts in the run details.

Device Log

The device log captures system-level output from the device during the test:

  • Android: Logcat output
  • iOS: Syslog output

This is useful for debugging app crashes, performance issues, or understanding what happened during a test.

Logs & Artifacts

Crash Log

If your app crashes during a test, a separate crash log is generated with the crash details. This includes stack traces and other diagnostic information.

Recording and screenshots

Each run is recorded to an mp4 file, which you can view or download from the artifacts. Additionally, the screenshots that the agent sees are also captured and packaged in screenshots.mp4, this allows you to view the run through the agent’s eyes.

Custom Artifacts

You can have your app write files that get automatically uploaded to the run artifacts. This is useful for:

  • Custom log files
  • Screenshots taken by your app
  • Debug data or state dumps
  • Any other files your app generates during testing

Android Setup

Write files to the nunu_artifacts folder in your app’s external app storage:

/storage/emulated/0/Android/data/<your.package.name>/files/nunu_artifacts/
val artifactsDir = File(getExternalFilesDir(null), "nunu_artifacts") artifactsDir.mkdirs() val logFile = File(artifactsDir, "custom_log.txt") logFile.writeText("Your log content")
File artifactsDir = new File(getExternalFilesDir(null), "nunu_artifacts"); artifactsDir.mkdirs(); File logFile = new File(artifactsDir, "custom_log.txt"); Files.writeString(logFile.toPath(), "Your log content");
import 'dart:io'; import 'package:path_provider/path_provider.dart'; final externalDir = await getExternalStorageDirectory(); if (externalDir != null) { final artifactsDir = Directory('${externalDir.path}/nunu_artifacts'); await artifactsDir.create(recursive: true); final logFile = File('${artifactsDir.path}/custom_log.txt'); await logFile.writeAsString('Your log content'); }
using System.IO; using UnityEngine; var artifactsDir = Path.Combine(Application.persistentDataPath, "nunu_artifacts"); Directory.CreateDirectory(artifactsDir); var logFile = Path.Combine(artifactsDir, "custom_log.txt"); File.WriteAllText(logFile, "Your log content");

iOS Setup

Write files to Documents/nunu_artifacts in your app sandbox.

let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let artifactsDir = documents.appendingPathComponent("nunu_artifacts", isDirectory: true) try? FileManager.default.createDirectory(at: artifactsDir, withIntermediateDirectories: true) let logFile = artifactsDir.appendingPathComponent("custom_log.txt") try? "Your log content".write(to: logFile, atomically: true, encoding: .utf8)
import 'dart:io'; import 'package:path_provider/path_provider.dart'; final documentsDir = await getApplicationDocumentsDirectory(); final artifactsDir = Directory('${documentsDir.path}/nunu_artifacts'); await artifactsDir.create(recursive: true); final logFile = File('${artifactsDir.path}/custom_log.txt'); await logFile.writeAsString('Your log content');
using System.IO; using UnityEngine; var artifactsDir = Path.Combine(Application.persistentDataPath, "nunu_artifacts"); Directory.CreateDirectory(artifactsDir); var logFile = Path.Combine(artifactsDir, "custom_log.txt"); File.WriteAllText(logFile, "Your log content");

For iOS artifact pulling to work, ensure these keys are set in your app Info.plist:

<key>UIFileSharingEnabled</key> <true/> <key>LSSupportsOpeningDocumentsInPlace</key> <true/>

What these keys do:

  • UIFileSharingEnabled: Enables file sharing for the app’s Documents directory (Finder/iTunes file sharing). This is what allows iOS document vending to work for custom artifact pulling.
  • LSSupportsOpeningDocumentsInPlace: Lets the system work with documents in-place instead of requiring copies.

If these keys are missing we won’t be able to see or pull the artifacts

How It Works

  • Artifacts are pulled after the test completes but before the device session ends
  • Files are collected once at the end of the test (not continuously synced)
  • Empty folders are skipped
  • If session cleanup fails early, artifacts may not be retrieved
  • Uploaded files from both Android and iOS appear under the nunu_artifacts/ folder in run artifacts

Subdirectories are supported and preserved.

Best Practices

  • Keep file sizes reasonable to avoid slow uploads
  • Use descriptive filenames to easily identify artifacts
  • Clear the folder between test runs if reusing the same device
Last updated on