Logging mit Dobot Lua

Robuste Protokollierung mit Lua

Für Qualitätssicherung, Fehleranalyse und nachvollziehbare Prozessdokumentation ist ein gutes Logging unverzichtbar. In diesem Beitrag zeigen wir, wie Sie mit Dobot Lua ein automatisches Logging-System bauen.

Projektstruktur in DobotStudio Pro

DateiRolleBeschreibung
Global.luaKonfigurationGlobale Werte und (Logging-)Funktionen
src0.luaHauptprogrammRoboteraktionen und Bewegungen

Global.lua

Neben den programmspezifischehn Konfigurationen benötigen wir in der Global.lua folgenden Code:

ROBOT_ID = "MG400_001"
LOG_PATH = "/mnt/sdcard/logs/"
MAX_LOG_FILES = 10
LOG_FILE = LOG_PATH .. "robot_log.txt"
LOCK_FILE = LOG_FILE .. ".lock"
MAX_WAIT_MS = 1000

-- Prüft, ob Datei existiert
function file_exists(path)
    local f = io.open(path, "r")
    if f then f:close() return true end
    return false
end

-- Initialisiert Logging: Verzeichnis, .lock entfernen, Rotation
function init_logging()
    os.execute("mkdir -p " .. LOG_PATH)

    -- Alte Lock-Dateien entfernen
    for file in io.popen('ls "' .. LOG_PATH .. '"'):lines() do
        if file:match("%.lock$") then
            os.remove(LOG_PATH .. file)
        end
    end

    -- Logrotation (maximale Anzahl Dateien)
    local files = {}
    for file in io.popen('ls -t "' .. LOG_PATH .. '"'):lines() do
        if not file:match("%.lock$") then
            table.insert(files, file)
        end
    end
    for i = MAX_LOG_FILES + 1, #files do
        os.remove(LOG_PATH .. files[i])
    end
end

-- Loggt eine Nachricht mit Lock-Datei zum Schutz vor parallelem Zugriff
function log(message)
    local waited = 0
    while file_exists(LOCK_FILE) and waited < MAX_WAIT_MS do
        Sleep(10)
        waited = waited + 10
    end

    if file_exists(LOCK_FILE) then
        print("WARNUNG: Logging blockiert durch Lock-Datei – Eintrag übersprungen.")
        return
    end

    -- Lock setzen
    local lock = io.open(LOCK_FILE, "w")
    if lock then lock:write("locked\n") lock:close() end

    -- Schreiben
    local timestamp = os.date("%Y-%m-%d %H:%M:%S")
    local f = io.open(LOG_FILE, "a")
    if f then
        f:write("[" .. timestamp .. "] " .. ROBOT_ID .. " - " .. message .. "\n")
        f:close()
    end

    -- Lock wieder entfernen
    os.remove(LOCK_FILE)
end

ParameterTypBeispielwertBedeutung
ROBOT_IDstring"MG400_001"Eindeutige Kennung des Roboters – nützlich, wenn mehrere Roboter im Einsatz sind. Wird in jedem Logeintrag mitgeschrieben.
LOG_PATHstring"/mnt/sdcard/logs/"Speicherort für die Logdateien. Muss vorhanden sein oder per Skript erstellt werden. Beachten Sie hierbei, dass der Speicherort, ausgehend vom Roboter (Linux) ist.
MAX_LOG_FILESnumber10Maximale Anzahl an Logdateien, die im Ordner behalten werden. Ältere Dateien werden automatisch gelöscht (Logrotation).
LOG_FILEstring"robot_log.txt"Baut den Pfad zur Log-Datei
LOCK_FILEstring".lock"Baut den Pfad zur Log-Lock-Datei
MAX_WAIT_MSnumber1000Gibt an, wie lange maximal versucht wird, zu warten, bis ein .lock entfernt wird.

src0.lua

-- Muss einmal mit Start des Programms aufgerufen werden
init_logging()

-- Logging kann nun an beliebiger stelle verwendet werden
log("Starte Robotersequenz")

Mehr davon