I vår «Komme i Gang med Logging» – serien, har vi allerede dekket logging for mange språk og rammeverk: C#, Java, Python, Ruby, Ruby on Rails, Node.js, Symfony, Kotlin, Kolbe, Kantete, og Laravel. I dag, vil vi legge til en annen en i denne serien: PowerShell.

Det kan være en merkelig én til å legge til listen; PowerShell er et skriptspråk, mens andre kan bli sett på som full application programming språk eller rammeverk., Ennå PowerShell er så tilstrekkelig kraftig at det kan skape komplekse systemer og viktig nok til å rettferdiggjøre logging.

PowerShell er ofte brukt til å utføre kritisk vedlikehold på datamaskiner eller servere. Det er viktig for administratorer å vite hvordan hvis disse skriptene gikk bra eller ikke.

Vi vil se på hvordan du kan logge inn med PowerShell i en svært enkel måte ved å skrive din egen logging funksjon. Deretter vil vi dekke hvorfor logging fra PowerShell er nyttig. Vi vil også snakke om hva du skal logge deg og hva du ikke bør logg., Til slutt vil vi se på to ulike alternativer som vil gjøre logge liv enklere.

En Enkel PowerShell Script

La oss starte med denne ekstremt enkel PowerShell-skript:

Denne grunnleggende skript som tar et heltall som input. Det gjør summen av sifrene i nummeret. Hvis resultatet er lengre enn et enkelt tall, er det utfører operasjonen på nytt, inntil dette resulterer i en enkelt siffer.,

Her er noen eksempler for å klargjøre ting:

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

Sette dette skriptet i en tekst-fil og lagre den som recursiveSum.ps1. Deretter kan du kjøre den på PowerShell-kommando linje ved å kjøre recursiveSum.ps1 45, for eksempel., Produksjonen vil være 9:

Dette er et skript som er enkel nok til å fungere som et eksempel, men har nok tiltak som vi kunne være interessert i noen logging. Selvfølgelig, real-life PowerShell-skript vil være mye mer komplekse, garanterer de trenger for å logge enda mer.

Den Enkleste Måten å Logge deg inn i PowerShell

La oss skrive ut resultatet av hvert trinn til konsollen. Vi er allerede å skrive noe til konsollen ved å bruke Skrive-Utgang uttalelse, så kan vi lett bruke den igjen., Endre Mens løkken for å inkludere en slik uttalelse:

Når du kjører det nå, bør du være i stand til å se en utskrift som dette:

Det er flott! Vi har noen logging skjer. Imidlertid, disse logge uttalelser vil alltid være synlig. I et mer komplekst program, kan det være fornuftig å vise noe mindre brukeren ønsker å se logging. Det er nok også nyttige til å gi brukeren kontroll over mengden detaljer som de ser. Dette er hvor logge nivåer kommer i.,

Logg Nivåer i PowerShell

PowerShell har noen Skrive-* uttalelser som kart til tradisjonelle logg nivåer som:

  • Skrive-Verbose
  • Skrive-Debug
  • Skrive-Informasjon
  • Skrive-Advarsel
  • Skrive-Feil

Verbose

La oss se på Skrive-Verbose første. Vi kan endre våre meldinger om mellomliggende trinnene for å bruke Skrive-Verbose., Når vi kjører scriptet ditt nå, kan vi ikke se våre mellomliggende trinn:

Men hvis vi legger til -Verbose flagg, loggene våre dukke opp igjen:

Debug, Informasjon og Advarsel

Debug-Informasjon, og Advarsel logg nivåer fungere litt annerledes enn det vi er vant til fra tradisjonelle logging rammeverk i andre språk., La oss legge til noen ekstra uttalelser første:

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

Skrive-Debug vil kun være synlig når du legger til -Debug-flagg. Det vil også stoppe script fra å kjøre og be om bekreftelse for å fortsette. Dette er nyttig for å kjøre gjennom dine skript trinn for trinn.

Men du ikke har noen kontroll over hvorvidt eller ikke å vise advarsler og informasjon. Skrive-Advarsel og Skrive-Informasjon kommandoer kan kontrolleres ved hjelp av den -WarningAction og -InformationAction flagg.,se flagg, bare en advarsel vises:

Hvis vi ønsker å vise informasjon, kan vi gjøre det ved å legge til -InformationAction Fortsette med flagg:

Og hvis vi ønsker å skjule advarsler, kan vi bruke -WarningAction SilentlyContinue alternativ:

Feil

til Slutt, la oss se på hvordan Skrive-Feil, fungerer., Vi kan legge en slik uttalelse til scriptet:

Write-Error "Something went wrong"

Når dette utsagnet er utført, PowerShell vil stoppe kjøring av skriptet og skrive feil til konsollen, sammen med noen detaljer som kan være nyttig:

Hva Er Programmet Logging?

La oss nå ta et skritt bort fra våre PowerShell-skript og å se på hva programmet logging er nøyaktig., Det første innlegget i vår serie definert det godt:

Program logging innebærer å registrere informasjon om programmets kjøretid virkemåten til en mer varig medium.

Vi allerede gjør den første del: med andre ord, fange informasjon om våre program er runtime atferd. Vi viser det mellomliggende resultatene av prosessen vår. Men vi er ikke å gjøre den andre delen. Vi er ikke opptak til denne informasjonen til et vedvarende medium. Når vi lukker våre PowerShell-sesjon, vi har mistet denne informasjonen. La oss gjøre det først.,

Logging til Fil

Vi vil legge til denne funksjonen Logg til vår script-fil:

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

Det tar rett og slett i en Streng og legger dem i en logg.txt-fil.,

Så vi kan endre våre log-setningen slik at den ikke lenger bruker Skrive-Detaljert, men denne funksjonen Logg i stedet:

Log "Intermediate result: $($sum)"

Nå kan vi kjøre skriptet og det vil skape en fil som inneholder våre mellomliggende trinnene:

Men hvis vi kjører skriptet flere ganger, vil det bare være en lang liste av setninger. Vi har ingen måte å vite når linjene ble logget. I et mer komplekst scenario, som inneholder flere skript, vi også har ingen måte å vite hvor de logg linje stammer, dvs., som ps1-fil. Det er flere opplysninger som vi kan være logging.

Igjen, la oss ta et skritt tilbake og se på hva vi prøver å oppnå med å logge.

Hvorfor Gjør Vi for å Logge deg?

PowerShell er ofte brukt til å automatisere og skript visse oppgaver som ellers ville være kjedelig og utsatt for feil. Automatisering virkelig begynner å gi verdi når den brukes til mer komplekse oppgaver. Men disse kompliserte skript kan også ha større sjanse for å bryte: tjenester kan ikke svare på, maskinen konfigurasjoner kan ha endret seg, etc.,

Uten å logge, det er vanskelig å vite om skript gikk fint, eller hvis noe gikk galt. Hvis noe gikk galt, logging vil hjelpe oss til å finne ut hvor og hvorfor den gjorde det. Programmet logger kan også hjelpe deg med å samle innsikt i hvilke deler av ditt skript blir brukt mest, eller der ytelse gevinster kan fortsatt gjøres.

Hva Bør Du ikke Logge deg?

Når du skriver dine logging uttalelser, sørg for at du la ut sensitive eller personlige data., Eksempler inkluderer:

  • passord og tilgang tokens
  • kredittkortnummer eller bankkontonummer
  • personnummer
  • e-postadresser
  • gateadresser
  • krypteringsnøkler
  • personnummer

Den OWASP jukse ark på logging har en del om data til å utelukke at det er interessant å lese. Selv om det er rettet mot fullverdig programmer, kan det være nyttig for PowerShell-skript for. Jeg kan forestille deg scenariet er der PowerShell-skript håndtere e-post adresser eller visse API-nøkler.,

Logging slik personlig identifiserbar informasjon (eller PII) er farlig. Ikke bare trenger du eksplisitt samtykke fra brukeren i de fleste land, men hvis dataene er stadig lekket, du eller din bedrift kan bli holdt ansvarlig. Hvis det er egentlig ikke nødvendig, det er bedre å la disse dataene ut.

Hva Bør Du Logge deg?

artikkelen Vår om å komme i gang med Ruby logging gjør et stort poeng:

Du bør tenke på en loggoppføring som en hendelse—noe som er av interesse for din app som skjedde på en gang.,

Dette betyr at på et minimum, vi trenger et tidsstempel og en beskrivelse av hendelsen. Beskrivelsen kan også omfatte relevante data. Dette er ikke alltid lett å bestemme seg på forhånd. Tenk på hva du ville trenge for å feilsøke et skript som mislyktes i å kjøre vellykket. Og hvis du senere oppstå en situasjon der du ville ha krevd mer informasjon for å løse et problem, kan du legge den til logging for neste gang.,

Mindre åpenbare, men veldig nyttig, er å inkludere en logg nivå:

  • På det laveste nivået, Debug uttalelser kan være nyttig å spore utført flyten av PowerShell-skript.
  • Et nivå opp er Informative meldinger om den funksjonelle siden av skriptet: hva ble henrettet, hvorfor og med hvilke data?
  • Så er det også nivået av Advarsler: ting som ikke er vanlig og kan være skadelig, men som ikke hindre at skript fra å fortsette.
  • til Slutt, Feil-nivå meldinger er der for å logge feil som har gjort script krasje.,

Du kan velge å logge alle disse nivåene eller bare et bestemt nivå og opp (for eksempel advarsler og feil). Deretter, når du trenger mer informasjon, kan du konfigurere ditt manuskript til også logge deg mer detaljer på neste kjøring.

Vår egen enkel logging funksjon ikke inkluderer logg nivåer. Det gjorde heller ikke det legge et tidsstempel. Vi kan legge til denne funksjonaliteten selvfølgelig, men heldigvis andre har allerede opprettet anstendig logging skript.

Angi Logging Script

Det er en enkel, men nyttig script på Technet kalt Skrive Logg., Hvis vi laste det ned, vi kan endre våre skript til å se ut som dette:

Vi har lagt Funksjonen til å Skrive Logg.ps1-fil, fjernet vår Logg funksjon, og erstattet samtale med en oppfordring til å Skrive Logg. Vi kan passere i en melding, en plan, og for en bane. Nivået kan være Info, Advare eller Feil. Legg merke til at dette skriptet ikke har en Debug-nivå, noe som er uheldig. Du kan, imidlertid, du kan enkelt endre det for å inkludere det, siden skriptet er utgitt under MIT-lisensen tillater endring.,

Når vi bruker dette skriptet, vår logge vil se ut som dette:

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

Vi har nå tøm logg linjer som inkluderer et tidsstempel, logg nivå, og vårt budskap. Det er mye bedre enn det vi hadde tidligere. Dette kan være tilstrekkelig for dine behov, men la oss ta det ett skritt videre og se på en annen mulighet: den PSFramework.

Angi Logging Rammeverk

PSFramework er en PowerShell rammeverk som inneholder flere nyttige verktøy. Skal vi bare se på logging del.,

for Å komme i gang med PSFramework, må du først installere det ved å kjøre Installere-Modul PSFramework i PowerShell. (Du kan ha for å kjøre PowerShell-konsollen som administrator). Deretter kan du skrive til loggfilene ved å ringe Skrive-PSFMessage script. I vårt tilfelle, ville det se ut som dette:

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

legg Merke til hvordan vi bruker ikke en Info-nivå. I stedet, vi bruker Utgang. Dette er fordi PSFramework bruker logg nivåer som samsvarer mer pent med at ulike utgang bekker som PowerShell har som standard: Detaljert, være Vert for, Lagre, Advarsel, Feil, etc.,

loggfilen vil også se litt annerledes enn hva vi er vant til:

kolonneoverskriftene mangler, men det kan lett ordnes ved å sette logging leverandøren første:

Denne filen vil inneholde et tidsstempel i filnavnet, og vil nå inneholde en overskriftsrad. Dette er fordi PSFramework standard logg leverandør vil ikke legge til en topptekst rad, men loggfil leverandør vil., Loggfilen vil nå se ut som dette:

Dette nå inneholder mye nyttig informasjon som filnavn på vår script, på linje hvor å logge skjedde, og brukernavnet til brukeren som kjører skriptet. En annen stor fordel med logging av PSFramework er at den logger seg asynkront. Logging ikke vil avta din skript. Til slutt, vil det også automatisk rydde opp i loggene. Som standard, det vil fjerne loggfiler etter syv dager, eller når de overstiger 100 megabyte.,

Sammenligning

Funksjon-Write-Log script samsvarer mer med hva mange program programmerere er vant til. Det inkluderer standard logg nivåer (med unntak for Debug) og skriver en logg-fil som mange logging rammeverk gjøre: et tidsstempel, logg nivå, og meldingen.

Imidlertid, det savner noen ekstra funksjonalitet som kan være avgjørende for deg: logg rydde opp; asynkron logging, og ekstra teknisk informasjon, som skriptet, linje tall, og gjennomføre bruker.,

PSFramework logging gir disse funksjonene, selv om det krever at du installerer hele rammen. Dette bør ikke være et reelt problem, men det er noe å huske på. Den PSFramework bruker også forskjellige logging nivåer enn vi er vant til. Men, de er like tett til PowerShell output strømmer. Dette kan føles mer naturlig å krydret PowerShell-brukere.

Hva er Neste?

Vi har tatt en titt på en enkel måte å logge deg inn i PowerShell. Vi har også forbedret på vår egen løsning ved å bruke en bedre script (Funksjon-Skrive Logg.ps1), og ved å bruke logging inkludert i PSFramework.,

En ting som slo meg var at logging i PowerShell er fortsatt ganske grunnleggende. Det er ikke det at alternativene vi har sett på er dårlig eller mangler. Men jeg fant ikke en eneste logging script eller en modul som inneholder flere logge nivåer, asynkron logging, logg rydde opp, og, viktigst av alt, flere logge destinasjoner.

Hva hvis vi ønsker å sende feil til en e-postadresse? Eller hva hvis vi ønsker å logge til en database? Så vidt jeg kan se, PSFramework tilbyr mange muligheter her, men e-post eller database er ikke inkludert. Det kan være mulig å skrive din egen og registrere den i PSFramework, skjønt.,

Dette kan være fordi verden av PowerShell er forskjellig som den verden av programutvikling. PowerShell-skript kan være mye mer skreddersydde, ment for et bestemt scenario, og består av flere separate skript.

Likevel logging er fortsatt viktig, spesielt med skript som kjører regelmessig og har et visst nivå av kompleksitet. PowerShell er et kraftfullt språk for å automatisere en rekke oppgaver. Når noe går galt med en slik oppgave, vil du vite hva som gikk galt, hva som gikk forut for den, og hvordan for å fikse det. Logger gi deg denne informasjonen.,

Som et neste trinn opp, du ønsker kanskje å se på å samle og administrere loggene. Scalyr er et flott verktøy for dette. Må se på Scalyr API for de ulike alternativene for å sende logger hendelser til Scalyr. Dette kan lett kalles fra PowerShell og vil forbedre din evne til overvåkning og feilsøking på PowerShell-skript.

Dette innlegget ble skrevet av Peter Morlion., Peter er en lidenskapelig programmerer som hjelper mennesker og selskaper med å forbedre kvaliteten på koden sin, spesielt i eldre codebases. Han er overbevist om at beste praksis i bransjen er uvurderlig når du arbeider mot dette målet, og hans spesialiteter inkluderer TDD, DI, og SOLID prinsippene.