V „začínáme s Přihlášením“ série, jsme již zahrnuty protokolování pro mnoho jazyků a frameworků: C#, Java, Python, Ruby, Ruby on Rails, Uzel.js, Symfony, Kotlin, baňka, hranatý, A Laravel. Dnes k této sérii přidáme další: PowerShell.

může být liché přidat do seznamu; PowerShell je skriptovací jazyk, zatímco ostatní mohou být považovány za úplné programovací jazyky nebo rámce aplikací., PowerShell je však natolik silný, že dokáže vytvořit systémy složité a dostatečně důležité, aby bylo možné protokolovat.

PowerShell se často používá k provádění kritických úkolů údržby na počítačích nebo serverech. Je důležité, aby administrátoři věděli, jak pokud tyto skripty běžely dobře nebo ne.

podíváme se na to, jak se můžete přihlásit pomocí PowerShell velmi základním způsobem napsáním vlastní funkce protokolování. Pak se budeme zabývat tím, proč je protokolování z PowerShell užitečné. Budeme také hovořit o tom, co byste se měli přihlásit a co byste se neměli přihlásit., Nakonec se podíváme na dvě různé možnosti,které usnadní vaše přihlášení.

Jednoduchý PowerShell Skript

začněme s tímto velmi jednoduchý PowerShell skript:

Tento základní scénář trvá celé číslo jako input. To pak dělá součet číslic tohoto čísla. Pokud je výsledek delší než jedna číslice, provede operaci znovu, dokud to nebude mít za následek jednu číslici.,

Zde jsou některé příklady k objasnění věci:

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

tento skript do textového souboru a uložit jej jako recursiveSum.ps1. Pak, můžete spustit v PowerShell příkazového řádku spuštěním recursiveSum.ps1 45, například., Výstup bude 9.

Toto je skript, který je dost jednoduché funkce jako příklad, ale má dost kroků, které bychom mohli mít zájem v některých přihlášení. Skripty PowerShell v reálném životě budou samozřejmě mnohem složitější, což zaručuje potřebu protokolování ještě více.

nejjednodušší způsob, jak se přihlásit PowerShell

napište výsledek každého kroku na konzoli. Už něco píšeme do konzoly pomocí příkazu Write-Output, takže to můžeme snadno použít znovu., Změnit, Zatímco smyčky, aby zahrnovala takové prohlášení:

Při spuštění to teď, měli byste být schopni vidět výstup jako tento:

to je skvělé! Máme tu nějaké záznamy. Tyto příkazy protokolu však budou vždy viditelné. Ve složitějším programu by mohlo mít smysl ukázat nic, pokud uživatel nechce vidět protokolování. Pravděpodobně je také užitečné dát uživateli určitou kontrolu nad množstvím detailů, které vidí. To je místo, kde úrovně log přijít.,

Log Úrovně v PowerShell

PowerShell má nějaký Napsat-* prohlášení, že mapa na tradiční log úrovně, jako je:

  • Write-Verbose
  • Napsat-Debug
  • Zápis-Informace
  • Napsat-Varování
  • Zápis-Chyba

Podrobné

Pojďme se podívat na Write-Verbose první. Můžeme změnit naše zprávy o přechodných krocích k použití zápisu-Verbose., Když jsme se spustit náš skript nyní, nebudeme vidět naše průběžné kroky:

Ale když přidáme -Verbose flag, naše záznamy se objeví ještě jednou:

Ladění, Informace a Varování

Debug, Information, Warning úrovně práce trochu jinak, než jsme zvyklí z tradiční logování rámce v jiných jazycích., Nejprve přidáme další příkazy:

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

Debug pro zápis bude viditelný pouze při přidání příznaku ladění. To také zastaví váš skript z provozu a požádat o potvrzení pokračovat. To je užitečné pro spuštění skriptů krok za krokem.

Ale máte nějakou kontrolu nad tím, zda zobrazovat nebo nezobrazovat varování a informační zprávy. Příkazy Write-Warning a Write-Information lze ovládat pomocí vlajek WarningAction a-InformationAction.,se vlajky, pouze varovné hlášky:

chceme-Li zobrazit informace, zprávy, můžeme tak učinit přidáním -InformationAction Pokračovat flag:

A pokud chceme skrýt varování, můžeme použít -WarningAction SilentlyContinue možností:

Chyba

a Konečně, pojďme se podívat na to, jak Psát-Chyba funguje., Můžeme přidat takové prohlášení, aby náš skript:

Write-Error "Something went wrong"

Když toto prohlášení je vykonán, PowerShell zastaví provádění skriptu a napsat chybu do konzole, spolu s některými detaily, které by mohly být užitečné:

Co Je Aplikace, Přihlášení?

pojďme nyní udělat krok od našeho PowerShell skriptu a podívat se na to, co protokolování aplikace je přesně., První příspěvek v naší sérii to dobře definoval:

protokolování aplikací zahrnuje zaznamenávání informací o runtime chování aplikace na trvalejší médium.

už děláme první část: jinými slovy, zachycující informace o naší aplikace runtime chování. Ukazujeme průběžné výsledky našeho procesu. Ale druhou část neděláme. Tyto informace nezaznamenáváme na trvalé médium. Když ukončíme naši PowerShell relaci, ztratili jsme tyto informace. Nejdřív to uděláme.,

přihlášení do souboru

tuto funkci protokolu přidáme do našeho skriptového souboru:

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

jednoduše vezme řetězec a poté jej přidá do protokolu.txt soubor.,

Pak můžeme změnit naše protokolu prohlášení tak, že již používá Write-Verbose ale tato funkce Log místo:

Log "Intermediate result: $($sum)"

Nyní můžeme spustit náš skript a to bude vytvářet soubor, obsahující naše průběžné kroky:

Ale když jsme se spustit náš skript vícekrát, bude to dlouhý seznam prohlášení. Nemáme žádný způsob, jak zjistit, kdy byly řádky zaznamenány. Ve složitějším scénáři, který obsahuje více skriptů, také Nemáme žádný způsob, jak zjistit, kde log line vznikl-tj.,, ze kterého soubor ps1. Je tu více informací, že bychom mohli být protokolování.

opět se podívejme na krok zpět a podíváme se na to, čeho se snažíme dosáhnout při protokolování.

proč se přihlašujeme?

PowerShell se často používá k automatizaci a skriptování určitých úkolů, které by jinak byly únavné a náchylné k chybám. Automatizace skutečně začíná poskytovat hodnotu, když je aplikována na složitější úkoly. Ale tyto složité skripty mohou mít také větší šanci na rozbití: služby nemusí reagovat, konfigurace stroje se mohou změnit atd.,

bez protokolování je těžké vědět, zda skripty běžely dobře nebo jestli se něco pokazilo. Pokud se něco pokazilo, protokolování nám pomůže zjistit, kde a proč to udělal. Protokolování aplikací vám také pomůže shromáždit informace o tom, které části skriptů se používají nejvíce nebo kde lze stále dosáhnout zvýšení výkonu.

Co Bys Neměl Přihlásit?

Když píšete své přihlašovací údaje, ujistěte se, že vynecháte citlivé nebo osobní údaje., Příklady zahrnují:

  • hesla a přístupové tokeny
  • čísla kreditních karet nebo čísla bankovních účtů
  • čísla sociálního zabezpečení
  • e-mailové adresy
  • adresy
  • šifrování klíče
  • čísla sociálního zabezpečení

V OWASP cheat sheet na přihlášení má sekci o datech vyloučit, že je to zajímavé čtení. Přestože je zaměřen na plnohodnotné aplikace,může být užitečný i pro skripty PowerShell. Dokážu si představit scénář, kde skripty PowerShell zpracovávají e-mailové adresy nebo určité klíče API.,

zaznamenávání takových osobně identifikovatelných informací (nebo PII) je nebezpečné. Nejen, že potřebujete výslovný souhlas od uživatele ve většině zemí, ale v případě, že data jsou někdy unikly, vy nebo vaše společnost by mohla být odpovědná. Pokud to není opravdu nutné, je lepší nechat tato data venku.

co byste se měli přihlásit?

Náš článek o tom, jak začít s Ruby přihlášení je skvělý bod:

Byste měli přemýšlet o položce protokolu jako událost—něco, co je v zájmu vaší aplikace, které se stalo na nějakou dobu.,

to znamená, že minimálně potřebujeme časové razítko a popis události. Popis by také mohl obsahovat relevantní údaje. To není vždy snadné určit předem. Přemýšlejte o tom, co byste potřebovali k vyřešení skriptu, který se nepodařilo úspěšně spustit. A pokud se později setkáte se situací, kdy byste potřebovali více informací k vyřešení problému, přidejte jej do protokolování pro příště.,

méně zřejmé, ale velmi užitečné je zahrnout úroveň protokolu:

  • na nejnižší úrovni mohou být příkazy ladění užitečné pro sledování provedeného toku skriptu PowerShell.
  • o úroveň výš jsou informační zprávy o funkční straně skriptu: co bylo provedeno, proč a s jakými daty?
  • pak je tu také úroveň varování: věci, které nejsou normální a potenciálně škodlivé, ale které nebrání skriptu v pokračování.
  • nakonec jsou k dispozici zprávy na úrovni chyb, které zaznamenaly chyby, které způsobily selhání skriptu.,

můžete se rozhodnout přihlásit všechny tyto úrovně nebo pouze určitou úroveň a vyšší (například varování a chyby). Poté, když potřebujete více informací, můžete nakonfigurovat skript tak, aby také zaznamenával další podrobnosti o dalším provedení.

naše vlastní jednoduchá funkce protokolování neobsahovala úrovně protokolu. Ani to nepřidalo časové razítko. Tuto funkci bychom samozřejmě mohli přidat, ale naštěstí jiní již vytvořili slušné logovací skripty.

zadejte logovací skript

na Technetu je jednoduchý, ale užitečný skript s názvem Write-Log., Pokud si jej stáhneme, můžeme změnit náš skript tak, aby vypadal takto:

Zahrnuli jsme soubor funkce-Write-Log.ps1, odstranili naši funkci protokolu a nahradili hovor voláním k zápisu-Log. Můžeme předat zprávu, úroveň a cestu. Úroveň může být Info, varovat, nebo chyba. Všimněte si, že tento skript nemá úroveň ladění, což je nešťastné. Můžete ji však snadno upravit tak, aby ji zahrnula, protože skript je vydán pod licencí MIT umožňující úpravu.,

při použití tohoto skriptu bude náš protokol vypadat takto:

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

nyní máme jasné řádky protokolu, které obsahují časové razítko, úroveň protokolu a naši zprávu. To je mnohem lepší než to, co jsme měli dříve. To může být dostatečné pro vaše potřeby, ale pojďme to ještě o krok dále a podívejme se na jinou možnost: PSFramework.

zadejte rámec protokolování

psframework je rámec PowerShell, který obsahuje několik užitečných nástrojů. Podíváme se jen na tu těžební část.,

Chcete-li začít s PSFramework, musíte jej nejprve nainstalovat spuštěním Install-Module PSFramework v PowerShell. (Možná budete muset spustit konzolu PowerShell jako správce). Poté můžete psát do souborů protokolu voláním skriptu Write-PSFMessage. V našem případě by to vypadalo takto:

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

Všimněte si, jak nepoužíváme informační úroveň. Místo toho používáme výstup. Je to proto, PSFramework používá log úrovně, které odpovídají více, pěkně se, že různé výstupní proudy, že PowerShell má ve výchozím nastavení: Verbose, Host, Výstup, Upozornění, Chyba, atd.,

soubor protokolu bude také vypadat trochu jinak, než na co jsme zvyklí:

sloupec záhlaví chybí, ale to lze snadno napravit tím, že nastavení protokolování poskytovatele první:

Tento soubor protokolu bude obsahovat časové razítko v názvu souboru, a bude nyní obsahovat záhlaví řádku. Je to proto, že výchozí poskytovatel protokolu PSFramework nepřidá řádek záhlaví, ale poskytovatel logfile bude., Log soubor bude nyní vypadat takto:

nyní obsahuje mnoho užitečných informací, jako je název souboru skriptu, řádku, kde protokolování došlo k chybě a uživatelské jméno uživatele, který je spuštěn skript. Další velkou výhodou protokolování pomocí Psframepráce je, že se zaznamenává asynchronně. Protokolování nebude zpomalovat skripty. Nakonec také automaticky vyčistí vaše protokoly. Ve výchozím nastavení odstraní soubory protokolu po sedmi dnech nebo po překročení 100 megabajtů.,

Srovnání

Funkce-Napsat-Log script odpovídá více s tím, co mnoho aplikací programátoři jsou zvyklí. Obsahuje standardní úrovně protokolu (s výjimkou ladění) a zapisuje soubor protokolu, jako mnoho rámců protokolování: časové razítko, úroveň protokolu a zpráva.

chybí však některé další funkce, které by pro vás mohly být zásadní: log clean up; asynchronní protokolování; a další technické informace, jako je skript, číslo řádku a spuštění uživatele.,

protokolování Psframeworku poskytuje tyto funkce, i když vyžaduje instalaci celého rámce. To by nemělo být skutečný problém, ale je to něco, co je třeba mít na paměti. PSFramework také používá různé úrovně protokolování, než jsme zvyklí. Nicméně, oni těsně odpovídají výstupním proudům PowerShell. To se může cítit přirozeněji pro zkušené uživatele PowerShell.

co bude dál?

podívali jsme se na jednoduchý způsob přihlášení PowerShell. Jsme rovněž zlepšila na naše vlastní řešení pomocí lepší scénář (Funkce-Zápis-Protokol.ps1) a pomocí protokolování zahrnuty v PSFramework.,

jedna věc, která mě zasáhla, bylo, že přihlášení do PowerShell je stále poměrně základní. Není to tak, že možnosti, na které jsme se dívali, jsou špatné nebo chybí. Ale nenašel jsem jediného přihlášení skriptu nebo modul, který obsahuje více úrovní záznamu, asynchronní přihlášení, přihlásit vyčistit, a co je nejdůležitější, více log destinací.

Co když chceme poslat chyby na e-mailovou adresu? Nebo co když se chceme přihlásit do databáze? Pokud vidím, PSFramework zde nabízí nejvíce možností, ale e-mail nebo databáze nejsou zahrnuty. To by mohlo být možné napsat svůj vlastní a zaregistrovat jej v PSFramework, ačkoli.,

to může být proto, že svět PowerShell je jiný než svět vývoje aplikací. PowerShell skripty mohou být mnohem více na zakázku, určen pro konkrétní scénář, a skládá se z několika samostatných skriptů.

přesto protokolování zůstává důležité, zejména u skriptů, které běží pravidelně a mají určitou úroveň složitosti. PowerShell je výkonný jazyk pro automatizaci mnoha úkolů. Když se s takovým úkolem něco pokazí, chcete vědět, co se pokazilo, co tomu předcházelo a jak to opravit. Protokoly vám tyto informace.,

Jako další krok nahoru, možná budete chtít podívat na agregaci a správu protokolů. Scalyr je pro to skvělý nástroj. Podívejte se na Scalyr API pro různé možnosti odesílání událostí protokolu Scalyr. To lze snadno volat z PowerShell a zlepší vaši schopnost monitorování a odstraňování problémů s skripty PowerShell.

tento příspěvek napsal Peter Morlion., Peter je vášnivý programátor, který pomáhá lidem a společnostem zlepšit kvalitu jejich kódu, zejména v legacy codebases. Pevně věří, že osvědčené postupy v oboru jsou neocenitelné při práci na tomto cíli a mezi jeho speciality patří TDD, DI a pevné principy.