w naszej serii „Pierwsze kroki z logowaniem” omówiliśmy już Logowanie dla wielu języków i frameworków: C#, Java, Python, Ruby, Ruby on Rails, Node.js, Symfony, Kotlin, Flask, Angular i Laravel. Dzisiaj dodamy kolejny z tej serii: PowerShell.
dodanie do listy może być dziwne; PowerShell jest językiem skryptowym, podczas gdy pozostałe mogą być postrzegane jako pełne języki programowania aplikacji lub frameworki., Jednak PowerShell jest na tyle potężny, że może tworzyć systemy złożone i wystarczająco ważne, aby wymagać rejestrowania.
PowerShell jest często używany do wykonywania krytycznych zadań konserwacyjnych na komputerach lub serwerach. Ważne jest, aby administratorzy wiedzieli, czy te skrypty działały dobrze, czy nie.
przyjrzymy się, jak możesz logować się za pomocą PowerShell w bardzo prosty sposób, pisząc własną funkcję logowania. Następnie omówimy, dlaczego logowanie z PowerShell jest przydatne. Porozmawiamy również o tym, co należy rejestrować, a czego nie., Na koniec przyjrzymy się dwóm różnym opcjom, które ułatwią Ci rejestrowanie.
prosty skrypt PowerShell
zacznijmy od tego niezwykle prostego skryptu PowerShell:
Ten podstawowy skrypt pobiera liczbę całkowitą jako wejście. Następnie tworzy sumę cyfr tej liczby. Jeśli wynik jest dłuższy niż jedna cyfra, wykonuje operację ponownie, aż do uzyskania jednej cyfry.,
oto kilka przykładów do wyjaśnienia rzeczy:
- 45 -> 4 + 5 = 9
- 397 – > 3 + 9 + 7 = 19 -> 1 + 9 = 10 -> 1 + 0 = 1
- 3 -> 3
Umieść ten skrypt w pliku tekstowym i zapisz go jako recursiveSum.ps1. wiersz poleceń PowerShell uruchamiając na przykład recursivesum.PS1 45., Wyjście będzie 9:
jest to skrypt, który jest wystarczająco prosty, aby działać jako przykład, ale ma wystarczająco dużo kroków, że możemy być zainteresowani w niektórych logowania. Oczywiście prawdziwe skrypty PowerShell będą znacznie bardziej złożone, co jeszcze bardziej uzasadnia potrzebę logowania.
najprostszy sposób na zalogowanie się w PowerShell
zapisujemy wynik każdego kroku do konsoli. Już piszemy coś do konsoli za pomocą instrukcji Write-Output, więc możemy z łatwością użyć tego ponownie., Zmień pętlę While, aby zawierała taką instrukcję:
Kiedy ją uruchomisz, powinieneś być w stanie zobaczyć takie wyjście:
to świetnie! Mamy wycinkę drzew. Jednak te instrukcje logowania zawsze będą widoczne. W bardziej złożonym programie może mieć sens Pokazywanie niczego, chyba że użytkownik chce zobaczyć logowanie. Prawdopodobnie przydatne jest również zapewnienie użytkownikowi kontroli nad ilością szczegółów, które widzi. Tutaj pojawiają się poziomy logów.,
poziomy logów w PowerShell
PowerShell ma kilka instrukcji Write -*, które mapują do tradycyjnych poziomów logów, takich jak:
- Write-Verbose
- Write-Debug
- Write-Information
- Write-Warning
- Write-Error
Verbose
spójrzmy najpierw na Write-Verbose. Możemy zmienić nasze wiadomości o pośrednich krokach, aby użyć Write-Verbose., Gdy uruchomimy nasz skrypt teraz, nie zobaczymy naszych pośrednich kroków:
ale jeśli dodamy flagę-Verbose, nasze dzienniki pojawią się ponownie:
debug, information, and warning
debug, information, and warning log levels działają trochę inaczej niż w tradycyjnych frameworkach logowania w innych językach., Dodajmy najpierw kilka dodatkowych instrukcji:
Write-Debug "This is a debug statement"Write-Information "This is an info statement"Write-Warning "This is a warning statement"
Write-Debug będzie widoczny tylko po dodaniu flagi-Debug. Spowoduje to również zatrzymanie działania skryptu i poproszenie o potwierdzenie, aby kontynuować. Jest to przydatne do uruchamiania skryptów krok po kroku.
ale masz pewną kontrolę nad tym, czy wyświetlać ostrzeżenia i wiadomości informacyjne. Polecenia Write-Warning I Write-Information mogą być sterowane za pomocą flag-WarningAction i-InformationAction.,flagi se, wyświetlane są tylko komunikaty ostrzegawcze:
jeśli chcemy wyświetlić wiadomości informacyjne, możemy to zrobić, dodając flagę-InformationAction Continue:
a jeśli chcemy ukryć ostrzeżenia, możemy użyć opcji-warningaction silentlycontinue:
błąd
wreszcie zobaczmy, jak działa błąd zapisu., Możemy dodać taką instrukcję do naszego skryptu:
Write-Error "Something went wrong"
gdy ta instrukcja jest wykonywana, PowerShell zatrzyma wykonywanie naszego skryptu i zapisze błąd do konsoli, wraz z pewnymi szczegółami, które mogą być przydatne:
co to jest rejestrowanie aplikacji?
oddalmy się teraz od naszego skryptu PowerShell i przyjrzyjmy się, czym dokładnie jest rejestrowanie aplikacji., Pierwszy post z naszej serii dobrze ją zdefiniował:
rejestrowanie aplikacji polega na zapisywaniu informacji o zachowaniu aplikacji na bardziej trwałym nośniku.
wykonujemy już pierwszą część: innymi słowy, przechwytujemy informacje o zachowaniu naszej aplikacji w trybie runtime. Pokazujemy pośrednie wyniki naszego procesu. Ale nie robimy drugiej części. Nie zapisujemy tych informacji na trwałym nośniku. Kiedy zamykamy naszą sesję PowerShell, utraciliśmy te informacje. Zróbmy to najpierw.,
Logowanie do pliku
dodamy tę funkcję dziennika do naszego pliku skryptu:
Function Log { param( $msg ) Add-Content log.txt $msg}
Po prostu pobiera ciąg znaków, a następnie dodaje go do dziennika.plik txt.,
następnie możemy zmienić naszą instrukcję log tak, że nie używa już Write-Verbose, ale zamiast tego Ta funkcja Log:
Log "Intermediate result: $($sum)"
teraz możemy uruchomić nasz skrypt i utworzy plik zawierający nasze kroki pośrednie:
ale jeśli uruchomimy nasz skrypt wiele razy, będzie to po prostu długa lista poleceń. Nie wiemy, kiedy zostały zarejestrowane linie. W bardziej złożonym scenariuszu, zawierającym wiele skryptów, nie mamy również możliwości poznania, skąd pochodzi linia logu—tj.,, z którego pliku ps1. Jest więcej informacji, które możemy rejestrować.
jeszcze raz, cofnijmy się o krok i przyjrzyjmy się temu, co staramy się osiągnąć dzięki logowaniu.
dlaczego logujemy?
PowerShell jest często używany do automatyzacji i skryptowania niektórych zadań, które w przeciwnym razie byłyby żmudne i podatne na błędy. Automatyzacja naprawdę zaczyna dostarczać wartości, gdy jest stosowana do bardziej złożonych zadań. Ale te złożone skrypty mogą również mieć większą szansę na złamanie: usługi mogą nie odpowiadać, konfiguracje maszyn mogą się zmienić, itp.,
bez logowania trudno stwierdzić, czy skrypty działały poprawnie, czy coś poszło nie tak. Jeśli coś poszło nie tak, logowanie pomoże nam dowiedzieć się, gdzie i dlaczego tak się stało. Rejestrowanie aplikacji może również pomóc w zebraniu informacji, które fragmenty skryptów są używane najczęściej lub gdzie można jeszcze zwiększyć wydajność.
czego nie należy logować?
podczas pisania wyciągów z logowania, upewnij się, że pomijasz poufne lub osobiste dane., Przykłady obejmują:
- hasła i tokeny dostępu
- numery kart kredytowych lub numerów kont bankowych
- numery ubezpieczenia społecznego
- adresy e-mail
- adresy ulic
- klucze szyfrowania
- numery ubezpieczenia społecznego
Ściągawka OWASP podczas logowania zawiera sekcję dotyczącą wykluczania danych, która jest interesująca do odczytania. Chociaż jest skierowany do pełnoprawnych aplikacji, może być przydatny również dla skryptów PowerShell. Mogę sobie wyobrazić scenariusze, w których skrypty PowerShell obsługują adresy e-mail lub określone klucze API.,
rejestrowanie takich danych osobowych (lub PII) jest niebezpieczne. Nie tylko potrzebujesz wyraźnej zgody od użytkownika w większości krajów, ale jeśli dane zostaną kiedykolwiek wycieknięte, ty lub Twoja firma możecie zostać pociągnięci do odpowiedzialności. Jeśli nie jest to konieczne, lepiej pominąć te dane.
co należy logować?
Nasz artykuł na temat getting started with Ruby logging ma świetny punkt:
powinieneś myśleć o wpisie w dzienniku jako o zdarzeniu—czymś, co jest interesujące dla Twojej aplikacji, które miało miejsce w pewnym momencie.,
oznacza to, że potrzebujemy przynajmniej znacznika czasu i opisu zdarzenia. Opis może również zawierać istotne dane. Nie zawsze jest to łatwe do ustalenia z góry. Zastanów się, czego potrzebujesz, aby rozwiązać problem ze skryptem, który nie powiódł się pomyślnie. Jeśli później napotkasz sytuację, w której potrzebujesz więcej informacji, aby rozwiązać problem, dodaj je do dziennika następnego razu.,
mniej oczywiste, ale bardzo przydatne, jest włączenie poziomu dziennika:
- na najniższym poziomie instrukcje Debug mogą być przydatne do śledzenia wykonanego przepływu skryptu PowerShell.
- a level up to informacje o funkcjonalnej stronie skryptu: co zostało wykonane, dlaczego i z jakimi danymi?
- jest też poziom ostrzeżeń: rzeczy, które nie są normalne i potencjalnie szkodliwe, ale nie uniemożliwiają kontynuowania skryptu.
- wreszcie, komunikaty poziomu błędów są tam, aby rejestrować błędy, które spowodowały awarię skryptu.,
Możesz zapisać wszystkie te poziomy lub tylko określony poziom i więcej (na przykład ostrzeżenia i błędy). Następnie, gdy potrzebujesz więcej informacji, możesz skonfigurować skrypt tak, aby zapisywał więcej szczegółów na temat następnego wykonania.
nasza własna prosta funkcja logowania nie zawierała poziomów logów. Nie dodała też znacznika czasu. Możemy oczywiście dodać tę funkcjonalność, ale na szczęście inni stworzyli już przyzwoite skrypty logowania.
wpisz skrypt logowania
w Technecie znajduje się prosty, ale przydatny skrypt o nazwie Write-Log., Jeśli go pobierzemy, możemy zmienić nasz skrypt, aby wyglądał tak:
dodaliśmy plik Function-Write-Log.ps1, usunęliśmy naszą funkcję Log i zastąpiliśmy wywołanie wywołaniem Write-Log. Możemy przekazać wiadomość, poziom i ścieżkę. Poziom może być informacją, ostrzeżeniem lub błędem. Zauważ, że ten skrypt nie ma poziomu debugowania, co jest niefortunne. Można go jednak łatwo zmodyfikować, aby go włączyć, ponieważ skrypt jest wydany na licencji MIT pozwalającej na modyfikację.,
Kiedy używamy tego skryptu, nasz dziennik będzie wyglądał tak:
2019-08-20 09:18:29 INFO: Intermediate result: 512019-08-20 09:18:29 INFO: Intermediate result: 6
mamy teraz wyczyszczone linie dziennika, które zawierają znacznik czasu, poziom dziennika i naszą wiadomość. To o wiele lepsze niż to, co mieliśmy wcześniej. Może to być wystarczające dla Twoich potrzeb, ale pójdźmy o krok dalej i spójrzmy na inną opcję: ramy PSFramework.
wprowadź Framework Logging
PSFramework to Framework PowerShell, który zawiera kilka użytecznych narzędzi. Przyjrzymy się tylko wycince drzew.,
aby rozpocząć pracę z PSFramework, najpierw musisz go zainstalować, uruchamiając Install-Module PSFramework w PowerShell. (Być może będziesz musiał uruchomić konsolę PowerShell jako administrator). Następnie możesz zapisać do plików dziennika, wywołując skrypt Write-PSFMessage. W naszym przypadku wyglądałoby to tak:
Write-PSFMessage -Level Output -Message "Intermediate result: $($sum)"
zauważ, że nie używamy poziomu informacji. Zamiast tego używamy wyjścia. Dzieje się tak dlatego, że PSFramework używa poziomów logów, które lepiej pasują do różnych strumieni wyjściowych, które PowerShell ma domyślnie: Verbose, Host, Output, Warning, Error, itp.,
plik dziennika będzie również wyglądał nieco inaczej niż to, do czego jesteśmy przyzwyczajeni:
brakuje nagłówków kolumn, ale można to łatwo naprawić, ustawiając najpierw dostawcę logowania:
Ten plik dziennika będzie zawierał znacznik czasu w nazwie pliku, a teraz będzie zawierał wiersz nagłówka. Dzieje się tak, ponieważ domyślny dostawca dziennika PSFramework nie doda wiersza nagłówka, ale dostawca pliku dziennika., Plik dziennika będzie teraz wyglądał tak:
zawiera teraz wiele przydatnych informacji, takich jak nazwa pliku naszego skryptu, linia, w której nastąpiło logowanie i nazwa użytkownika, który uruchamia skrypt. Kolejną wielką zaletą logowania przez PSFramework jest to, że loguje się on asynchronicznie. Logowanie nie spowalnia skryptów. Wreszcie, automatycznie wyczyści Twoje dzienniki. Domyślnie usunie pliki dziennika po siedmiu dniach lub gdy przekroczą one 100 megabajtów.,
A Comparison
skrypt funkcji zapisu i logowania pasuje bardziej do tego, do czego służy wielu programistów aplikacji. Zawiera standardowe poziomy dziennika (z wyjątkiem debugowania) i zapisuje plik dziennika, tak jak wiele frameworków rejestrujących: znacznik czasu, poziom dziennika i wiadomość.
pomija jednak pewne dodatkowe funkcje, które mogą być dla Ciebie kluczowe: czyszczenie dziennika; rejestrowanie asynchroniczne; oraz dodatkowe informacje techniczne, takie jak skrypt, numer linii i wykonujący użytkownik.,
rejestrowanie PSFramework zapewnia te funkcje, chociaż wymaga zainstalowania całego frameworka. To nie powinien być prawdziwy problem, ale to jest coś, o czym należy pamiętać. System PSFramework wykorzystuje również inne poziomy logowania niż jesteśmy przyzwyczajeni. Jednak są one ściśle dopasowane do strumieni wyjściowych PowerShell. Może to wydawać się bardziej naturalne dla doświadczonych użytkowników PowerShell.
co dalej?
przyjrzeliśmy się prostemu sposobowi logowania w PowerShell. Ulepszyliśmy również własne rozwiązanie, używając lepszego skryptu (Function-Write-Log. ps1) oraz logowania zawartego w PSFramework.,
jedno, co mnie uderzyło, to to, że logowanie w PowerShell jest nadal dość proste. Nie chodzi o to, że opcje, na które patrzyliśmy, są złe lub brakuje. Ale nie znalazłem jednego skryptu lub modułu rejestrującego, który zawiera wiele poziomów dziennika, rejestrowanie asynchroniczne, czyszczenie dziennika i, co najważniejsze, wiele miejsc docelowych dziennika.
Co jeśli chcemy wysyłać błędy na adres e-mail? A co jeśli chcemy zalogować się do bazy danych? O ile widzę, PSFramework oferuje najwięcej opcji tutaj, ale e-mail lub baza danych nie są wliczone. Możliwe jest jednak napisanie własnego i zarejestrowanie go w PSFramework.,
może być tak dlatego, że świat PowerShell jest inny niż świat tworzenia aplikacji. Skrypty PowerShell mogą być znacznie bardziej niestandardowe, przeznaczone dla konkretnego scenariusza i złożone z wielu oddzielnych skryptów.
jednak logowanie pozostaje ważne, szczególnie w przypadku skryptów, które działają regularnie i mają pewien poziom złożoności. PowerShell to potężny język do automatyzacji wielu zadań. Gdy coś idzie nie tak z takim zadaniem, chcesz wiedzieć, co poszło nie tak, co go poprzedzało i jak to naprawić. Logi dają ci te informacje.,
w następnym kroku możesz zajrzeć do agregowania i zarządzania dziennikami. Scalyr jest do tego świetnym narzędziem. Spójrz na Scalyr API dla różnych opcji wysyłania zdarzeń dziennika do Scalyr. Można to łatwo wywołać z PowerShell i poprawi zdolność monitorowania i rozwiązywania problemów ze skryptami PowerShell.
This post was written by Peter Morlion., Peter jest zapalonym programistą, który pomaga ludziom i firmom poprawić jakość ich kodu, szczególnie w starszych bazach kodowych. Głęboko wierzy, że najlepsze praktyki branżowe są nieocenione podczas pracy nad tym celem, a jego specjalności obejmują TDD, DI I SOLID principles.
Dodaj komentarz