Here’s a basic Alloy/Loki configuration for parsing Home Assistant logs to put in config.alloy
:
////////
// Home Assistant Logs
////////
// Only fetch logs from specific container named `home-assistant`
discovery.docker "homeassistant" {
host = "unix:///var/run/docker.sock"
filter {
name = "name"
values = [
"home-assistant",
]
}
}
// Some basic relabelling
discovery.relabel "logs_integrations_homeassistant" {
targets = discovery.docker.homeassistant.targets
rule {
target_label = "job"
replacement = "integrations/homeassistant"
}
rule {
target_label = "instance"
replacement = constants.hostname
}
rule {
source_labels = ["__meta_docker_container_name"]
regex = "/(.*)"
target_label = "container"
}
rule {
source_labels = ["__meta_docker_container_log_stream"]
target_label = "stream"
}
}
// Log processing
loki.process "homeassistant" {
// You Loki instance
forward_to = [loki.write.default.receiver]
// Define the start of multiline logs
stage.multiline {
firstline = "^.*(?<date>\\d{4}-\\d{2}-\\d{2}) (?<time>\\d{2}:\\d{2}:\\d{2}.\\d{3}) (?<loglevel>[A-Z]+) \\((?<thread>.*)\\) \\[(?<integration>[\\w\\.]+)\\] (?<message>.*)"
max_wait_time = "3s"
max_lines = 128
}
// Parsing
stage.regex {
expression = "(?s)^.*(?<date>\\d{4}-\\d{2}-\\d{2}) (?<time>\\d{2}:\\d{2}:\\d{2}.\\d{3}) (?<loglevel>[A-Z]+) \\((?<thread>.*)\\) \\[(?<integration>[\\w\\.]+)\\] (?<message>.*)"
}
// Convert loglevel to lowercase
stage.replace {
expression = "(?s)^.*\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d{3} (?<loglevel>[A-Z]+) \\(.*\\) \\[[\\w\\.]+\\] .*"
replace = "{{ .Value | ToLower }}"
}
// Assign parsed values to label
stage.labels {
values = {
level = "loglevel",
component = "component",
integration = "integration",
thread = "thread",
message = "message",
date = "date",
time = "time",
}
}
}
// Push docker logs to Loki
loki.source.docker "homeassistant" {
host = "unix:///var/run/docker.sock"
targets = discovery.docker.homeassistant.targets
labels = {"platform" = "docker"}
relabel_rules = discovery.relabel.logs_integrations_homeassistant.rules
forward_to = [loki.process.homeassistant.receiver]
}