Nella nostra serie “Getting Started with Logging”, abbiamo già trattato la registrazione per molti linguaggi e framework: C#, Java, Python, Ruby, Ruby on Rails, Node.il nostro sito utilizza cookie tecnici e di terze parti. Oggi ne aggiungeremo un altro a questa serie: PowerShell.

Potrebbe essere uno strano da aggiungere alla lista; PowerShell è un linguaggio di scripting, mentre gli altri possono essere visti come linguaggi di programmazione applicativi completi o framework., Eppure PowerShell è così sufficientemente potente che può creare sistemi complessi e abbastanza importanti da giustificare la registrazione.

PowerShell viene spesso utilizzato per eseguire attività di manutenzione critiche su computer o server. È importante per gli amministratori sapere come se questi script funzionassero bene o meno.

Vedremo come è possibile accedere con PowerShell in un modo molto semplice scrivendo la propria funzione di registrazione. Quindi copriremo perché la registrazione da PowerShell è utile. Parleremo anche di cosa dovresti registrare e cosa non dovresti registrare., Infine, vedremo due diverse opzioni che renderanno la vostra vita di registrazione più facile.

Un semplice script PowerShell

Iniziamo con questo estremamente semplice script PowerShell:

Questo script di base prende un intero come input. Quindi fa la somma delle cifre di quel numero. Se il risultato è più lungo di una singola cifra, esegue nuovamente l’operazione, fino a ottenere una singola cifra.,

Ecco alcuni esempi per chiarire le cose:

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

Mettere questo script in un file di testo e salvarlo come recursiveSum.ps1. Quindi, è possibile eseguire il comando PowerShell linea eseguendo recursiveSum.ps1 45, per esempio., L’output sarà 9:

Questo è uno script che è abbastanza semplice da funzionare come esempio ma ha abbastanza passaggi che potremmo essere interessati a qualche registrazione. Naturalmente, gli script PowerShell reali saranno molto più complessi, garantendo la necessità di registrare ancora di più.

Il modo più semplice per accedere a PowerShell

Scriviamo il risultato di ogni passaggio sulla console. Stiamo già scrivendo qualcosa sulla console usando l’istruzione Write-Output, quindi possiamo facilmente usarlo di nuovo., Cambia il ciclo While per includere tale istruzione:

Quando lo esegui ora, dovresti essere in grado di vedere un output come questo:

È fantastico! Abbiamo un po ‘ di registrazione in corso. Tuttavia, queste istruzioni di registro saranno sempre visibili. In un programma più complesso, potrebbe avere senso non mostrare nulla a meno che l’utente non voglia vedere la registrazione. Probabilmente è anche utile dare all’utente un certo controllo sulla quantità di dettagli che vedono. Questo è dove i livelli di registro sono disponibili in.,

Livelli di log in PowerShell

PowerShell ha alcune istruzioni Write-* che si associano ai livelli di log tradizionali come:

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

Verbose

Diamo un’occhiata a Write-Verbose prima. Possiamo cambiare i nostri messaggi sui passaggi intermedi per utilizzare Write-Verbose., Quando si esegue lo script ora, non vedremo i nostri passi intermedi:

Ma se ci aggiungi l’opzione-Verbose bandiera, il nostro registri di apparire ancora una volta:

Debug, Informazioni e Avvertenze

Il Debug, di Informazione e di Avviso dei livelli di log lavoro un po ‘ diverso da quello a cui siamo abituati da registrazione tradizionale quadri in altre lingue., Aggiungiamo prima alcune istruzioni extra:

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

Il Write-Debug sarà visibile solo quando si aggiunge il flag-Debug. Fermerà anche l’esecuzione dello script e chiederà conferma per continuare. Questo è utile per eseguire gli script passo dopo passo.

Ma hai un certo controllo sull’opportunità o meno di mostrare avvisi e messaggi informativi. I comandi Write-Warning e Write-Information possono essere controllati utilizzando i flag-WarningAction e-InformationAction.,se flag, solo i messaggi di avviso vengono visualizzati:

Se si desidera visualizzare i messaggi di informazione, siamo in grado di farlo aggiungendo -InformationAction flag:

E se vogliamo nascondere gli avvisi, siamo in grado di utilizzare l’-WarningAction SilentlyContinue opzione:

Errore

Infine, diamo un’occhiata a come Scrivere-Errore opere., Possiamo aggiungere che una tale affermazione per il nostro script:

Write-Error "Something went wrong"

Quando questo comando viene eseguito, PowerShell potrà interrompere l’esecuzione di script e scrivere l’errore della console, insieme ad alcuni dettagli che potrebbero essere utili:

che Cosa È la Registrazione delle Applicazioni?

Facciamo ora un passo lontano dal nostro script PowerShell e guardiamo a quale registrazione delle applicazioni è esattamente., Il primo post della nostra serie lo ha definito bene:

La registrazione dell’applicazione comporta la registrazione di informazioni sul comportamento di runtime dell’applicazione su un supporto più persistente.

Stiamo già facendo la prima parte: in altre parole, acquisendo informazioni sul comportamento di runtime della nostra applicazione. Stiamo mostrando i risultati intermedi del nostro processo. Ma non stiamo facendo la seconda parte. Non stiamo registrando queste informazioni su un supporto persistente. Quando chiudiamo la sessione di PowerShell, abbiamo perso queste informazioni. Facciamolo prima.,

Registrazione in un file

Aggiungeremo questa funzione di registro al nostro file di script:

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

Prende semplicemente una stringa e poi la aggiunge a un registro.file txt.,

è possibile modificare il registro di istruzione in modo che non utilizza più la Scrittura Prolisso, ma questa funzione Log invece:

Log "Intermediate result: $($sum)"

Ora siamo in grado di eseguire il nostro script per creare un file contenente i nostri passi intermedi:

Ma se noi usiamo il nostro script più volte, sarà solo una lunga lista di istruzioni. Non abbiamo modo di sapere quando le linee sono state registrate. In uno scenario più complesso, contenente più script, non abbiamo nemmeno modo di sapere dove ha avuto origine la linea di registro, cioè,, da cui file ps1. Ci sono altre informazioni che potremmo registrare.

Ancora una volta, facciamo un passo indietro e guardiamo cosa stiamo cercando di ottenere con la registrazione.

Perché registriamo?

PowerShell viene spesso utilizzato per automatizzare e script di alcune attività che altrimenti sarebbero noiose e soggette a errori. L’automazione inizia davvero a fornire valore quando viene applicata a compiti più complessi. Ma questi script complessi potrebbero anche avere più possibilità di rottura: i servizi potrebbero non rispondere, le configurazioni della macchina potrebbero essere cambiate, ecc.,

Senza registrazione, è difficile sapere se gli script sono stati eseguiti correttamente o se qualcosa è andato storto. Se qualcosa è andato storto, la registrazione ci aiuterà a scoprire dove e perché lo ha fatto. La registrazione delle applicazioni può anche aiutare a raccogliere informazioni su quali parti degli script vengono utilizzati di più o dove è ancora possibile ottenere guadagni in termini di prestazioni.

Cosa non dovresti registrare?

Quando scrivi le tue dichiarazioni di registrazione, assicurati di tralasciare dati sensibili o personali., Gli esempi includono:

  • password e token di accesso
  • numeri di carte di credito o numeri di conto bancario
  • numeri di previdenza sociale
  • indirizzi e-mail
  • indirizzi
  • chiavi di crittografia
  • numeri di previdenza sociale

La OWASP cheat sheet la registrazione ha una sezione di dati per escludere che sia interessante da leggere. Anche se si rivolge a applicazioni a tutti gli effetti, potrebbe essere utile per gli script PowerShell troppo. Posso immaginare lo scenario in cui gli script PowerShell gestiscono indirizzi e-mail o determinate chiavi API.,

La registrazione di tali informazioni personali (o PII) è pericolosa. Non solo hai bisogno di un consenso esplicito da parte dell’utente nella maggior parte dei paesi, ma se i dati sono mai trapelati, tu o la tua azienda potreste essere ritenuti responsabili. Se non è davvero necessario, è meglio lasciare questi dati fuori.

Che cosa si dovrebbe accedere?

Il nostro articolo su come iniziare con la registrazione di Ruby fa un ottimo punto:

Dovresti pensare a una voce di registro come a un evento—qualcosa che è di interesse per la tua app che è successo in qualche momento.,

Ciò significa che, come minimo, abbiamo bisogno di un timestamp e una descrizione dell’evento. La descrizione potrebbe anche includere dati pertinenti. Questo non è sempre facile da determinare in anticipo. Pensa a cosa avresti bisogno per risolvere uno script che non è riuscito a funzionare correttamente. E se in seguito incontri una situazione in cui avresti richiesto più informazioni per risolvere un problema, aggiungilo alla registrazione per la prossima volta.,

Meno ovvio, ma molto utile, è includere un livello di log:

  • Al livello più basso, le istruzioni di debug possono essere utili per tenere traccia del flusso eseguito dello script PowerShell.
  • Un livello superiore sono messaggi informativi sul lato funzionale del tuo script: cosa è stato eseguito, perché e con quali dati?
  • Poi c’è anche il livello di avvertimenti: cose che non sono normali e potenzialmente dannose ma che non impediscono allo script di continuare.
  • Infine, i messaggi a livello di errore sono lì per registrare gli errori che hanno causato il crash dello script.,

È possibile scegliere di registrare tutti questi livelli o solo un livello specifico e superiore (ad esempio, avvisi ed errori). Quindi, quando hai bisogno di ulteriori informazioni, puoi configurare il tuo script per registrare anche maggiori dettagli sulla prossima esecuzione.

La nostra semplice funzione di registrazione non includeva i livelli di registro. Né ha aggiunto un timestamp. Potremmo aggiungere questa funzionalità, naturalmente, ma per fortuna altri hanno già creato script di registrazione decenti.

Inserisci lo script di registrazione

C’è uno script semplice ma utile su Technet chiamato Write-Log., Se lo scarichiamo, possiamo cambiare il nostro script in questo modo:

Abbiamo incluso il file Function-Write-Log.ps1, rimosso la nostra funzione di log e sostituito la chiamata con una chiamata a Write-Log. Possiamo passare un messaggio, un livello e un percorso. Il livello può essere Info, Warn o Error. Si noti che questo script non ha un livello di debug, il che è sfortunato. Si potrebbe, tuttavia, facilmente modificarlo per includerlo, dal momento che lo script è rilasciato sotto la licenza MIT permettendo la modifica.,

Quando usiamo questo script, il nostro registro sarà simile a questo:

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

Ora abbiamo linee di registro chiare che includono un timestamp, il livello di registro e il nostro messaggio. Questo è molto meglio di quello che avevamo in precedenza. Questo può essere sufficiente per le tue esigenze, ma facciamo un passo avanti e guardiamo un’altra opzione: il PSFramework.

Inserisci il framework di registrazione

PSFramework è un framework PowerShell che include diverse utilità utili. Stiamo solo andando a guardare la parte di registrazione.,

Per iniziare con PSFramework, è necessario prima installarlo eseguendo Install-Module PSFramework in PowerShell. (Potrebbe essere necessario eseguire la console PowerShell come amministratore). Quindi, è possibile scrivere nei file di registro chiamando lo script Write-PSFMessage. Nel nostro caso, sarebbe simile a questo:

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

Nota come non stiamo usando un livello di informazioni. Invece, stiamo usando l’Output. Questo perché PSFramework utilizza livelli di log che corrispondono più bene con i diversi flussi di output che PowerShell ha di default: Verbose, Host, Output, Warning, Error, ecc.,

Anche il file di registro avrà un aspetto leggermente diverso da quello a cui siamo abituati:

Mancano le intestazioni delle colonne, ma ciò può essere facilmente risolto impostando prima il provider di registrazione:

Questo file di registro includerà un timestamp nel nome del file e ora includerà una riga di intestazione. Questo perché il provider di log predefinito di PSFramework non aggiungerà una riga di intestazione, ma lo farà il provider del file di log., Il file di log sarà ora simile a questo:

Questo ora include molte informazioni utili come il nome del file del nostro script, la riga in cui si è verificato il logging e il nome utente dell’utente che sta eseguendo lo script. Un altro grande vantaggio della registrazione da parte di PSFramework è che registra in modo asincrono. La registrazione non rallenterà i tuoi script. Infine, sarà anche pulire automaticamente i registri. Per impostazione predefinita, rimuoverà i file di registro dopo sette giorni o quando superano i 100 megabyte.,

Un confronto

Lo script Function-Write-Log corrisponde più a quello a cui sono abituati molti programmatori di applicazioni. Include i livelli di registro standard (ad eccezione del Debug) e scrive un file di registro come fanno molti framework di registrazione: un timestamp, il livello di registro e il messaggio.

Tuttavia, manca alcune funzionalità extra che potrebbero essere cruciali per te: log clean up; registrazione asincrona; e informazioni tecniche extra come lo script, il numero di riga e l’utente in esecuzione.,

La registrazione PSFramework fornisce queste funzionalità, anche se richiede l’installazione dell’intero framework. Questo non dovrebbe essere un vero problema, ma è qualcosa da tenere a mente. Il PSFramework utilizza anche diversi livelli di registrazione rispetto a quelli a cui siamo abituati. Tuttavia, corrispondono strettamente ai flussi di output di PowerShell. Questo potrebbe sembrare più naturale per gli utenti esperti di PowerShell.

Quali sono le prospettive?

Abbiamo dato un’occhiata a un modo semplice per accedere a PowerShell. Abbiamo anche migliorato la nostra soluzione utilizzando uno script migliore (Function-Write-Log. ps1) e utilizzando la registrazione inclusa in PSFramework.,

Una cosa che mi ha colpito è che l’accesso a PowerShell è ancora abbastanza semplice. Non è che le opzioni che abbiamo guardato siano cattive o carenti. Ma non ho trovato un singolo script o modulo di registrazione che includa più livelli di log, registrazione asincrona, pulizia dei log e, soprattutto, più destinazioni di log.

Cosa succede se vogliamo inviare errori a un indirizzo email? O se vogliamo accedere a un database? Per quanto posso vedere, PSFramework offre la maggior parte delle opzioni qui, ma e-mail o database non sono inclusi. Potrebbe essere possibile scrivere il proprio e registrarlo in PSFramework, però.,

Questo potrebbe essere perché il mondo di PowerShell è diverso dal mondo dello sviluppo di applicazioni. Gli script PowerShell possono essere molto più personalizzati, pensati per uno scenario specifico e composti da più script separati.

Tuttavia la registrazione rimane importante, specialmente con script che vengono eseguiti regolarmente e hanno un certo livello di complessità. PowerShell è un linguaggio potente per automatizzare una moltitudine di attività. Quando qualcosa va storto con un tale compito, vuoi sapere cosa è andato storto, cosa l’ha preceduto e come risolverlo. I log ti danno queste informazioni.,

Come passo successivo, potresti voler esaminare l’aggregazione e la gestione dei tuoi log. Scalyr è un ottimo strumento per questo. Dai un’occhiata all’API Scalyr per le diverse opzioni di invio di eventi di log a Scalyr. Questo può essere facilmente chiamato da PowerShell e migliorerà la vostra capacità di monitoraggio e risoluzione dei problemi gli script PowerShell.

Questo post è stato scritto da Peter Morlion., Peter è un programmatore appassionato che aiuta le persone e le aziende a migliorare la qualità del loro codice, specialmente nelle basi di codice legacy. Crede fermamente che le migliori pratiche del settore siano inestimabili quando si lavora verso questo obiettivo, e le sue specialità includono TDD, DI e principi SOLIDI.