Zugriffsstatistiken im Biblionetz
Worum geht es?
Das Biblionetz verfügt über eine rudimentäre Zugriffsstatistik, die aus den Logfiles eines Apache-Servers Zugriffe auf einzelne Biblionetzseiten auswertet.
Ablauf der Logfile-Auswertung
- Die Access-Logs vom Webserver werden gefiltert (bekannte Suchmaschinen-Abrufe werden gelöscht)
- Die Logfiles werden in eine Access-Datenbank eingelesen
- Die Zugriffe werden statistisch ausgewertet
Schritt 0: Alte Monatsdaten löschen
DELETE *
FROM T_Codiertes_Logfile_Aktueller_Monat;
Schritt 1: Zeilen ohne "GET /bibliothek/*" löschen
DELETE IMPORT.get
FROM IMPORT
WHERE (((IMPORT.get) Not Like "GET /bibliothek*"));
Schritt 2: http aus dem Logfile abschneiden
UPDATE IMPORT SET IMPORT.[get] = Left$([get],Len([get])-9);
Schritt 3: Parameter in der URL abschneiden
UPDATE IMPORT SET IMPORT.[get] = Left$([get],InStr([get],"?")-1)
WHERE (((InStr([get],"?"))>0));
Schritt 4: Zeilen löschen die nicht mit html enden
DELETE *
FROM IMPORT
WHERE (((Right$([get],4)) Not Like "html*"));
Schritt 5: Neue IP-Adressen finden
INSERT INTO T_Adressen ( address )
SELECT IMPORT.address
FROM IMPORT LEFT JOIN T_Adressen ON IMPORT.address = T_Adressen.address
GROUP BY IMPORT.address, T_Adressen.id
HAVING (((IMPORT.address) Is Not Null) AND ((T_Adressen.id) Is Null));
Schritt 6: Neue GETs finden
INSERT INTO T_Getter ( getter )
SELECT IMPORT.get
FROM IMPORT LEFT JOIN T_Getter ON IMPORT.get = T_Getter.getter
GROUP BY IMPORT.get, T_Getter.id
HAVING (((IMPORT.get) Is Not Null) AND ((T_Getter.id) Is Null));
Schritt 7: Daten importieren
INSERT INTO T_AktuellerMonat ( Adresse, [get], datum )
SELECT T_Adressen.id, T_Getter.id, DateValue(Mid$([datum],2,InStr([datum],":")-2)) AS Ausdr3
FROM (IMPORT INNER JOIN T_Adressen ON IMPORT.address = T_Adressen.address) INNER JOIN T_Getter ON IMPORT.get = T_Getter.getter;
Schritt 8: Abrufe pro Biblionetzobjekt (letzter Monat)
Erstellt eine neue Tabelle (bzw. ersetzt die alte) mit der Anzahl Abrufe pro Biblionetzobjekt im letzten Monat
SELECT A2_Biblionetz_Adressen.Typ, A2_Biblionetz_Adressen.Zahl, Count(T_AktuellerMonat.get) AS Anzahlvonget INTO [t_GET pro Seite ohne SE (letzter Monat)]
FROM T_AktuellerMonat RIGHT JOIN A2_Biblionetz_Adressen ON T_AktuellerMonat.get = A2_Biblionetz_Adressen.id
GROUP BY A2_Biblionetz_Adressen.Typ, A2_Biblionetz_Adressen.Zahl
ORDER BY Count(T_AktuellerMonat.get);
Schritt 9: Einträge für neue Biblionetzseiten in der Gesamtstatistik mit Anzahl 0 erstellen
In der Tabelle aller Biblionetzabrufe fehlen Zeilen für neue Biblionetzobjekte (die es vor einem Monat noch nicht gab). Mit dieser Abfrage werden diese Objekte hinzugefügt mit einem Abrufwert von 0:
INSERT INTO [t_GET pro Seite ohne SE] ( Typ, Zahl, GETs )
SELECT [t_GET pro Seite ohne SE (letzter Monat)].Typ, [t_GET pro Seite ohne SE (letzter Monat)].Zahl, 0 AS Ausdr1
FROM [t_GET pro Seite ohne SE (letzter Monat)] LEFT JOIN [t_GET pro Seite ohne SE] ON ([t_GET pro Seite ohne SE (letzter Monat)].Zahl = [t_GET pro Seite ohne SE].Zahl) AND ([t_GET pro Seite ohne SE (letzter Monat)].Typ = [t_GET pro Seite ohne SE].Typ)
WHERE ((([t_GET pro Seite ohne SE].GETs) Is Null));
Schritt 10: Aktuellen Monat zum Total addieren
UPDATE [t_GET pro Seite ohne SE (letzter Monat)] INNER JOIN [t_GET pro Seite ohne SE] ON ([t_GET pro Seite ohne SE (letzter Monat)].Zahl = [t_GET pro Seite ohne SE].Zahl) AND ([t_GET pro Seite ohne SE (letzter Monat)].Typ = [t_GET pro Seite ohne SE].Typ) SET [t_GET pro Seite ohne SE].GETs = [t_GET pro Seite ohne SE].[gets]+[t_GET pro Seite ohne SE (letzter Monat)].[gets];
Schritt 11: Abrufe des aktuellen Monats an Gesamttabelle anhängen
INSERT INTO T_Codiertes_Logfile_Total
SELECT *
FROM T_Codiertes_Logfile_Aktueller_Monat;
Schritt 12: Aktuellen Monat an Gesamtstatistik anhängen
INSERT INTO t_gets_ohne_se_nach_jahr_monat_b1 ( typ, nummer, anzahl, jahr, monat )
SELECT T_buchstabe_zahl.zahl, [t_GET pro Seite ohne SE (letzter Monat)].Zahl, [t_GET pro Seite ohne SE (letzter Monat)].GETs, [jahr] AS Ausdr1, [Zu verarbeitender Monat (als Zahl)] AS Ausdr2
FROM T_buchstabe_zahl INNER JOIN [t_GET pro Seite ohne SE (letzter Monat)] ON T_buchstabe_zahl.buchstabe = [t_GET pro Seite ohne SE (letzter Monat)].Typ;
Sonderthema: IDs über 30000
Worum geht es? Ich hatte ursprünglich einen Filter eingebaut, der nur IDs unter 30000 in die Statistik aufgenommen hat und habe vergessen, diesen Filter anzupassen, als die Text-IDs über 30000 gestiegen waren. Nun gibt es einen Zeitraum, in welchem die 30-Tausender IDs nicht in der Statistik verwurstet wurden.
- Beginn des Zeitraums: 14.02.2023
- Ende des Zeitraums: 01.01.2025
D.h. vom Februar 2013 bis zum Dezember 2024 müssen die 30-Tausender nacherfasst werden.
07.06.2025: Ist erledigt.
Überarbeitung der Statistik nach 25 Jahren
- Referrer fliegen raus
- Es werden deutlich weniger Daten in der Datenbank gespeichert aus dem monatlichen Logfile:
- Nur noch Zeilen mit "GET /bibliothek/*"
- Nur noch Zeilen, die mit "html" enden
Notizen
grep -avf /home/doebeli/grep_filter 2025-02_beat.doebe.li_ssl_access.log | gzip > /home/doebeli/beat-2025-03.gz