In unserer Serie „Erste Schritte mit Logging“ haben wir bereits die Protokollierung für viele Sprachen und Frameworks behandelt: C#, Java, Python, Ruby, Ruby on Rails, Node.js, Symfony, Kotlin, Flask, Angular und Laravel. Heute fügen wir dieser Serie eine weitere hinzu: PowerShell.

Es könnte eine seltsame sein, der Liste hinzuzufügen; PowerShell ist eine Skriptsprache, während die anderen als vollständige Anwendungsprogrammiersprachen oder Frameworks angesehen werden können., PowerShell ist jedoch so leistungsfähig, dass es Systeme erstellen kann, die komplex und wichtig genug sind, um die Protokollierung zu rechtfertigen.

PowerShell wird häufig verwendet, um kritische Wartungsaufgaben auf Computern oder Servern auszuführen. Für Administratoren ist es wichtig zu wissen, wie diese Skripte gut ausgeführt wurden oder nicht.

Wir werden untersuchen, wie Sie sich auf sehr einfache Weise mit PowerShell anmelden können, indem Sie Ihre eigene Protokollierungsfunktion schreiben. Dann werden wir behandeln, warum die Protokollierung von PowerShell nützlich ist. Wir werden auch darüber sprechen, was Sie protokollieren sollten und was Sie nicht protokollieren sollten., Abschließend betrachten wir zwei verschiedene Optionen, die Ihnen das Leben bei der Protokollierung erleichtern.

Ein einfaches PowerShell-Skript

Beginnen wir mit diesem extrem einfachen PowerShell-Skript:

Dieses grundlegende Skript nimmt eine Ganzzahl als Eingabe. Es macht dann die Summe der Ziffern dieser Zahl. Wenn das Ergebnis länger als eine einzelne Ziffer ist, führt es den Vorgang erneut aus, bis dies zu einer einzelnen Ziffer führt.,

Hier sind einige Beispiele zur Verdeutlichung:

  • 45 -> 4 + 5 = 9
  • 397 -> 3 + 9 + 7 = 19 -> 1 + 9 = 10 -> 1 + 0 = 1
  • 3 -> 3

Setzen Sie dieses Skript in eine Textdatei und speichern Sie es als recursiveSum.ps1. Dann, Sie können es auf der PowerShell-Befehlszeile ausführen recursiveSum.ps1 45, zum Beispiel., Die Ausgabe wird 9 sein:

Dies ist ein Skript, das einfach genug ist, um als Beispiel zu fungieren, aber genügend Schritte hat, die uns an einer Protokollierung interessieren könnten. Natürlich werden reale PowerShell-Skripte viel komplexer sein, was die Notwendigkeit einer noch stärkeren Protokollierung rechtfertigt.

Der einfachste Weg, sich in PowerShell anzumelden

Schreiben wir das Ergebnis jedes Schritts in die Konsole. Wir schreiben bereits etwas mit der Write-Output-Anweisung in die Konsole, sodass wir dies problemlos erneut verwenden können., Ändern Sie die While-Schleife, um eine solche Anweisung einzuschließen:

Wenn Sie sie jetzt ausführen, sollten Sie eine Ausgabe wie folgt sehen können:

Das ist großartig! Wir haben einige Protokollierung los. Diese Protokollanweisungen sind jedoch immer sichtbar. In einem komplexeren Programm kann es sinnvoll sein, nichts anzuzeigen, es sei denn, der Benutzer möchte die Protokollierung sehen. Es ist wahrscheinlich auch nützlich, dem Benutzer eine gewisse Kontrolle über die Menge an Details zu geben, die er sieht. Hier kommen Protokollebenen ins Spiel.,

Protokollebenen in PowerShell

PowerShell hat einige Write – * – Anweisungen, die traditionellen Protokollebenen zugeordnet sind, wie:

  • Write-Verbose
  • Write-Debug
  • Write-Information
  • Write-Warning
  • Write-Error

Verbose

Schauen wir uns zuerst Write-Verbose an. Wir können unsere Nachrichten über die Zwischenschritte ändern, um Write-Verbose zu verwenden., Wenn wir jetzt unser Skript ausführen, werden unsere Zwischenschritte nicht angezeigt:

Wenn wir jedoch das Flag-Verbose hinzufügen, werden unsere Protokolle erneut angezeigt:

Debuggen, Informationen und Warnung

Die Debug -, Informations-und Warnprotokollebenen funktionieren etwas anders als wir es von herkömmlichen Protokollierungsframeworks in anderen Sprachen gewohnt sind., Fügen wir zuerst einige zusätzliche Anweisungen hinzu:

Write-Debug "This is a debug statement"Write-Information "This is an info statement"Write-Warning "This is a warning statement"

Das Write-Debug wird nur sichtbar, wenn Sie das Flag-Debug hinzufügen. Außerdem wird die Ausführung Ihres Skripts gestoppt und um Bestätigung gebeten, um fortzufahren. Dies ist nützlich, um Ihre Skripte Schritt für Schritt zu durchlaufen.

Sie haben jedoch die Kontrolle darüber, ob Warnungen und Informationsmeldungen angezeigt werden sollen oder nicht. Die Befehle Write-Warning und Write-Information können mithilfe der Flags-WarningAction und-InformationAction gesteuert werden.,se flags werden nur die Warnmeldungen angezeigt:

Wenn wir die Informationsmeldungen anzeigen möchten, können wir dies durch Hinzufügen tun-InformationAction Continue flag:

Und wenn wir die Warnungen ausblenden möchten, können wir die Option-WarningAction SilentlyContinue:

Error

Schauen wir uns schließlich an, wie Schreibfehler funktionieren., Wir können eine solche Anweisung zu unserem Skript hinzufügen:

Wenn diese Anweisung ausgeführt wird, stoppt PowerShell die Ausführung unseres Skripts und schreibt den Fehler in die Konsole, zusammen mit einigen Details, die nützlich sein könnten:

Was ist Application Logging?

Nehmen wir nun einen Schritt weg von unserem PowerShell-Skript und schauen uns an, was Application Logging genau ist., Der erste Beitrag in unserer Serie hat es gut definiert:

Bei der Anwendungsprotokollierung werden Informationen zum Laufzeitverhalten Ihrer Anwendung auf einem persistenteren Medium aufgezeichnet.

Wir machen bereits den ersten Teil: mit anderen Worten, Informationen über das Laufzeitverhalten unserer Anwendung zu erfassen. Wir zeigen die Zwischenergebnisse unseres Prozesses. Aber wir machen nicht den zweiten Teil. Wir zeichnen diese Informationen nicht auf einem persistenten Medium auf. Wenn wir unsere PowerShell-Sitzung schließen, haben wir diese Informationen verloren. Lass uns das zuerst machen.,

Protokollierung in einer Datei

Wir fügen diese Protokollfunktion zu unserer Skriptdatei hinzu:

Function Log { param( $msg ) Add-Content log.txt $msg}

Es nimmt einfach eine Zeichenfolge auf und fügt sie dann einem Protokoll hinzu.txt-Datei.,

Dann können wir unsere log-Anweisung so ändern, dass sie nicht mehr Write-Verbose, sondern diese Log-Funktion verwendet:

Log "Intermediate result: $($sum)"

Jetzt können wir unser Skript ausführen und es wird eine Datei erstellt, die unsere Zwischenschritte enthält:

Aber wenn wir unser Skript mehrmals ausführen, wird es nur eine lange Liste von Anweisungen sein. Wir haben keine Möglichkeit zu wissen, wann die Zeilen protokolliert wurden. In einem komplexeren Szenario, das mehrere Skripte enthält, können wir auch nicht wissen, woher die Protokollzeile stammt-dh,, aus welcher PS1-Datei. Es gibt mehr Informationen, die wir protokollieren könnten.

Machen wir noch einmal einen Schritt zurück und schauen uns an, was wir mit der Protokollierung erreichen wollen.

Warum loggen wir uns ein?

PowerShell wird häufig verwendet, um bestimmte Aufgaben zu automatisieren und zu skripten, die sonst mühsam und fehleranfällig wären. Automatisierung beginnt wirklich Wert zu liefern, wenn sie auf komplexere Aufgaben angewendet wird. Diese komplexen Skripts haben jedoch möglicherweise auch eine größere Wahrscheinlichkeit für Unterbrechungen: Dienste reagieren möglicherweise nicht, Maschinenkonfigurationen haben sich möglicherweise geändert usw.,

Ohne Protokollierung ist es schwer zu wissen, ob Skripte einwandfrei liefen oder ob etwas schief gelaufen ist. Wenn etwas schief gelaufen ist, hilft uns die Protokollierung herauszufinden, wo und warum. Die Anwendungsprotokollierung kann Ihnen auch dabei helfen, Einblicke zu erhalten, welche Teile Ihrer Skripte am häufigsten verwendet werden oder wo noch Leistungssteigerungen erzielt werden können.

Was Sollten Sie nicht Einloggen?

Wenn Sie Ihre Logging-Anweisungen schreiben, stellen Sie sicher, dass Sie sensible oder persönliche Daten weglassen., Beispiele hierfür sind:

  • Passwörter und Zugriffstoken
  • Kreditkartennummern oder Bankkontonummern
  • Sozialversicherungsnummern
  • E-Mail-Adressen
  • Straßenadressen
  • Verschlüsselungsschlüssel
  • Sozialversicherungsnummern

Der OWASP-Spickzettel über die Protokollierung enthält einen Abschnitt über Daten zum Ausschließen, der interessant zu lesen ist. Obwohl es sich an vollwertige Anwendungen richtet, könnte es auch für PowerShell-Skripte nützlich sein. Ich kann mir vorstellen, dass PowerShell-Skripte E-Mail-Adressen oder bestimmte API-Schlüssel verarbeiten.,

Das Protokollieren solcher personenbezogenen Daten (oder PII) ist gefährlich. In den meisten Ländern benötigen Sie nicht nur die ausdrückliche Zustimmung des Benutzers, sondern wenn die Daten jemals durchgesickert sind, können Sie oder Ihr Unternehmen zur Rechenschaft gezogen werden. Wenn es nicht wirklich notwendig ist, ist es besser, diese Daten wegzulassen.

Was sollten Sie protokollieren?

Unser Artikel zum Einstieg in die Ruby-Protokollierung macht einen guten Punkt aus:

Sie sollten sich einen Protokolleintrag als Ereignis vorstellen-etwas, das für Ihre App von Interesse ist, das zu einem bestimmten Zeitpunkt passiert ist.,

Dies bedeutet, dass wir mindestens einen Zeitstempel und eine Beschreibung des Ereignisses benötigen. Die Beschreibung könnte auch relevante Daten enthalten. Dies ist nicht immer einfach im Voraus zu bestimmen. Überlegen Sie, was Sie benötigen, um ein Skript zu beheben, das nicht erfolgreich ausgeführt wurde. Und wenn Sie später auf eine Situation stoßen, in der Sie mehr Informationen benötigt hätten, um ein Problem zu beheben, fügen Sie es der Protokollierung für das nächste Mal hinzu.,

Weniger offensichtlich, aber sehr nützlich ist es, eine Protokollebene einzuschließen:

  • Auf der untersten Ebene können Debug-Anweisungen nützlich sein, um den ausgeführten Fluss Ihres PowerShell-Skripts zu verfolgen.
  • A level up sind Informationsmeldungen über die funktionale Seite Ihres Skripts: Was wurde ausgeführt, warum und mit welchen Daten?
  • Dann gibt es auch die Ebene der Warnungen: Dinge, die nicht normal und potenziell schädlich sind, aber das Skript nicht daran hindern, fortzufahren.
  • Schließlich gibt es Fehlermeldungen auf Fehlerebene, um Fehler zu protokollieren, die das Skript zum Absturz gebracht haben.,

Sie können wählen, ob Sie alle diese Ebenen oder nur eine bestimmte Ebene protokollieren möchten (z. B. Warnungen und Fehler). Wenn Sie weitere Informationen benötigen, können Sie Ihr Skript so konfigurieren, dass auch weitere Details zur nächsten Ausführung protokolliert werden.

Unsere eigene einfache Protokollierungsfunktion enthielt keine Protokollebenen. Es hat auch keinen Zeitstempel hinzugefügt. Wir könnten diese Funktionalität natürlich hinzufügen, aber zum Glück haben andere bereits anständige Protokollierungsskripte erstellt.

Geben Sie das Protokollierungsskript ein

Auf Technet gibt es ein einfaches, aber nützliches Skript namens Write-Log., Wenn wir es herunterladen, können wir unser Skript so ändern:

Wir haben die Datei Function-Write-Log.ps1 eingefügt, unsere Protokollfunktion entfernt und den Aufruf durch einen Aufruf von Write-Log ersetzt. Wir können eine Nachricht, eine Ebene und einen Pfad übergeben. Die Ebene kann Info, Warn oder Error sein. Beachten Sie, dass dieses Skript keine Debug-Ebene hat, was unglücklich ist. Sie können es jedoch leicht ändern, um es einzuschließen, da das Skript unter der MIT-Lizenz veröffentlicht wird, die Änderungen zulässt.,

Wenn wir dieses Skript verwenden, sieht unser Protokoll folgendermaßen aus:

2019-08-20 09:18:29 INFO: Intermediate result: 512019-08-20 09:18:29 INFO: Intermediate result: 6

Wir haben jetzt klare Protokollzeilen, die einen Zeitstempel, die Protokollebene und unsere Nachricht enthalten. Das ist viel besser als das, was wir vorher hatten. Dies mag für Ihre Bedürfnisse ausreichen, aber gehen wir noch einen Schritt weiter und schauen uns eine andere Option an: das PSFramework.

Geben Sie das Protokollierungsframework ein

Das PSFramework ist ein PowerShell-Framework, das mehrere nützliche Dienstprogramme enthält. Wir werden uns nur den Logging-Teil ansehen.,

Um mit dem PSFramework zu beginnen, müssen Sie es zuerst installieren, indem Sie Install-Module PSFramework in PowerShell ausführen. (Möglicherweise müssen Sie Ihre PowerShell-Konsole als Administrator ausführen.) Anschließend können Sie in die Protokolldateien schreiben, indem Sie das Skript Write-PSFMessage aufrufen. In unserem Fall würde es so aussehen:

Write-PSFMessage -Level Output -Message "Intermediate result: $($sum)"

Beachten Sie, dass wir keine Info-Ebene verwenden. Stattdessen verwenden wir Output. Dies liegt daran, dass PSFramework Protokollebenen verwendet, die besser mit den verschiedenen Ausgabeströmen übereinstimmen, die PowerShell standardmäßig hat: Ausführlich, Host, Ausgabe, Warnung, Fehler usw.,

Die Protokolldatei sieht auch etwas anders aus als gewohnt:

Die Spaltenüberschriften fehlen, dies kann jedoch leicht behoben werden, indem zuerst der Protokollierungsanbieter festgelegt wird:

Diese Protokolldatei enthält einen Zeitstempel im Dateinamen und enthält jetzt eine Kopfzeile. Dies liegt daran, dass der Standardprotokollanbieter von PSFramework keine Header-Zeile hinzufügt, der Logfile-Anbieter jedoch., Die Protokolldatei sieht nun so aus:

Dies enthält jetzt viele nützliche Informationen wie den Dateinamen unseres Skripts, die Zeile, in der die Protokollierung stattgefunden hat, und den Benutzernamen des Benutzers, der das Skript ausführt. Ein weiterer großer Vorteil der Protokollierung durch PSFramework ist, dass es asynchron protokolliert. Die Protokollierung wird Ihre Skripte nicht verlangsamen. Schließlich werden auch Ihre Protokolle automatisch bereinigt. Standardmäßig werden Protokolldateien nach sieben Tagen oder mehr als 100 Megabyte entfernt.,

Ein Vergleich

Das Skript Function-Write-Log stimmt mehr mit dem überein, was viele Anwendungsprogrammierer gewohnt sind. Es enthält die Standardprotokollebenen (mit Ausnahme von Debug) und schreibt eine Protokolldatei wie viele Protokollierungsframeworks: einen Zeitstempel, die Protokollebene und die Nachricht.

Es fehlen jedoch einige zusätzliche Funktionen, die für Sie von entscheidender Bedeutung sein könnten: Protokollbereinigung; asynchrone Protokollierung; und zusätzliche technische Informationen wie Skript, Zeilennummer und ausführender Benutzer.,

Die PSFramework-Protokollierung bietet diese Funktionen, obwohl Sie das gesamte Framework installieren müssen. Dies sollte kein echtes Problem sein, aber es ist etwas zu beachten. Das PSFramework verwendet auch andere Protokollierungsebenen als wir es gewohnt sind. Sie stimmen jedoch eng mit den PowerShell-Ausgabeströmen überein. Dies kann sich für erfahrene PowerShell-Benutzer natürlicher anfühlen.

Was kommt als Nächstes?

Wir haben uns eine einfache Möglichkeit angesehen, uns in PowerShell anzumelden. Wir haben auch unsere eigene Lösung verbessert, indem wir ein besseres Skript (Function-Write-Log.ps1) und die in PSFramework enthaltene Protokollierung verwendet haben.,

Eine Sache, die mir auffiel, war, dass die Anmeldung in PowerShell immer noch ziemlich einfach ist. Es ist nicht so, dass die Optionen, die wir uns angesehen haben, schlecht sind oder fehlen. Ich habe jedoch kein einziges Protokollierungsskript oder-modul gefunden, das mehrere Protokollebenen, asynchrone Protokollierung, Protokollbereinigung und vor allem mehrere Protokollziele enthält.

Was ist, wenn wir Fehler an eine E-Mail-Adresse senden möchten? Oder was, wenn wir uns in einer Datenbank anmelden möchten? Soweit ich sehen kann, bietet PSFramework hier die meisten Optionen, aber E-Mail oder Datenbank sind nicht enthalten. Es könnte jedoch möglich sein, eigene zu schreiben und in PSFramework zu registrieren.,

Dies könnte daran liegen, dass die Welt von PowerShell anders ist als die Welt der Anwendungsentwicklung. PowerShell-Skripte können viel maßgeschneiderter sein, für ein bestimmtes Szenario gedacht und aus mehreren separaten Skripten bestehen.

Dennoch bleibt die Protokollierung wichtig, insbesondere bei Skripten, die regelmäßig ausgeführt werden und eine gewisse Komplexität aufweisen. PowerShell ist eine leistungsstarke Sprache, um eine Vielzahl von Aufgaben zu automatisieren. Wenn bei einer solchen Aufgabe etwas schief geht, möchten Sie wissen, was schief gelaufen ist, was ihr vorausgegangen ist und wie Sie es beheben können. Protokolle geben Ihnen diese Informationen.,

Als nächsten Schritt sollten Sie sich die Aggregation und Verwaltung Ihrer Protokolle ansehen. Scalyr ist ein großartiges Werkzeug dafür. Schauen Sie sich die Scalyr-API für die verschiedenen Optionen zum Senden von Protokollereignissen an Scalyr an. Dies kann leicht von PowerShell aufgerufen werden und verbessert Ihre Fähigkeit zur Überwachung und Fehlerbehebung Ihrer PowerShell-Skripte.

Dieser Beitrag wurde von Peter Morlion geschrieben., Peter ist ein leidenschaftlicher Programmierer, der Menschen und Unternehmen hilft, die Qualität ihres Codes zu verbessern, insbesondere in älteren Codebasen. Er ist der festen Überzeugung, dass Best Practices der Branche von unschätzbarem Wert sind, wenn er auf dieses Ziel hinarbeitet, und zu seinen Spezialitäten gehören TDD, DI und SOLID Principles.