The FILE_STORAGE route writes MQTT messages to local CSV or JSON files. It provides simple persistence for logging, backups, and data export without requiring a database server.
File storage is ideal for simple logging, local backups, and exporting data for offline analysis. Use it when you don’t need a full database but want persistent records.
DEFINE ROUTE DataLogger WITH TYPE FILE_STORAGE ADD FILE_STORAGE_CONFIG WITH STORAGE_DIR "/data/logs" WITH FORMAT "CSV" WITH FILE_PATTERN "{0}_{date}.csv" WITH APPEND "true" ADD EVENT LogSensorData WITH SOURCE_TOPIC "sensors/#" WITH QUERY "CLEAN:{table: sensor_data, data: {value.json}}"
DEFINE ROUTE CSVLogger WITH TYPE FILE_STORAGE ADD FILE_STORAGE_CONFIG WITH STORAGE_DIR "/data/logs" WITH FORMAT "CSV" WITH FILE_PATTERN "{0}_{date}.csv" WITH APPEND "true" WITH CSV_DELIMITER "," WITH INCLUDE_TIMESTAMP "true" WITH MAX_RECORDS "10000" ADD EVENT LogSensorData WITH SOURCE_TOPIC "sensors/#" WITH DESTINATION_TOPIC "file/status" WITH QUERY "CLEAN:{table: sensor_data, data: {value.json}}"
Creates files like: sensor_data_2025-01-15.csv
Store events as JSON lines:
DEFINE ROUTE JSONLogger WITH TYPE FILE_STORAGE ADD FILE_STORAGE_CONFIG WITH STORAGE_DIR "/data/json" WITH FORMAT "JSON" WITH FILE_PATTERN "{0}.json" WITH APPEND "true" WITH INCLUDE_TIMESTAMP "true" WITH MAX_RECORDS "5000" ADD EVENT LogEvents WITH SOURCE_TOPIC "events/#" WITH DESTINATION_TOPIC "file/json/status" WITH QUERY "CLEAN:{table: events, data: {value.json}}"
Route to different files by data type:
DEFINE ROUTE MultiFileLogger WITH TYPE FILE_STORAGE ADD FILE_STORAGE_CONFIG WITH STORAGE_DIR "/data/logs" WITH FORMAT "CSV" WITH FILE_PATTERN "{0}_{date}.csv" WITH APPEND "true" WITH INCLUDE_TIMESTAMP "true" ADD EVENT LogTemperature WITH SOURCE_TOPIC "sensors/+/temperature" WITH QUERY "CLEAN:{table: temperature, data: {value.json}}" ADD EVENT LogPressure WITH SOURCE_TOPIC "sensors/+/pressure" WITH QUERY "CLEAN:{table: pressure, data: {value.json}}" ADD EVENT LogAlerts WITH SOURCE_TOPIC "alerts/#" WITH QUERY "CLEAN:{table: alerts, data: {value.json}}"
DEFINE ROUTE BackupStorage WITH TYPE FILE_STORAGE ADD FILE_STORAGE_CONFIG WITH STORAGE_DIR "/backup/mqtt" WITH FORMAT "JSON" WITH FILE_PATTERN "{0}_{date}.jsonl" WITH APPEND "true" WITH MAX_RECORDS "100000" WITH INCLUDE_TIMESTAMP "true" ADD EVENT BackupAll WITH SOURCE_TOPIC "#" WITH QUERY "CLEAN:{table: mqtt_backup, data: {value.json}}"
Alternative: STORE IN with Models — Instead of writing EVENT queries, you can bind a model directly to this route. Every PUBLISH MODEL call automatically inserts a row — no query needed:
DEFINE MODEL SensorReading ADD STRING "sensor_id" ADD DOUBLE "value" STORE IN "DataLogger" WITH TABLE "sensor_data"
EVENTs also support read queries to retrieve data from stored files. Publish a message to the event’s SOURCE_TOPIC, and the query result is published to DESTINATION_TOPIC. File Storage read queries use the CLEAN format with filter, sort, and limit instead of SQL:
DEFINE ROUTE DataLogger WITH TYPE FILE_STORAGE ADD FILE_STORAGE_CONFIG WITH STORAGE_DIR "/data/logs" WITH FORMAT "CSV" WITH FILE_PATTERN "{0}_{date}.csv" WITH APPEND "true" ADD EVENT GetLatestEntry WITH SOURCE_TOPIC "file/query/latest" WITH DESTINATION_TOPIC "file/result/latest" WITH QUERY "CLEAN:{table: sensor_data, filter: {\"sensor_id\": \"{payload}\"}, sort: {\"timestamp\": -1}, limit: 1}"
To trigger this query, publish the sensor ID to the source topic:
Topic: file/query/latestPayload: temp001
The matching record is published to file/result/latest, where your actions or external clients can consume it.