Zugriffsstatistiken im Biblionetz

07 June 2025 - 20:43 | Version 5 |

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

  1. Die Access-Logs vom Webserver werden gefiltert (bekannte Suchmaschinen-Abrufe werden gelöscht)
  2. Die Logfiles werden in eine Access-Datenbank eingelesen
  3. 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
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding arbeitsgruppe.ch? Send feedback
This page was cached on 08 Jun 2025 - 01:55.