I vores “Kom godt i Gang med Logning” – serien, har vi allerede dækket skovhugst til mange sprog og rammer: C#, Java, Python, Ruby, Ruby on Rails, Node.js, Symfoni, Kotlin, kolbe, kantede, og Laravel. I dag tilføjer vi en anden til denne serie: Po .ershell.
det kan være underligt at tilføje til listen; Po .ershell er et scriptsprog, mens de andre kan ses som fulde programmeringssprog eller rammer., Alligevel Po .ershell er så tilstrækkeligt kraftfuld, at det kan skabe systemer komplekse og vigtige nok til at berettige logning.
Po .ershell bruges ofte til at udføre kritiske vedligeholdelsesopgaver på computere eller servere. Det er vigtigt for admins at vide, hvordan hvis disse scripts kørte godt eller ej.
Vi vil se på, hvordan du kan logge med Po .ershell på en meget grundlæggende måde ved at skrive din egen logningsfunktion. Så dækker vi, hvorfor logning fra Po .ershell er nyttig. Vi vil også tale om, hvad du skal logge, og hvad du ikke skal logge., Endelig vil vi se på to forskellige muligheder, der vil gøre din logning liv lettere.
En Simpel PowerShell Script
Lad os starte med denne meget simple PowerShell script:
Denne grundlæggende script, der tager et heltal som input. Det gør derefter summen af cifrene i dette nummer. Hvis resultatet er længere end et enkelt ciffer, udfører det operationen igen, indtil dette resulterer i et enkelt ciffer.,
Her er nogle eksempler til at tydeliggøre tingene:
- 45 -> 4 + 5 = 9
- 397 -> 3 + 9 + 7 = 19 -> 1 + 9 = 10 -> 1 + 0 = 1
- 3 -> 3
Sætte dette script i en tekstfil og gemme det som recursiveSum.ps1. Du kan derefter køre den på den PowerShell-kommando-linjen ved at køre recursiveSum.ps1 45, for eksempel., Produktionen vil være 9:
Dette er et script, der er simpel nok til at fungere som et eksempel, men har nok skridt, som vi kunne være interesseret i nogle skovhugst. Selvfølgelig vil Po .ershell-scripts i det virkelige liv være meget mere komplekse, hvilket garanterer behovet for at logge endnu mere.
den nemmeste måde at logge ind på Po .ershell
lad os skrive resultatet af hvert trin til konsollen. Vi skriver allerede noget til konsollen ved at bruge Skriveudgangsopgørelsen, så vi kan nemt bruge det igen., Ændre While-løkke til at omfatte en sådan erklæring:
Når du kører det nu, du bør være i stand til at se et output som dette:
Det er fantastisk! Vi har nogle logning foregår. Disse logopgørelser vil dog altid være synlige. I et mere komplekst program kan det være fornuftigt at vise intet, medmindre brugeren ønsker at se logningen. Det er nok også nyttigt at give brugeren en vis kontrol over mængden af detaljer, de ser. Det er her log niveauer kommer ind.,
Log Niveauer i PowerShell
PowerShell har nogle Skrive-* erklæringer, der knyttes til traditionelle log niveauer som:
- Skriv-Verbose
- Skriv-Debug
- Skriv-Oplysninger
- Skriv-Advarsel
- Skriv-Fejl
Verbose
Lad os se på Skrive-Verbose første. Vi kan ændre vores meddelelser om de mellemliggende trin for at bruge Skriv-Verbose., Når vi kører vores script nu, vi vil ikke se vores mellemliggende trin:
Men hvis vi tilføje -Verbose flag, vores logs vises igen:
Debug, Information og Advarsel
Debug, Information og Varsling log niveauer arbejder lidt anderledes end vi er vant til fra traditionelle logge rammer på andre sprog., Lad os tilføje nogle ekstra udsagn først:
Write-Debug "This is a debug statement"Write-Information "This is an info statement"Write-Warning "This is a warning statement"
skrivefejlen vil kun være synlig, når du tilføjer-Debug-flaget. Det vil også stoppe dit script fra at køre og bede om bekræftelse for at fortsætte. Dette er nyttigt at køre gennem dine scripts trin for trin.
Men du har en vis kontrol over, hvorvidt eller ikke at vise advarsler og oplysninger beskeder. De skrive-advarsel og skrive-Information kommandoer kan styres ved hjælp af-Wararningaction og-InformationAction flag.,se flag, kun de advarsler, der er vist herunder:
Hvis vi ønsker at vise de oplysninger, meddelelser, kan vi gøre det ved at tilføje-InformationAction Fortsætte med flag:
Og hvis vi ønsker at skjule de advarsler, vi kan bruge-WarningAction SilentlyContinue mulighed:
Fejl
Endelig, lad os se på, hvordan Write-Error værker., Vi kan tilføje sådan en erklæring om, at vores script:
Write-Error "Something went wrong"
Når denne sætning er udført, PowerShell vil stoppe udførelsen af vores script og skrive fejl på konsollen, sammen med nogle detaljer, som kan være nyttige:
Hvad Er Anvendelse Logge?
lad os nu tage et skridt væk fra vores Po .ershell-script og se på, hvilken applikationslogning der er nøjagtigt., Det første indlæg i vores serie definerede det godt:
Programlogning involverer optagelse af oplysninger om din applikations runtime-adfærd til et mere vedvarende medium.
Vi laver allerede den første del: med andre ord at fange oplysninger om vores applikations runtime-adfærd. Vi viser de mellemliggende resultater af vores proces. Men vi laver ikke den anden del. Vi optager ikke disse oplysninger til et vedvarende medium. Når vi lukker vores Po .ershell-session, har vi mistet disse oplysninger. Lad os gøre det først.,
logning til en fil
Vi tilføjer denne Logfunktion til vores scriptfil:
Function Log { param( $msg ) Add-Content log.txt $msg}
det tager simpelthen en streng og tilføjer den derefter til en log.t filet-fil.,
Så kan vi ændre vores log-sætning, så den ikke længere bruger Skriv-Verbose, men denne Log-funktion i stedet for:
Log "Intermediate result: $($sum)"
Nu kan vi køre vores script, og det vil skabe en fil, der indeholder vores mellemliggende trin:
Men hvis vi kører vores script flere gange, vil det bare være en lang liste af erklæringer. Vi har ingen mulighed for at vide, hvornår linjerne blev logget. I et mere komplekst scenarie, der indeholder flere scripts, har vi heller ingen mulighed for at vide, hvor loglinjen stammer fra-dvs.,, hvorfra ps1-fil. Der er flere oplysninger, som vi kan logge på.
igen, lad os tage et skridt tilbage og se på, hvad vi forsøger at opnå med logning.
hvorfor logger vi?
Po .ershell bruges ofte til at automatisere og script visse opgaver, der ellers ville være kedelige og fejlbehæftede. Automatisering begynder virkelig at give værdi, når den anvendes til mere komplekse opgaver. Men disse komplekse scripts kan også have større chance for at bryde: tjenester reagerer muligvis ikke, maskinkonfigurationer kan have ændret sig osv.,
uden logning er det svært at vide, om scripts kørte fint, eller hvis noget gik galt. Hvis noget gik galt, vil logning hjælpe os med at finde ud af, hvor og hvorfor det gjorde. Programlogning kan også hjælpe dig med at samle indsigt i, hvilke stykker af dine scripts der bruges mest, eller hvor præstationsgevinster stadig kan foretages.
Hvad Skulle Du ikke Logge?
Når du skriver dine logopgørelser, skal du sørge for at udelade følsomme eller personlige data., Som eksempler kan nævnes:
- adgangskoder og adgang kuponer
- kredit kort tal eller bankkontonumre
- cpr-numre
- e-mail-adresser
- adresser
- krypteringsnøgler
- cpr-numre
OWASP cheat sheet om logning har et afsnit om data til at ekskludere det er interessant at læse. Selvom det er rettet mod fuldgyldige applikationer, kan det også være nyttigt for Po .ershell-scripts. Jeg kan forestille mig scenarie, hvor Po .ershell-scripts håndterer e-mail-adresser eller bestemte API-nøgler.,
logning af sådanne personligt identificerbare oplysninger (eller PII) er farligt. Ikke kun har du brug for eksplicit samtykke fra brugeren i de fleste lande, men hvis dataene nogensinde lækkes, kan du eller din virksomhed holdes ansvarlige. Hvis det ikke er virkelig nødvendigt, er det bedre at forlade disse data.
Hvad skal du logge?
Vores artikel om at komme i gang med Ruby at logge gør en stor peg:
Du bør tænke på en post i logfilen som en begivenhed, noget, der er af interesse for din app, der skete på et tidspunkt.,
dette betyder, at vi som minimum har brug for en tidsstempel og en beskrivelse af begivenheden. Beskrivelsen kan også indeholde relevante data. Dette er ikke altid let at bestemme på forhånd. Tænk over, hvad du har brug for for at fejlfinde et script, der ikke kunne køre med succes. Og hvis du senere støder på en situation, hvor du ville have krævet flere oplysninger for at løse et problem, skal du tilføje det til logningen til næste gang.,
mindre indlysende, men meget nyttigt, er at inkludere et logniveau:
- på det laveste niveau kan Debug-udsagn være nyttige til at spore den udførte strøm af dit po .ershell-script.
- et niveau op er informative meddelelser om den funktionelle side af dit script: hvad blev udført, hvorfor og med hvilke data?
- så er der også niveauet af advarsler: ting, der ikke er normale og potentielt skadelige, men som ikke forhindrer scriptet i at fortsætte.
- endelig er Fejlniveaumeddelelser der for at logge fejl, der har gjort scriptet nedbrud.,
Du kan vælge at logge alle disse niveauer eller kun et bestemt niveau og op (for eksempel advarsler og fejl). Når du derefter har brug for mere information, kan du konfigurere dit script til også at logge flere detaljer om den næste udførelse.
vores egen enkle logningsfunktion inkluderede ikke logniveauer. Det tilføjede heller ikke et tidsstempel. Vi kunne naturligvis tilføje denne funktionalitet, men heldigvis har andre allerede oprettet anstændige loggingskripter.
indtast Logningsskriptet
Der er et simpelt, men nyttigt script på Technet kaldet Writerite-Log., Hvis vi do .nloader det, kan vi ændre vores script for at se sådan ud:
Vi har inkluderet filen Function-Writerite-Log.ps1, fjernet vores Logfunktion og erstattet opkaldet med et opkald til Writerite-Log. Vi kan passere i en besked, et niveau, og en sti. Niveauet kan være Info, advare eller fejl. Bemærk, at dette script ikke har et Fejlfindingsniveau, hvilket er uheldigt. Du kan dog nemt ændre det til at inkludere det, da scriptet frigives under MIT-licensen, der tillader ændring.,
Når vi bruger dette script, vil vores log Se sådan ud:
2019-08-20 09:18:29 INFO: Intermediate result: 512019-08-20 09:18:29 INFO: Intermediate result: 6
Vi har nu klare loglinjer, der inkluderer et tidsstempel, logniveauet og vores meddelelse. Det er meget bedre end det, vi havde tidligere. Dette kan være tilstrækkeligt til dine behov, men lad os tage det et skridt videre og se på en anden mulighed: Psframe .ork.
indtast Logging Frame .ork
Psframe .ork er en Po .ershell-ramme, der indeholder flere nyttige værktøjer. Vi vil kun se på logningsdelen.,
for At komme i gang med PSFramework, vil du først nødt til at installere det ved at køre Install-Modul PSFramework i PowerShell. (Du skal muligvis køre din po .ershell-konsol som administrator). Derefter kan du skrive til logfilerne ved at kalde Writerite-psfmessage scriptet. I vores tilfælde vil det se sådan ud:
Write-PSFMessage -Level Output -Message "Intermediate result: $($sum)"
bemærk, hvordan vi ikke bruger et Infoniveau. I stedet bruger vi Output. Dette skyldes, at Psframe .ork bruger logniveauer, der matcher mere pænt med de forskellige outputstrømme, som Po .ershell har som standard: Verbose, vært, Output, Advarsel, fejl osv.,
log fil, vil også se lidt anderledes, end hvad vi er vant til:
kolonneoverskrifterne mangler, men det kan nemt afhjælpes ved at sætte logging udbyder først:
Denne log fil vil indeholde et tidsstempel i filnavnet, og vil nu omfatte en kolonneoverskrift. Dette skyldes, at Psframe .orks standardlogudbyder ikke tilføjer en overskriftsrække, men logfiludbyderen vil., Logfilen vil nu se sådan ud:
Dette indeholder nu en masse nyttige oplysninger som filnavnet på vores script, linjen, hvor logningen opstod, og brugernavnet på den bruger, der kører scriptet. En anden stor fordel ved logning ved Psframe .ork er, at den logger asynkront. Logningen vil ikke bremse dine scripts. Endelig vil det også automatisk rydde op i dine logfiler. Som standard fjerner den logfiler efter syv dage, eller når de overstiger 100 megabyte.,
En Sammenligning
Funktion-Skrive-Log script kampe mere med, hvad mange anvendelsen programmører er vant til. Det omfatter standard log niveauer (bortset fra Debug) og skriver en logfil ligesom mange logning rammer gør: en tidsstempel, log niveau, og meddelelsen.
det savner dog nogle ekstra funktioner, der kan være afgørende for dig: log rydde op; asynkron logning; og ekstra tekniske oplysninger som script, linjenummer og udførende bruger.,
Psframe .ork logning giver disse funktioner, selvom det kræver, at du installerer hele rammen. Dette bør ikke være et reelt problem, men det er noget at huske på. Psframe .ork bruger også forskellige logningsniveauer, end vi er vant til. De matcher dog tæt på Po .ershell-outputstrømmene. Dette kan føles mere naturligt for erfarne Po .ershell-brugere.
Hvad er det næste?
Vi har kigget på en enkel måde at logge ind på Po .ershell. Vi forbedrede også vores egen løsning ved at bruge et bedre script (Function-Writerite-Log.ps1) og ved at bruge logningen inkluderet i Psframe .ork.,en ting, der ramte mig, var, at logning i Po .ershell stadig er ret grundlæggende. Det er ikke, at de muligheder, vi kiggede på, er dårlige eller mangler. Men jeg fandt ikke en enkelt logning script eller modul, der indeholder flere log niveauer, asynkron logning, log rydde op, og, vigtigst af alt, flere log destinationer.
Hvad hvis vi vil sende fejl til en e-mail-adresse? Eller hvad hvis vi vil logge på en database? Så vidt jeg kan se, tilbyder Psframe .ork de fleste muligheder her, men e-mail eller database er ikke inkluderet. Det kan dog være muligt at skrive din egen og registrere den i Psframe .ork.,
dette kan skyldes, at verden af Po .ershell er anderledes end verden af applikationsudvikling. Po .ershell-scripts kan være meget mere skræddersyet, beregnet til et specifikt scenarie og sammensat af flere separate scripts.
men logning forbliver vigtig, især med scripts, der kører regelmæssigt og har en vis grad af kompleksitet. Po .ershell er et kraftfuldt sprog til at automatisere en lang række opgaver. Når noget går galt med en sådan opgave, vil du vide, hvad der gik galt, hvad der gik forud for det, og hvordan du løser det. Logs giver dig disse oplysninger.,
Som et næste skridt op, du måske ønsker at se på organisering og styring af dine logfiler. Scalyr er et godt værktøj til dette. Har kig på Scalyr API for de forskellige muligheder for at sende log begivenheder til Scalyr. Dette kan nemt blive kaldt fra PowerShell og vil forbedre din evne til overvågning og fejlfinding af din PowerShell-scripts.
dette indlæg er skrevet af Peter Morlion., Peter er en lidenskabelig programmør, der hjælper mennesker og virksomheder med at forbedre kvaliteten af deres kode, især i ældre kodebaser. Han er overbevist om, at branchens bedste praksis er uvurderlig, når han arbejder hen imod dette mål, og hans specialiteter inkluderer TDD, DI, og solide principper.
Skriv et svar