In der Softwareentwicklung und Wartung von langlaufenden Programmen ist die System- und Prozessüberwachung ein Teil der operativen Aufgaben. Um dies zu unterstützen gibt es u.a. die Möglichkeit entsprechende Log-Ausgaben zu erstellen und im zweiten Schritt auszuwerten.
Hier im konkreten Fall, wie die Speicherauslastung im Tagesverlauf, bzw. über mehrere Tage aussieht. Thema Peak-Performance und Datenkosten.
In langlaufenden Serviceprogrammen, in diesem Kontext geht es um einen Windows-Dienst, welcher regelmäßig tausende von Datensätze verarbeitet. Dieser Windows-Dienst erzeugt nun einige Log-Ausgaben mehr, um nach einzelnen Prozessschritten den Status der Garbage-Collection auf einfache Weise überwachen zu können.
Hintergrund ist, letztes Jahr, also Ende Oktober 2022, hatten die Domain-Controller ein System-Update bekommen. Dadurch hatte sich das Aufrufverhalten von AD-Operationen verändert, in der Form, daß an bestimmten Stellen der Prozessspeicher nicht mehr freigegeben wurde. Der Windows-Dienst kam so mit einer "OutOfMemoryException" zum Stillstand.
Um die betreffenden Stellen im Code aufzuspüren, wurden zusätzliche Log-Ausgaben implementiert. Das war die einfachste Maßnahme, um die betreffenden Fehlerquellen einzugrenzen.
Die betreffenden AD-Gruppenabfragen konnten dann relativ schnell angepasst werden.
Für die weitere Prozessüberwachung werden die Log-Ausgaben mit einem einfachen Windows-Task regelmäßig gefiltert, um die Details in einem 3. Schritt in einem Report zu visualisieren.
Hier nun das Skript für die Filterung der Log-Ausgaben (Bezeichnungen wurden geändert). Warum ein Batch-Skript, weil es keine zusätzlichen Berechtigungseinstellungen zur Ausführung bedarf. Zur Erstellung habe ich tatsächlich auch ChatGPT aufgerufen (3 Prompts) und dann ein paar Details angepasst.
- Bitte daran denken, die Batch-Datei mit ANSI-Encoding abzuspeichern, sonst funktioniert das "@echo off" nicht! 😉
- Datumsformat prüfen. Mit einer Testausgabe (echo %date%) das Datumsformat auf dem Zielsystem kurz prüfen, denn beim englischen Format steht ja bekanntlich der Monat an erster Stelle.
@echo off
set search=memory logging
REM die Ausgabedatei bekommt im Dateinamen den Zeitstempel des aktuellen Tages (yyyyMMdd)
echo %date%
set output=_memoryLogging_%date:~-4,4%%date:~-10,2%%date:~-7,2%.txt
set input=_logOfDataService.txt
set /a count=0
(for /f "tokens=1,* delims=:" %%a in ('findstr /i /n /c:"%search%" %input%') do (
set /a count+=1
echo %%a:%%b
)) > %output%
if %count%==0 (
echo Der zu suchende Text '%search%' wurde nicht gefunden. > %output%
echo Evtl. wurden heute keine Daten übertragen? Prüfen Sie das gerne in der Datei '%input%' >> %output%
) else (
echo Es wurden %count% Treffer gefunden und in %output% gespeichert.
)
Weitere Details werden noch folgen, weil das Reporting zum einen in ein vorhandenes System integriert wird und in einem separaten Admin-Panel eine kleine Darstellung mit 3d.js bekommt.
Die Learnings werde ich hier gerne teilen:
- die Batch-Datei mit ANSI-Encoding speichern