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
Datei | Rolle | Beschreibung |
---|---|---|
Global.lua | Konfiguration | Globale Werte und (Logging-)Funktionen |
src0.lua | Hauptprogramm | Roboteraktionen 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
Parameter | Typ | Beispielwert | Bedeutung |
---|---|---|---|
ROBOT_ID | string | "MG400_001" | Eindeutige Kennung des Roboters – nützlich, wenn mehrere Roboter im Einsatz sind. Wird in jedem Logeintrag mitgeschrieben. |
LOG_PATH | string | "/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_FILES | number | 10 | Maximale Anzahl an Logdateien, die im Ordner behalten werden. Ältere Dateien werden automatisch gelöscht (Logrotation). |
LOG_FILE | string | "robot_log.txt" | Baut den Pfad zur Log-Datei |
LOCK_FILE | string | ".lock" | Baut den Pfad zur Log-Lock-Datei |
MAX_WAIT_MS | number | 1000 | Gibt 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
Mehr zu den Möglichkeiten mit Lua in DobotStudio Pro erfahren Sie in unserem Kurs: Dobot Lua – Schulung | Roboter programmieren mit Lua