<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Grafana-Alloy on Citizix, The Best blog for Linux, Opensource, Devops, Cloud and all things awesome tech.</title><link>https://citizix.com/tags/grafana-alloy/</link><description>Recent content in Grafana-Alloy on Citizix, The Best blog for Linux, Opensource, Devops, Cloud and all things awesome tech.</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Citizix, Ltd.</copyright><lastBuildDate>Mon, 02 Nov 2026 15:04:43 +0300</lastBuildDate><atom:link href="https://citizix.com/tags/grafana-alloy/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Ship Logs to Loki With Grafana Alloy on Debian 12/13</title><link>https://citizix.com/how-to-ship-logs-to-loki-with-grafana-alloy-on-debian/</link><pubDate>Mon, 02 Nov 2026 11:52:06 +0000</pubDate><guid>https://citizix.com/how-to-ship-logs-to-loki-with-grafana-alloy-on-debian/</guid><description>&lt;p&gt;&lt;strong&gt;Grafana Alloy&lt;/strong&gt; is the agent Grafana Labs now recommends for shipping logs to &lt;strong&gt;Grafana Loki&lt;/strong&gt;. It replaces Promtail, which reached end of life on March 2, 2026 and no longer receives updates or security fixes. In this guide you will install Loki, Grafana and Alloy on &lt;strong&gt;Debian 12 (bookworm) or Debian 13 (trixie)&lt;/strong&gt; from the official Grafana APT repository, ship both plain log files under &lt;code&gt;/var/log&lt;/code&gt; and the &lt;strong&gt;systemd journal&lt;/strong&gt; to Loki, and query them in Grafana. If you already run Promtail, the last section shows how to convert its config to Alloy in one command.&lt;/p&gt;&#10;&lt;p&gt;The versions used here are Loki 3.7, Alloy 1.21 and Grafana 13. The APT repository always installs the latest release, so check your version numbers against the &lt;a class="link" href="https://grafana.com/docs/loki/latest/" target="_blank" rel="noopener"&#10; &gt;Loki&lt;/a&gt; and &lt;a class="link" href="https://grafana.com/docs/alloy/latest/" target="_blank" rel="noopener"&#10; &gt;Alloy&lt;/a&gt; docs if your output looks different.&lt;/p&gt;&#10;&lt;h2 id="how-the-pieces-fit-together"&gt;How the pieces fit together&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Loki&lt;/strong&gt; stores logs. It indexes only a small set of labels per log stream (such as &lt;code&gt;job&lt;/code&gt;, &lt;code&gt;host&lt;/code&gt;, &lt;code&gt;unit&lt;/code&gt;), not the log text, which keeps it cheap to run.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Alloy&lt;/strong&gt; runs on every machine you want logs from. It finds log sources, attaches labels, and pushes the lines to Loki&amp;rsquo;s HTTP API.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Grafana&lt;/strong&gt; is the UI. You add Loki as a data source and query logs with LogQL.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;In this guide all three run on one Debian server. To collect logs from more servers, install only Alloy on each of them and point it at the Loki server.&lt;/p&gt;&#10;&lt;h2 id="prerequisites"&gt;Prerequisites&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;A Debian 12 or 13 server with &lt;code&gt;sudo&lt;/code&gt; access.&lt;/li&gt;&#10;&lt;li&gt;Ports &lt;code&gt;3000&lt;/code&gt; (Grafana) and &lt;code&gt;3100&lt;/code&gt; (Loki) reachable where needed. Loki has no authentication in this setup, so do not expose port &lt;code&gt;3100&lt;/code&gt; to the internet.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Update the system first:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-1-add-the-grafana-apt-repository"&gt;Step 1: Add the Grafana APT repository&#10;&lt;/h2&gt;&lt;p&gt;Loki, Alloy and Grafana are all published to the same repository at &lt;code&gt;apt.grafana.com&lt;/code&gt;. Add its signing key and source list:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y wget&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /etc/apt/keyrings&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo wget -O /etc/apt/keyrings/grafana.asc https://apt.grafana.com/gpg-full.key&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;644&lt;/span&gt; /etc/apt/keyrings/grafana.asc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/grafana.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;signed-by=&lt;/code&gt; option ties the key to this one repository. Older guides use &lt;code&gt;apt-key add&lt;/code&gt;, which is deprecated and has been removed from current APT.&lt;/p&gt;&#10;&lt;h2 id="step-2-install-and-configure-loki"&gt;Step 2: Install and configure Loki&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y loki&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The package creates a &lt;code&gt;loki&lt;/code&gt; system user, installs a systemd unit, and writes a default config to &lt;code&gt;/etc/loki/config.yml&lt;/code&gt;. That default stores data under &lt;code&gt;/tmp/loki&lt;/code&gt;, which is wiped on reboot, so replace it with a config that keeps data under &lt;code&gt;/var/lib/loki&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /var/lib/loki&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R loki: /var/lib/loki&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/loki/config.yml &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;auth_enabled: false&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;server:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; http_listen_port: 3100&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; grpc_listen_port: 9096&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;common:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; instance_addr: 127.0.0.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; path_prefix: /var/lib/loki&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; storage:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; filesystem:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; chunks_directory: /var/lib/loki/chunks&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; rules_directory: /var/lib/loki/rules&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; replication_factor: 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ring:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; kvstore:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; store: inmemory&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;schema_config:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; configs:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - from: 2024-04-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; store: tsdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; object_store: filesystem&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; schema: v13&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; index:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; prefix: index_&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; period: 24h&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;limits_config:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; retention_period: 744h&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;compactor:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; working_directory: /var/lib/loki/compactor&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; retention_enabled: true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; delete_request_store: filesystem&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;analytics:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reporting_enabled: false&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A few notes on this config:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;store: tsdb&lt;/code&gt; with &lt;code&gt;schema: v13&lt;/code&gt; is the schema Loki 3.x expects. The older &lt;code&gt;boltdb-shipper&lt;/code&gt; and &lt;code&gt;v11&lt;/code&gt;/&lt;code&gt;v12&lt;/code&gt; schemas you will see in older guides still load, but they do not support newer features such as structured metadata.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;retention_period: 744h&lt;/code&gt; (31 days) plus &lt;code&gt;retention_enabled: true&lt;/code&gt; on the compactor makes Loki delete logs older than a month. Without it Loki keeps everything forever and the disk fills up.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;analytics.reporting_enabled: false&lt;/code&gt; turns off the anonymous usage report Loki sends to Grafana Labs by default.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Check the config, then restart Loki and enable it at boot:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u loki loki -config.file&lt;span class="o"&gt;=&lt;/span&gt;/etc/loki/config.yml -verify-config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart loki&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; loki&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first command should print &lt;code&gt;msg=&amp;quot;config is valid&amp;quot;&lt;/code&gt;. Loki takes about 15 seconds to become ready after it starts:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s http://127.0.0.1:3100/ready&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ready&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-3-install-grafana"&gt;Step 3: Install Grafana&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y grafana&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now grafana-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Grafana listens on port &lt;code&gt;3000&lt;/code&gt;. If you use &lt;code&gt;ufw&lt;/code&gt;, allow it:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw allow 3000/tcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Open &lt;code&gt;http://&amp;lt;server-ip&amp;gt;:3000&lt;/code&gt; and log in with &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;. Grafana asks you to change the password on first login.&lt;/p&gt;&#10;&lt;h2 id="step-4-install-grafana-alloy"&gt;Step 4: Install Grafana Alloy&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y alloy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The package:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;creates an &lt;code&gt;alloy&lt;/code&gt; system user and adds it to the &lt;code&gt;adm&lt;/code&gt; and &lt;code&gt;systemd-journal&lt;/code&gt; groups, so it can read &lt;code&gt;/var/log/*.log&lt;/code&gt; and the journal without running as root;&lt;/li&gt;&#10;&lt;li&gt;installs a systemd unit that reads its config from &lt;code&gt;/etc/alloy/config.alloy&lt;/code&gt;, and extra flags from &lt;code&gt;/etc/default/alloy&lt;/code&gt;;&lt;/li&gt;&#10;&lt;li&gt;keeps its state (such as how far it has read each file) in &lt;code&gt;/var/lib/alloy/data&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="step-5-configure-alloy-to-ship-logs"&gt;Step 5: Configure Alloy to ship logs&#10;&lt;/h2&gt;&lt;p&gt;Alloy configs are written in Alloy&amp;rsquo;s own syntax: a set of named &lt;strong&gt;components&lt;/strong&gt;, each wired to the next. The config below has three parts:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;local.file_match&lt;/code&gt; + &lt;code&gt;loki.source.file&lt;/code&gt; tail every &lt;code&gt;*.log&lt;/code&gt; file under &lt;code&gt;/var/log&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;loki.source.journal&lt;/code&gt; reads the systemd journal. &lt;code&gt;loki.relabel&lt;/code&gt; keeps the systemd unit and the log priority as labels, because Alloy drops the raw &lt;code&gt;__journal_*&lt;/code&gt; fields otherwise.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;loki.write&lt;/code&gt; sends everything to Loki.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Replace the sample config the package installs:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/alloy/config.alloy &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;// Ship plain-text log files under /var/log&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;local.file_match &amp;#34;varlogs&amp;#34; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; path_targets = [{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; __path__ = &amp;#34;/var/log/*.log&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; job = &amp;#34;varlogs&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; host = constants.hostname,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;loki.source.file &amp;#34;varlogs&amp;#34; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; targets = local.file_match.varlogs.targets&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; forward_to = [loki.write.local.receiver]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;// Ship the systemd journal, keeping the unit name as a label&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;loki.relabel &amp;#34;journal&amp;#34; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; forward_to = []&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; rule {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; source_labels = [&amp;#34;__journal__systemd_unit&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; target_label = &amp;#34;unit&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; rule {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; source_labels = [&amp;#34;__journal_priority_keyword&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; target_label = &amp;#34;level&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;loki.source.journal &amp;#34;read&amp;#34; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; max_age = &amp;#34;12h&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; relabel_rules = loki.relabel.journal.rules&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; labels = {job = &amp;#34;systemd-journal&amp;#34;, host = constants.hostname}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; forward_to = [loki.write.local.receiver]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;// Where the logs go&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;loki.write &amp;#34;local&amp;#34; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; endpoint {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; url = &amp;#34;http://127.0.0.1:3100/loki/api/v1/push&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check the syntax, then restart Alloy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo alloy fmt /etc/alloy/config.alloy &amp;gt; /dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;config OK&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart alloy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; alloy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status alloy --no-pager&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;alloy fmt&lt;/code&gt; needs &lt;code&gt;sudo&lt;/code&gt; because &lt;code&gt;/etc/alloy&lt;/code&gt; is only readable by root and the &lt;code&gt;alloy&lt;/code&gt; group. It exits non-zero and prints the line number if the config has a syntax error. After later edits you can apply changes without a restart with &lt;code&gt;sudo systemctl reload alloy&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;On a remote server, change the &lt;code&gt;loki.write&lt;/code&gt; URL to your Loki server, for example &lt;code&gt;http://10.0.0.5:3100/loki/api/v1/push&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h3 id="optional-open-the-alloy-ui"&gt;Optional: open the Alloy UI&#10;&lt;/h3&gt;&lt;p&gt;Alloy has a built-in web UI on port &lt;code&gt;12345&lt;/code&gt; that shows every component, its health, and the data flowing between them. It only listens on &lt;code&gt;127.0.0.1&lt;/code&gt; by default. To reach it from another machine, set &lt;code&gt;CUSTOM_ARGS&lt;/code&gt; in &lt;code&gt;/etc/default/alloy&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CUSTOM_ARGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;--server.http.listen-addr=0.0.0.0:12345&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then restart Alloy with &lt;code&gt;sudo systemctl restart alloy&lt;/code&gt; and open &lt;code&gt;http://&amp;lt;server-ip&amp;gt;:12345&lt;/code&gt;. Restrict the port with a firewall: the UI has no login.&lt;/p&gt;&#10;&lt;h2 id="step-6-add-loki-to-grafana-and-query-your-logs"&gt;Step 6: Add Loki to Grafana and query your logs&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;In Grafana, go to &lt;strong&gt;Connections&lt;/strong&gt; → &lt;strong&gt;Data sources&lt;/strong&gt; → &lt;strong&gt;Add data source&lt;/strong&gt; and pick &lt;strong&gt;Loki&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set the URL to &lt;code&gt;http://127.0.0.1:3100&lt;/code&gt; (Loki runs on the same host, over plain HTTP).&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Save &amp;amp; test&lt;/strong&gt;. Grafana should report that it connected to Loki.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Go to &lt;strong&gt;Explore&lt;/strong&gt;, pick the Loki data source, switch the query editor to &lt;strong&gt;Code&lt;/strong&gt;, and try these LogQL queries:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{job=&amp;#34;varlogs&amp;#34;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{job=&amp;#34;systemd-journal&amp;#34;, unit=&amp;#34;ssh.service&amp;#34;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{job=&amp;#34;systemd-journal&amp;#34;, level=&amp;#34;error&amp;#34;} |= &amp;#34;failed&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first shows lines from &lt;code&gt;/var/log/*.log&lt;/code&gt;, the second shows SSH daemon logs from the journal, and the third shows journal errors containing the word &amp;ldquo;failed&amp;rdquo;. To check from the shell instead, query Loki&amp;rsquo;s API directly:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sG http://127.0.0.1:3100/loki/api/v1/query_range &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --data-urlencode &lt;span class="s1"&gt;&amp;#39;query={job=&amp;#34;varlogs&amp;#34;}&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --data-urlencode &lt;span class="s1"&gt;&amp;#39;limit=5&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="migrating-from-promtail"&gt;Migrating from Promtail&#10;&lt;/h2&gt;&lt;p&gt;If a server already runs Promtail, Alloy can convert its config for you:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo alloy convert --source-format&lt;span class="o"&gt;=&lt;/span&gt;promtail &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output&lt;span class="o"&gt;=&lt;/span&gt;/etc/alloy/config.alloy /etc/promtail/config.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For a simple Promtail config that tails &lt;code&gt;/var/log/*log&lt;/code&gt;, the output looks like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;loki.source.file &amp;#34;system&amp;#34; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;targets = [{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;__address__ = &amp;#34;localhost&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;__path__ = &amp;#34;/var/log/*log&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;job = &amp;#34;varlogs&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;}]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;forward_to = [loki.write.default.receiver]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;file_match {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;enabled = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;legacy_positions_file = &amp;#34;/data/promtail/positions.yaml&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;loki.write &amp;#34;default&amp;#34; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;endpoint {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;url = &amp;#34;http://127.0.0.1:3100/loki/api/v1/push&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;external_labels = {}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;legacy_positions_file&lt;/code&gt; makes Alloy start from where Promtail stopped reading, so the switch does not ship duplicate lines. Review the output, then swap the services:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable --now promtail&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart alloy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Promtail&amp;rsquo;s own metrics have different names from Alloy&amp;rsquo;s, so update any dashboards or alerts that watched Promtail. See the &lt;a class="link" href="https://grafana.com/docs/alloy/latest/set-up/migrate/from-promtail/" target="_blank" rel="noopener"&#10; &gt;official Promtail migration guide&lt;/a&gt; for the conversion&amp;rsquo;s limits.&lt;/p&gt;&#10;&lt;h2 id="troubleshooting"&gt;Troubleshooting&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;No logs from a file:&lt;/strong&gt; the &lt;code&gt;alloy&lt;/code&gt; user must be able to read it. Files in &lt;code&gt;/var/log&lt;/code&gt; owned by &lt;code&gt;root:adm&lt;/code&gt; work out of the box; for other files, add &lt;code&gt;alloy&lt;/code&gt; to the owning group, or adjust permissions.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;No journal logs:&lt;/strong&gt; run &lt;code&gt;sudo journalctl -u alloy -n 50&lt;/code&gt; and look for permission errors from &lt;code&gt;loki.source.journal&lt;/code&gt;. The &lt;code&gt;alloy&lt;/code&gt; user needs to be in the &lt;code&gt;systemd-journal&lt;/code&gt; group (&lt;code&gt;id alloy&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;A flood of old logs on first start:&lt;/strong&gt; &lt;code&gt;max_age = &amp;quot;12h&amp;quot;&lt;/code&gt; on the journal source limits how far back Alloy reads the journal the first time it runs. Raise it if you want more history.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="conclusion"&gt;Conclusion&#10;&lt;/h2&gt;&lt;p&gt;You installed Loki, Grafana and Grafana Alloy from the Grafana APT repository on Debian, set Loki up with the current TSDB schema and a 31-day retention, and configured Alloy to ship both &lt;code&gt;/var/log&lt;/code&gt; files and the systemd journal. You also saw how to convert an existing Promtail config. To collect logs from more servers, install Alloy on each one with the same config and point &lt;code&gt;loki.write&lt;/code&gt; at this Loki server.&lt;/p&gt;&#10;&lt;h2 id="related-content"&gt;Related content&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://citizix.com/how-to-setup-promtail-grafana-and-loki-for-free-log-management-in-debian-11/" &gt;How to Setup Promtail, Grafana and Loki for Free Log Management in Debian 11/12&lt;/a&gt;: the Promtail version of this guide&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://citizix.com/how-to-export-kubernetes-logs-to-grafana-loki/" &gt;How to Export Kubernetes Logs to Grafana Loki with Helm&lt;/a&gt;: run Alloy as a DaemonSet in Kubernetes&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://citizix.com/how-to-run-grafana-loki-with-docker-and-docker-compose/" &gt;How to Run Grafana Loki with Docker and Docker Compose&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>