# Server Logs konfigurieren und Debugging

Der Log Level und die Formatierung von BFFH Logzeilen können über folgende Wege konfiguriert werden.

## Log Level per Umgebungsvariable

Über die Umgebungsvariable `BFFH_LOG=debug` - zum Beispiel eingebunden per [systemd Service](https://docs.fab-access.org/books/fabaccess-installation/page/server-anleitung-zum-selber-kompilieren#bkmrk-systemd-service-anle)

Unterstützte Level für `BFFH_LOG` sind:

<div id="bkmrk-trace-debug-warn-inf" itemscope="itemscope" itemtype="http://schema.org/Article" role="main"><div itemprop="articleBody"><div>- info
- <span style="color: rgb(241, 196, 15);">warn</span>
- <span style="color: rgb(224, 62, 45);">error</span>
- <span style="color: rgb(53, 152, 219);">debug</span>
- <span style="color: rgb(132, 63, 161);">trace</span>

</div></div></div>## Log Parameter in bffhd

Über `bffhd` Parameter kann das Kommando beliebig angepasst werden (und ebenso im [systemd Service](https://docs.fab-access.org/books/fabaccess-installation/page/server-anleitung-zum-selber-kompilieren#bkmrk-systemd-service-anle) verwendet werden):

### `--log-format`

Gültige Werte sind:

- `Full` (Standard)
- `Compact`
- `Pretty`

<p class="callout info">Die Groß- bzw. Kleinschreibung spielt hierbei keine Rolle!</p>

#### Full

```bash
2024-12-07T11:10:48.198579Z DEBUG bffh:tls: difluoroborane::tls: TLS secret logging is disabled. keylog=false
2024-12-07T11:10:48.198685Z DEBUG bffh:tls: difluoroborane::tls: reading certificates path=/etc/ssl/fablabchemnitz.de.cert.pem
2024-12-07T11:10:48.198959Z DEBUG bffh:tls: difluoroborane::tls: reading private key path=/etc/ssl/fablabchemnitz.de.privkey.pem
2024-12-07T11:10:48.199608Z DEBUG difluoroborane::actors::process: Process actor updating state name=actor-process-test cmd=/opt/fabinfra/actor-process-test.sh state=SendState(ArchivedState { inner: ArchivedMachineState { state: Free, previous: Some(ArchivedUserRef { id: "local_lab_admin" }) } })
2024-12-07T11:10:48.200451Z DEBUG difluoroborane::actors::process: Process actor updating state name=Tasmota_Mjolnir cmd=/opt/fabinfra/adapters/tasmota/main.py state=SendState(ArchivedState { inner: ArchivedMachineState { state: InUse(ArchivedUserRef { id: "local_lab_admin" }), previous: Some(ArchivedUserRef { id: "local_lab_admin" }) } })
2024-12-07T11:10:48.203817Z  INFO bffh:binding API listen sockets: difluoroborane::capnp: Opened listen socket on 127.0.0.1:5961
2024-12-07T11:10:48.204079Z  INFO bffh:binding API listen sockets: difluoroborane::capnp: Opened listen socket on 192.168.1.192:5961
```

#### Compact

<p class="callout info">Das kompakte Layout ist identisch zu Full</p>

```bash
2024-12-07T11:10:48.198579Z DEBUG bffh:tls: difluoroborane::tls: TLS secret logging is disabled. keylog=false
2024-12-07T11:10:48.198685Z DEBUG bffh:tls: difluoroborane::tls: reading certificates path=/etc/ssl/fablabchemnitz.de.cert.pem
2024-12-07T11:10:48.198959Z DEBUG bffh:tls: difluoroborane::tls: reading private key path=/etc/ssl/fablabchemnitz.de.privkey.pem
2024-12-07T11:10:48.199608Z DEBUG difluoroborane::actors::process: Process actor updating state name=actor-process-test cmd=/opt/fabinfra/actor-process-test.sh state=SendState(ArchivedState { inner: ArchivedMachineState { state: Free, previous: Some(ArchivedUserRef { id: "local_lab_admin" }) } })
2024-12-07T11:10:48.200451Z DEBUG difluoroborane::actors::process: Process actor updating state name=Tasmota_Mjolnir cmd=/opt/fabinfra/adapters/tasmota/main.py state=SendState(ArchivedState { inner: ArchivedMachineState { state: InUse(ArchivedUserRef { id: "local_lab_admin" }), previous: Some(ArchivedUserRef { id: "local_lab_admin" }) } })
2024-12-07T11:10:48.203817Z  INFO bffh:binding API listen sockets: difluoroborane::capnp: Opened listen socket on 127.0.0.1:5961
2024-12-07T11:10:48.204079Z  INFO bffh:binding API listen sockets: difluoroborane::capnp: Opened listen socket on 192.168.1.192:5961
```

#### Pretty

```bash
  2024-12-07T11:09:18.093419Z DEBUG difluoroborane::tls: reading certificates, path: /etc/ssl/fablabchemnitz.de.cert.pem
    at bffhd/tls.rs:113
    in difluoroborane::tls::tls
    in bffh::bffh

  2024-12-07T11:09:18.093835Z DEBUG difluoroborane::tls: reading private key, path: /etc/ssl/fablabchemnitz.de.privkey.pem
    at bffhd/tls.rs:123
    in difluoroborane::tls::tls
    in bffh::bffh

  2024-12-07T11:09:18.097839Z  INFO difluoroborane::capnp: Opened listen socket on 127.0.0.1:5961
    at bffhd/capnp/mod.rs:99
    in difluoroborane::capnp::binding API listen sockets
    in bffh::bffh

  2024-12-07T11:09:18.098140Z  INFO difluoroborane::capnp: Opened listen socket on 192.168.1.192:5961
    at bffhd/capnp/mod.rs:99
    in difluoroborane::capnp::binding API listen sockets
    in bffh::bffh
```

### `--log-level`  


Die Level sind die gleichen wie `BFFH_LOG`

Siehe auch [Cheat Sheet - Wichtigste Befehle (Übersicht)](https://docs.fab-access.org/books/fabaccess-konfiguration/page/cheat-sheet-wichtigste-befehle-ubersicht "Cheat Sheet - Wichtigste Befehle (Übersicht)")

<p class="callout warning">Hinweis. Der `--log-level` Parameter funktioniert auf einer normalen Kommandozeilenausgabe derzeit nicht. Details finden sich in [https://gitlab.com/fabinfra/fabaccess/bffh/-/issues/83](https://gitlab.com/fabinfra/fabaccess/bffh/-/issues/83). Als Workaround empfehlen wir die Verwendung der Umgebungsvariable `BFFH_LOG`.</p>

### `--verbose` (`-v`)

Dieser Parameter kann bis zu drei mal als Argument angegeben werden und erhöht die Log-Ausgabe zusätzlich. Beispiel:

```bash
/usr/bin/bffhd --config /etc/bffh/bffh.dhall --verbose --verbose --verbose
```

oder

```bash
/usr/bin/bffhd --config /etc/bffh/bffh.dhall -vvv
```

### `--tls-key-log`

Dieser Parameter wird nur für Entwickler benötigt. Wenn für Debug Zwecke der Inhalt der verschlüsselten Verbindungen eingesehen werden soll, werden in der angegeben Datei `<PATH> `die Schlüssel für jede Verbindung gespeichert und können z.B. von [Wireshark](https://www.wireshark.org/about.html) geladen werden.

## Log File schreiben

<div id="bkmrk-wer-bffhd-nicht-%C3%BCber" itemscope="itemscope" itemtype="http://schema.org/Article" role="main"><div itemprop="articleBody"><div>Wer `bffhd` nicht über systemd startet und deshalb auch keine Logs mit journalctl auslesen möchte, der kann den Output auch konventiell in eine Log-Datei schreiben - hier im Beispiel `bffh.log`. Wir fangen dabei die Output-Streams `stdout` und `stderr` gemeinsam in einem Ausgabestrom ab (`2>&1`). Den Parameter `--log-level` verwenden wir nicht, da er bei der normalen Systemausgabe ignoriert wird (siehe [Issue #83](https://gitlab.com/fabinfra/fabaccess/bffh/-/issues/83)) und führen stattdessen mit `BFFH_LOG` an:  
</div><div>  
</div></div></div>```bash
BFFH_LOG=debug /usr/bin/bffhd --config /etc/bffh/bffh.dhall --log-format Pretty > bffh.log 2>&1
```

## Erweitertes Logging

Für Entwickler gibt es verschiedene Möglichkeiten aus der Laufzeit ein detaillierteres Fehlerbild zu erzeugen, über die Umgebungsvariable `RUST_BACKTRACE` zum Beispiel:

```bash
RUST_BACKTRACE=1 /usr/bin/bffhd
```

... oder ...

```bash
RUST_BACKTRACE=full /usr/bin/bffhd
```

## Audit Log

Der Audit Log ist das Log File, was `bffhd` schreibt und in `bffh.dhall` konfiguriert wird. Es gibt Aufschluss über "Wer hat wann welche Ressource genutzt oder zurückgegeben?". Details finden sich in [Audit Log (Revisionsprotokoll)](https://docs.fab-access.org/books/was-ist-fabaccess-grundkonzepte/page/audit-log-revisionsprotokoll "Audit Log (Revisionsprotokoll)"). Es ist also kein Programmlog im eigentliche Sinne. Jedoch zeigt es auch die eventuell letzten Lebenszeichen des Servers an.

## Debugging

Wer nicht nur Logs möchte, sondern debuggen will, der benötigt die Laufzeit inklusive Debug Symbolen. Im Falle der Installation mit [\*.deb oder \*.rpm](https://docs.fab-access.org/books/fabaccess-installation/page/server-installation-mit-distributionspaketen-deb-rpm "Server - Installation mit Distributionspaketen (*:deb, *.rpm)") Paketen gibt es dafür gesonderte Pakete. Alternativ kann BFFH auch mit `cargo` [kompiliert](https://docs.fab-access.org/books/fabaccess-installation/page/server-anleitung-zum-selber-kompilieren "Server - Anleitung zum selber kompilieren") werden. Letzteres erlaubt das Beeinflussen des Builds mit entsprechenden Parametern. Siehe [BFFH testen / entwickeln](https://docs.fab-access.org/books/fabaccess-installation/page/server-anleitung-zum-selber-kompilieren#bkmrk-bffh-testen).

### Hilfreiche Debugging Tools

- `strace` - ein in Linux-Distros standardmäßig eingebautes Kommando
- `gdb` - [GNU Debugger](https://wiki.ubuntuusers.de/GDB/)
- `<a href="https://wiki.ubuntuusers.de/Archiv/Valgrind/">valgrind</a>` - [https://valgrind.org](https://valgrind.org)

### Versionsinformationen anzeigen

Welche BFFH Version läuft, bzw. ist installiert? Un mit welchem Branch, Commit ID und Rustumgebung wurde `bffhd` gebaut? Siehe hier: [Version anzeigen](https://docs.fab-access.org/books/fabaccess-konfiguration/page/cheat-sheet-wichtigste-befehle-ubersicht#bkmrk-version-anzeigen-%28-v)

### Bugs melden

Bugs können zum einen in den [Community Kanälen](https://docs.fab-access.org/books/mitmachen-unterstutzen-join-the-community/page/werde-teil-der-fabinfra-community#bkmrk-digitale-kontaktm%C3%B6gl "Community / Übersicht & Join us!") besprochen werden und/oder [auf GitLab gemeldet](https://docs.fab-access.org/books/mitmachen-unterstutzen-join-the-community/page/werde-teil-der-fabinfra-community#bkmrk-gitlab) werden.

<div id="bkmrk--1" itemscope="itemscope" itemtype="http://schema.org/Article" role="main"><div itemprop="articleBody"><div id="bkmrk-trace-debug-warn-inf-1"></div></div></div>