My Schedule - Nutzungsprotokoll: Unterschied zwischen den Versionen

Aus Asprova Hilfe
Wechseln zu: Navigation, Suche
(Konfiguration)
 
(11 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 8: Zeile 8:
  
 
== Konfiguration ==
 
== Konfiguration ==
Standardmäßig ist die Protokollierung deaktiviert. Über die <code>config.json</code> können Sie die Protokollierung aktivieren und steuern.
+
Standardmäßig ist die Protokollierung deaktiviert. Über die [[My_Schedule_-_Konfigurationsdatei|Konfigurationsdatei]] <code>config.json</code> können Sie die Protokollierung aktivieren und steuern.
  
 
{| class="wikitable"
 
{| class="wikitable"
Zeile 26: Zeile 26:
  
 
== Logdateien ==
 
== Logdateien ==
Die Dateien der Nutzungsprotokolle werden im <code>\data</code> Unterverzeichnis des Serververzeichnisses (i.d.R. <code>C:\ProgramData\Asprova\Asprova My Schedule\WS</code>) abgelegt. Für jeden Tag wird eine neue Datei mit Dateinamen <code>usage-YYYY-MM-DD.log</code> angelegt. Alte Dateien werden nach Ablauf der Aufbewahrungsfrist automatisch gelöscht.
+
Die Dateien der Nutzungsprotokolle werden im <code>\data</code> Unterverzeichnis des Serververzeichnisses (i.d.R. <code>C:\ProgramData\Asprova\Asprova My Schedule\WS</code>) abgelegt. Für jeden Tag wird eine neue Datei ([https://de.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON NDJSON bzw. line-delimited JSON]) mit Dateinamen <code>usage-YYYY-MM-DD.log</code> angelegt. Alte Dateien werden nach Ablauf der Aufbewahrungsfrist automatisch gelöscht.
  
 
Jede Zeile ist ein JSON-Objekt mit den folgenden Eigenschaften:
 
Jede Zeile ist ein JSON-Objekt mit den folgenden Eigenschaften:
Zeile 33: Zeile 33:
 
!colspan="2"|Schlüssel!!Beschreibung
 
!colspan="2"|Schlüssel!!Beschreibung
 
|-
 
|-
|colspan="2"|eventType||Ereignistyp
+
|colspan="2"|<code>eventType</code>||Ereignistyp
 
|-
 
|-
|colspan="2"|user||Benutzer, welcher das Ereignis ausgelöst hat (falls zutreffend)
+
|colspan="2"|<code>user</code>||Benutzer, welcher das Ereignis ausgelöst hat (falls zutreffend)
 
|-
 
|-
| ||userId||Benutzer-ID
+
| ||<code>userId</code>||Benutzer-ID
 
|-
 
|-
| ||username||Benutzername
+
| ||<code>username</code>||Benutzername
 
|-
 
|-
|colspan="2"|req||Informationen zum HTTP-Request, welcher das Ereignis ausgelöst hat (falls zutreffend)
+
|colspan="2"|<code>req</code>||Informationen zum HTTP-Request, welcher das Ereignis ausgelöst hat (falls zutreffend)
 
|-
 
|-
| ||method||HTTP-Methode (z.B. <code>POST</code>)
+
| ||<code>method</code>||HTTP-Methode (z.B. <code>POST</code>)
 
|-
 
|-
| ||path||Der angefragt Pfad (z.B. <code>/api/auth/login</code>)
+
| ||<code>path</code>||Der angefragt Pfad (z.B. <code>/api/auth/login</code>)
 
|-
 
|-
| ||ip||IP-Adresse des Clients
+
| ||<code>ip</code>||IP-Adresse des Clients
 
|-
 
|-
|colspan="2"|details||Weitere Informationen zum im Kontext des Ereignisses
+
|colspan="2"|<code>details</code>||Weitere Informationen zum im Kontext des Ereignisses
 
|-
 
|-
|colspan="2"|timestamp||Zeitstempel des Ereignisses
+
|colspan="2"|<code>timestamp</code>||Zeitstempel des Ereignisses
 +
|-
 +
|colspan="2"|<code>level</code>||Schwere des Ereignisses (derzeit nur "info")
 +
|-
 +
|}
 +
 
 +
; Hinweis : Die Reihenfolge der Schlüssel ist (derzeit noch) nicht fest vorgegeben.
 +
 
 +
== Ereignisse ==
 +
Die folgenden Ereignisse werden protokolliert:
 +
{| class="wikitable"
 +
|+
 +
!Ereignistyp!!Beschreibung!!Zusätzlicher Hinweis||Details!!Beschreibung der Details
 +
|-
 +
|rowspan="2"|<code>ws:server:start</code>||rowspan="2"|Server (bzw. Dienst) wurde gestartet||rowspan="2"| ||<code>port</code>||Horchender Port
 +
|-
 +
|<code>https</code>||HTTPS-Aktivierungsstatus
 +
|-
 +
|rowspan="4"|<code>ws:user:created</code>||rowspan="4"|Benutzer wurde hinzugefügt||rowspan="4"| ||<code>ID</code>||ID des neuen Benutzers
 +
|-
 +
|<code>username</code>||Benutzername des neuen Benutzers
 +
|-
 +
|<code>type</code>||Authentifizierungsart des neuen Benutzers
 +
|-
 +
|<code>roles</code>||Berechtigungen des neuen Benutzers
 +
|-
 +
|<code>ws:user:login:success</code>||Benutzer hat sich erfolgreich eingeloggt|| || ||''Nicht zutreffend''
 +
|-
 +
|rowspan="2"|<code>ws:user:login:failure</code>||rowspan="2"|Einloggen des Benutzers ist fehlgeschlagen||rowspan="2"|<code>user</code> wird hier nicht gesetzt||<code>username</code>||Benutzername des Einlogversuchs
 +
|-
 +
|<code>reason</code>||Grund des Fehlschlagens
 +
|-
 +
|rowspan="2"|<code>ws:user:removed</code>||rowspan="2"|Benutzer wurde gelöscht||rowspan="2"|<code>user</code> ist hier der löschende Benutzer||<code>ID</code>||ID des gelöschten Benutzers
 +
|-
 +
|<code>username</code>||Benutzername des gelöschten Benutzers
 +
|-
 +
|<code>ws:user:logout</code>||Benutzer hat sich ausgeloggt|| || ||''Nicht zutreffend''
 +
|-
 +
|rowspan="3"|<code>my-schedule:license:ccu:added</code>||rowspan="3"|Neue CCU-Verbindung wurde akzeptiert||rowspan="12"|"CCU" = [https://de.wikipedia.org/wiki/Concurrent-User-Lizenzmodell '''C'''on'''c'''urrent '''U'''ser]||<code>pool</code>||CCU-Pool (Plan) dem Benutzer hinzugefügt wurde
 +
|-
 +
|<code>currentCount</code>||Anzahl gleichzeitiger Benutzer nachdem diese Verbindung akzeptiert wurde
 +
|-
 +
|<code>maxCount</code>||Maximal erlaubte Anzahl gleichzeitiger Benutzer in diesem Plan
 +
|-
 +
|rowspan="3"|<code>my-schedule:license:ccu:max-reached</code>||rowspan="3"|Verbindung wurde verweigert, da maximal erlaubte Anzahl gleichzeitiger Benutzer bereits erreicht ist||<code>pool</code>||CCU-Pool dessen maximale Anzahl erreicht wurde
 +
|-
 +
|<code>currentCount</code>||Gegenwärtige Anzahl gleichzeitiger Benutzer in diesem Plan
 +
|-
 +
|<code>maxCount</code>||Maximal erlaubte Anzahl gleichzeitiger Benutzer in diesem Plan
 +
|-
 +
|rowspan="3"|<code>my-schedule:license:ccu:released-with-logout</code>||rowspan="3"|CCU-Verbindung wurde durch Logout freigegeben||<code>pool</code>||CCU-Pool aus dem Benutzer entfernt wurde
 +
|-
 +
|<code>currentCount</code>||Gegenwärtige Anzahl gleichzeitiger Benutzer in diesem Plan
 +
|-
 +
|<code>maxCount</code>||Maximal erlaubte Anzahl gleichzeitiger Benutzer in diesem Plan
 +
|-
 +
|rowspan="3"|<code>my-schedule:license:ccu:expired</code>||rowspan="3"|CCU-Verbindung wurde wegen Inaktivität freigegeben||<code>pool</code>||CCU-Pool aus dem Benutzer entfernt wurde
 +
|-
 +
|<code>currentCount</code>||Gegenwärtige Anzahl gleichzeitiger Benutzer in diesem Plan
 +
|-
 +
|<code>maxCount</code>||Maximal erlaubte Anzahl gleichzeitiger Benutzer in diesem Plan
 +
|-
 +
|<code>my-schedule:license:maintenance-mode:entered</code>||Aufgrund unzureichender freier Lizenzen ist Server in Wartungsmodus gewechselt|| || ||''Nicht zutreffend''
 +
|-
 +
|<code>my-schedule:license:maintenance-mode:left</code>||Server hat Wartungsmodus verlassen|| || ||''Nicht zutreffend''
 +
|-
 +
|rowspan="2"|<code>my-schedule:view:accessed</code>||rowspan="2"|Benutzer hat auf Ansicht zugegriffen||rowspan="4"|Ereignis wird [https://de.wikipedia.org/wiki/Deduplikation dedupliziert] (d.h. innerhalb eines kleinen Zeitfensters wird je Benutzer, Projekt und Ansicht nur ein Ereignis protokolliert)||<code>projectId</code>||Projekt-ID
 +
|-
 +
|<code>viewName</code>||Ansichtsname (z.B. "ResGantt" oder "DispatchingView")
 +
|-
 +
|rowspan="2"|<code>my-schedule:view:uploaded</code>||rowspan="2"|Für Ansicht wurden Daten hochgeladen||<code>projectId</code>||Projekt-ID
 +
|-
 +
|<code>viewName</code>||Ansichtsname (z.B. "ResGantt" oder "DispatchingView")
 
|-
 
|-
 
|}
 
|}
  
 +
== Analyse mit DuckDB ==
 +
<font color="red">Dieser Abschnitt beschreibt die beispielhafte und optionale Analyse der Nutzungsprotokolle mittels der kostenfreien Software [https://duckdb.org/ DuckDB]. Weder ist dies der von uns empfohlene Weg, noch können wir für DuckDB Unterstützung leisten.</font>
 +
 +
=== Vorbereitung ===
 +
# Öffnen Sie die Eingabeaufforderung oder PowerShell
 +
# Starten Sie DuckDB
 +
# Setzen Sie in DuckDB das Protokollverzeichnis von Asprova WS als Arbeitsverzeichnis
 +
# Erstellen Sie eine View:
 +
 +
Um das Nutzungsprotokoll eines bestimmten Tages abzufragen:
 +
CREATE VIEW usage_logs AS SELECT * FROM read_json_auto('usage-2026-04-10.log');
 +
 +
Um alle Nutzungsprotokolle abzufragen:
 +
CREATE VIEW usage_logs AS SELECT * FROM read_json_auto('usage-*.log', filename=true);
 +
 +
=== Beispiele ===
 +
==== Ereignisse nach Ereignistyp zählen ====
 +
SELECT eventType, count(*) AS count
 +
FROM usage_logs
 +
GROUP BY eventType
 +
ORDER BY count DESC;
 +
 +
==== Fehlgeschlagene Einlogversuche ====
 +
SELECT timestamp, details.username, req.ip
 +
FROM usage_logs
 +
WHERE eventType = 'ws:user:login:failure'
 +
ORDER BY timestamp;
  
 +
==== Ansichtszugriffe aktiver Benutzer ====
 +
SELECT "user".username, details.projectId, details.viewName, count(*) AS accesses
 +
FROM usage_logs
 +
WHERE eventType = 'my-schedule:view:accessed'
 +
GROUP BY "user".username, details.projectId, details.viewName
 +
ORDER BY accesses DESC;
  
 +
==== CCU-Nutzung im Zeitverlauf ====
 +
SELECT timestamp, eventType, details.pool, details.currentCount, details.maxCount
 +
FROM usage_logs
 +
WHERE eventType LIKE 'my-schedule:license:ccu:%'
 +
ORDER BY timestamp;
  
 
<hr>
 
<hr>
 
<div align="right">[[Asprova My Schedule]]</div>
 
<div align="right">[[Asprova My Schedule]]</div>

Aktuelle Version vom 19. April 2026, 10:06 Uhr

Asprova My Schedule

Achtung, dies ist derzeit eine experimentelle Funktion, deren Verhalten sich in zukünftigen Versionen ändern kann!

Asprova My Schedule bzw. Asprova WS können Benutzerereignisse wie Einloggen, Ausloggen und Datenzugriffe protokollieren. Die Protokollierung kann ggf. die Geschwindigkeit des Servers beeinträchtigen.

Konfiguration

Standardmäßig ist die Protokollierung deaktiviert. Über die Konfigurationsdatei config.json können Sie die Protokollierung aktivieren und steuern.

Parameter Standardwert Beschreibung
enable_usage_log false Protokollierung ein- oder ausschalten
usage_log_retention "30d" Aufbewahrungsfrist bevor Protokolle automatisch gelöscht werden.

Um die Protokollierung zu aktivieren, so setzen Sie in der Datei folgendes:

{
  "enable_usage_log": true
}

Logdateien

Die Dateien der Nutzungsprotokolle werden im \data Unterverzeichnis des Serververzeichnisses (i.d.R. C:\ProgramData\Asprova\Asprova My Schedule\WS) abgelegt. Für jeden Tag wird eine neue Datei (NDJSON bzw. line-delimited JSON) mit Dateinamen usage-YYYY-MM-DD.log angelegt. Alte Dateien werden nach Ablauf der Aufbewahrungsfrist automatisch gelöscht.

Jede Zeile ist ein JSON-Objekt mit den folgenden Eigenschaften:

Schlüssel Beschreibung
eventType Ereignistyp
user Benutzer, welcher das Ereignis ausgelöst hat (falls zutreffend)
userId Benutzer-ID
username Benutzername
req Informationen zum HTTP-Request, welcher das Ereignis ausgelöst hat (falls zutreffend)
method HTTP-Methode (z.B. POST)
path Der angefragt Pfad (z.B. /api/auth/login)
ip IP-Adresse des Clients
details Weitere Informationen zum im Kontext des Ereignisses
timestamp Zeitstempel des Ereignisses
level Schwere des Ereignisses (derzeit nur "info")
Hinweis 
Die Reihenfolge der Schlüssel ist (derzeit noch) nicht fest vorgegeben.

Ereignisse

Die folgenden Ereignisse werden protokolliert:

Ereignistyp Beschreibung Zusätzlicher Hinweis Details Beschreibung der Details
ws:server:start Server (bzw. Dienst) wurde gestartet port Horchender Port
https HTTPS-Aktivierungsstatus
ws:user:created Benutzer wurde hinzugefügt ID ID des neuen Benutzers
username Benutzername des neuen Benutzers
type Authentifizierungsart des neuen Benutzers
roles Berechtigungen des neuen Benutzers
ws:user:login:success Benutzer hat sich erfolgreich eingeloggt Nicht zutreffend
ws:user:login:failure Einloggen des Benutzers ist fehlgeschlagen user wird hier nicht gesetzt username Benutzername des Einlogversuchs
reason Grund des Fehlschlagens
ws:user:removed Benutzer wurde gelöscht user ist hier der löschende Benutzer ID ID des gelöschten Benutzers
username Benutzername des gelöschten Benutzers
ws:user:logout Benutzer hat sich ausgeloggt Nicht zutreffend
my-schedule:license:ccu:added Neue CCU-Verbindung wurde akzeptiert "CCU" = Concurrent User pool CCU-Pool (Plan) dem Benutzer hinzugefügt wurde
currentCount Anzahl gleichzeitiger Benutzer nachdem diese Verbindung akzeptiert wurde
maxCount Maximal erlaubte Anzahl gleichzeitiger Benutzer in diesem Plan
my-schedule:license:ccu:max-reached Verbindung wurde verweigert, da maximal erlaubte Anzahl gleichzeitiger Benutzer bereits erreicht ist pool CCU-Pool dessen maximale Anzahl erreicht wurde
currentCount Gegenwärtige Anzahl gleichzeitiger Benutzer in diesem Plan
maxCount Maximal erlaubte Anzahl gleichzeitiger Benutzer in diesem Plan
my-schedule:license:ccu:released-with-logout CCU-Verbindung wurde durch Logout freigegeben pool CCU-Pool aus dem Benutzer entfernt wurde
currentCount Gegenwärtige Anzahl gleichzeitiger Benutzer in diesem Plan
maxCount Maximal erlaubte Anzahl gleichzeitiger Benutzer in diesem Plan
my-schedule:license:ccu:expired CCU-Verbindung wurde wegen Inaktivität freigegeben pool CCU-Pool aus dem Benutzer entfernt wurde
currentCount Gegenwärtige Anzahl gleichzeitiger Benutzer in diesem Plan
maxCount Maximal erlaubte Anzahl gleichzeitiger Benutzer in diesem Plan
my-schedule:license:maintenance-mode:entered Aufgrund unzureichender freier Lizenzen ist Server in Wartungsmodus gewechselt Nicht zutreffend
my-schedule:license:maintenance-mode:left Server hat Wartungsmodus verlassen Nicht zutreffend
my-schedule:view:accessed Benutzer hat auf Ansicht zugegriffen Ereignis wird dedupliziert (d.h. innerhalb eines kleinen Zeitfensters wird je Benutzer, Projekt und Ansicht nur ein Ereignis protokolliert) projectId Projekt-ID
viewName Ansichtsname (z.B. "ResGantt" oder "DispatchingView")
my-schedule:view:uploaded Für Ansicht wurden Daten hochgeladen projectId Projekt-ID
viewName Ansichtsname (z.B. "ResGantt" oder "DispatchingView")

Analyse mit DuckDB

Dieser Abschnitt beschreibt die beispielhafte und optionale Analyse der Nutzungsprotokolle mittels der kostenfreien Software DuckDB. Weder ist dies der von uns empfohlene Weg, noch können wir für DuckDB Unterstützung leisten.

Vorbereitung

  1. Öffnen Sie die Eingabeaufforderung oder PowerShell
  2. Starten Sie DuckDB
  3. Setzen Sie in DuckDB das Protokollverzeichnis von Asprova WS als Arbeitsverzeichnis
  4. Erstellen Sie eine View:

Um das Nutzungsprotokoll eines bestimmten Tages abzufragen:

CREATE VIEW usage_logs AS SELECT * FROM read_json_auto('usage-2026-04-10.log');

Um alle Nutzungsprotokolle abzufragen:

CREATE VIEW usage_logs AS SELECT * FROM read_json_auto('usage-*.log', filename=true);

Beispiele

Ereignisse nach Ereignistyp zählen

SELECT eventType, count(*) AS count
FROM usage_logs
GROUP BY eventType
ORDER BY count DESC;

Fehlgeschlagene Einlogversuche

SELECT timestamp, details.username, req.ip
FROM usage_logs
WHERE eventType = 'ws:user:login:failure'
ORDER BY timestamp;

Ansichtszugriffe aktiver Benutzer

SELECT "user".username, details.projectId, details.viewName, count(*) AS accesses
FROM usage_logs
WHERE eventType = 'my-schedule:view:accessed'
GROUP BY "user".username, details.projectId, details.viewName
ORDER BY accesses DESC;

CCU-Nutzung im Zeitverlauf

SELECT timestamp, eventType, details.pool, details.currentCount, details.maxCount
FROM usage_logs
WHERE eventType LIKE 'my-schedule:license:ccu:%'
ORDER BY timestamp;

Asprova My Schedule