en nuestra serie «Introducción al registro», ya hemos cubierto el registro de muchos lenguajes y frameworks: C#, Java, Python, Ruby, Ruby on Rails, Node.js, Symfony, Kotlin, Flask, Angular y Laravel. Hoy añadiremos otro a esta serie: PowerShell.

Puede ser extraño agregarlo a la lista; PowerShell es un lenguaje de scripting, mientras que los demás pueden verse como lenguajes de programación de aplicaciones completos o frameworks., Sin embargo, PowerShell es tan potente que puede crear sistemas lo suficientemente complejos e importantes como para garantizar el registro.

PowerShell se utiliza a menudo para realizar tareas de mantenimiento críticas en equipos o servidores. Es importante que los administradores sepan si estos scripts funcionaron bien o no.

veremos cómo puede iniciar sesión con PowerShell de una manera muy básica escribiendo su propia función de registro. Luego cubriremos por qué el registro desde PowerShell es útil. También hablaremos sobre lo que debe registrar y lo que no debe registrar., Finalmente, veremos dos opciones diferentes que harán que su vida de registro sea más fácil.

Un Simple Script de PowerShell

Vamos a empezar con este extremadamente simple script de PowerShell:

Este script básico toma un entero como entrada. Luego hace la suma de los dígitos de ese número. Si el resultado es más largo que un solo dígito, realiza la operación de nuevo, hasta que esto resulte en un solo dígito.,

Aquí hay algunos ejemplos para aclarar las cosas:

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

Poner este script en un archivo de texto y guárdelo como recursiveSum.ps1. A continuación, puede ejecutar en el PowerShell de la línea de comandos ejecutando recursiveSum.ps1 45, por ejemplo., La salida será 9:

Este es un script que es lo suficientemente simple como para funcionar como ejemplo, pero tiene suficientes pasos que podrían interesarnos en algún registro. Por supuesto, los scripts de PowerShell de la vida real serán mucho más complejos, lo que justificará la necesidad de registrar aún más.

la forma más fácil de iniciar sesión en PowerShell

vamos a escribir el resultado de cada paso en la consola. Ya estamos escribiendo algo en la consola usando la instrucción Write-Output, por lo que podemos volver a usarla fácilmente., Cambiar el bucle while para que se incluya dicha declaración:

Cuando se ejecuta ahora, usted debería ser capaz de ver una salida como esta:

¡Eso es genial! Tenemos algunos registros en marcha. Sin embargo, estas instrucciones de registro siempre serán visibles. En un programa más complejo, podría tener sentido mostrar nada a menos que el usuario quiera ver el registro. Probablemente también sea útil darle al usuario cierto control sobre la cantidad de detalles que ve. Aquí es donde entran los niveles de registro.,

niveles de registro en PowerShell

PowerShell tiene algunas instrucciones Write-* que se asignan a niveles de registro tradicionales como:

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

Verbose

veamos primero Write-Verbose. Podemos cambiar nuestros mensajes sobre los pasos intermedios para usar Write-Verbose., Cuando ejecutamos nuestro script ahora, no veremos nuestros pasos intermedios:

pero si agregamos la bandera-Verbose, nuestros registros aparecerán una vez más:

depuración, información y advertencia

los niveles de registro de depuración, información y advertencia funcionan un poco diferente de lo que estamos acostumbrados a los marcos de registro tradicionales en otros idiomas., Vamos a agregar algunas instrucciones adicionales primero:

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

El Write-Debug solo será visible cuando agregue el indicador-Debug. También detendrá la ejecución del script y pedirá confirmación para continuar. Esto es útil para ejecutar tus scripts paso a paso.

Pero tienen un cierto control sobre si se debe o no mostrar las advertencias y los mensajes de información. Los comandos Write-Warning y Write-Information se pueden controlar usando los indicadores-WarningAction y-InformationAction.,se banderas, sólo los mensajes de advertencia se muestra:

Si queremos que se muestre la información de los mensajes, podemos hacerlo añadiendo-InformationAction Continuar bandera:

Y si queremos ocultar las advertencias, podemos usar la opción-WarningAction SilentlyContinue opción:

Error

por último, echemos un vistazo a cómo Escribir-Error de obras., Podemos agregar dicha instrucción a nuestro script:

Write-Error "Something went wrong"

Cuando se ejecuta esta instrucción, PowerShell detendrá la ejecución de nuestro script y escribirá el error en la consola, junto con algunos detalles que podrían ser útiles:

¿qué es el registro de aplicaciones?

ahora vamos a alejarnos de nuestro script de PowerShell y ver qué es exactamente el registro de aplicaciones., El primer post de nuestra serie lo definió bien:

el registro de aplicaciones implica registrar información sobre el comportamiento de tiempo de ejecución de su aplicación en un medio más persistente.

ya estamos haciendo la primera parte: en otras palabras, capturando información sobre el comportamiento en tiempo de ejecución de nuestra aplicación. Estamos mostrando los resultados intermedios de nuestro proceso. Pero no vamos a hacer la segunda parte. No estamos grabando esta información en un medio persistente. Cuando cerramos nuestra sesión de PowerShell, hemos perdido esta información. Hagámoslo primero.,

registro en un archivo

agregaremos esta función de registro a nuestro archivo de script:

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

simplemente toma una cadena y luego la agrega a un registro.archivo txt.,

entonces podemos cambiar nuestra instrucción de registro para que ya no use Write-Verbose sino esta función de Registro:

Log "Intermediate result: $($sum)"

ahora podemos ejecutar nuestro script y creará un archivo que contenga nuestros pasos intermedios:

pero si ejecutamos nuestro script varias veces, solo será una larga lista de instrucciones. No tenemos forma de saber cuándo se registraron las líneas. En un escenario más complejo, que contiene múltiples scripts, tampoco tenemos forma de saber dónde se originó la línea de registro-I. e.,, de la que el archivo ps1. Hay más información que podríamos estar registrando.

de nuevo, demos un paso atrás y veamos lo que estamos tratando de lograr con el registro.

¿por qué registramos?

PowerShell se utiliza a menudo para automatizar y crear scripts para ciertas tareas que de otro modo serían tediosas y propensas a errores. La automatización realmente comienza a proporcionar valor cuando se aplica a tareas más complejas. Pero estos scripts complejos también pueden tener más posibilidades de romperse: los servicios pueden no responder, las configuraciones de la máquina pueden haber cambiado, etc.,

sin registro, es difícil saber si los scripts funcionaron bien o si algo salió mal. Si algo salió mal, la tala nos ayudará a averiguar dónde y por qué lo hizo. El registro de aplicaciones también puede ayudarlo a recopilar información sobre qué partes de sus scripts se están utilizando más o dónde se pueden obtener ganancias de rendimiento.

Qué no Deberíamos de Registro?

Cuando escriba sus declaraciones de Registro, asegúrese de omitir datos confidenciales o personales., Los ejemplos incluyen:

  • contraseñas y tokens de acceso
  • números de tarjetas de crédito o números de cuentas bancarias
  • números de Seguro social
  • direcciones de correo electrónico
  • direcciones de calle
  • claves de cifrado
  • números de Seguro social

la hoja de trucos de OWASP sobre el registro tiene una sección Sobre datos para excluir que es interesante leer. Aunque está dirigido a aplicaciones completas, también podría ser útil para scripts de PowerShell. Puedo imaginar escenarios en los que los scripts de PowerShell manejan direcciones de correo electrónico o ciertas claves API.,

registrar dicha información de identificación personal (o PII) es peligroso. No solo necesita el consentimiento explícito del usuario en la mayoría de los países, sino que si los datos se filtran, usted o su empresa podrían ser responsables. Si no es realmente necesario, es mejor dejar estos datos.

¿qué debería registrar?

nuestro artículo sobre cómo comenzar con el registro de Ruby hace un gran punto:

debería pensar en una entrada de registro como un evento, algo que es de interés para su aplicación que sucedió en algún momento.,

Esto significa que, como mínimo, necesitamos una fecha y una descripción del evento. La descripción también podría incluir datos pertinentes. Esto no siempre es fácil de determinar por adelantado. Piense en lo que necesitaría para solucionar un script que no se ejecutó correctamente. Y si más tarde se encuentra con una situación en la que habría requerido Más información para solucionar un problema, agréguelo al registro para la próxima vez.,

menos obvio, pero muy útil, es incluir un nivel de registro:

  • En el nivel más bajo, las instrucciones de depuración pueden ser útiles para rastrear el flujo ejecutado de su script de PowerShell.
  • a subir de nivel son mensajes informativos sobre el lado funcional de su script: ¿qué se ejecutó, por qué y con qué datos?
  • también está el nivel de Advertencias: cosas que no son normales y potencialmente dañinas, pero que no impiden que el script continúe.
  • Finalmente, los mensajes de nivel de Error están ahí para registrar los errores que han hecho que el script se bloquee.,

Puede elegir registrar todos estos niveles o solo un nivel específico y arriba (por ejemplo, advertencias y errores). Luego, cuando necesite más información, puede configurar su script para registrar también más detalles sobre la próxima ejecución.

nuestra propia función de registro simple no incluía niveles de registro. Tampoco añadió una marca de tiempo. Podríamos agregar esta funcionalidad, por supuesto, pero afortunadamente otros ya han creado scripts de registro decentes.

introduzca el Script de Registro

Hay un script sencillo pero útil en Technet llamado Write-Log., Si lo descargamos, podemos cambiar nuestro script para que se vea así:

hemos incluido el archivo Function-Write-Log. ps1, eliminamos nuestra función Log y reemplazamos la llamada por una llamada a Write-Log. Podemos pasar un mensaje, un nivel y un camino. El nivel puede ser Info, Warn o Error. Observe que este script no tiene un nivel de depuración, lo cual es desafortunado. Sin embargo, podría modificarlo fácilmente para incluirlo, ya que el script se libera bajo la licencia MIT que permite la modificación.,

Cuando usamos este script, nuestro registro se verá así:

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

ahora tenemos líneas de registro claras que incluyen una marca de tiempo, el nivel de registro y nuestro mensaje. Eso es mucho mejor de lo que teníamos antes. Esto puede ser suficiente para tus necesidades, pero vamos un paso más allá y veamos otra opción: el PSFramework.

introduzca el marco de trabajo de Registro

PSFramework es un marco de trabajo de PowerShell que incluye varias utilidades útiles. Sólo vamos a ver la parte de la tala.,

para comenzar con PSFramework, primero deberá instalarlo ejecutando Install-Module PSFramework en PowerShell. (Es posible que tenga que ejecutar la consola de PowerShell como administrador). Luego, puede escribir en los archivos de registro llamando al script Write-PSFMessage. En nuestro caso, se vería así:

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

observe cómo no estamos utilizando un nivel de información. En su lugar, estamos utilizando la salida. Esto se debe a que PSFramework utiliza niveles de registro que coinciden mejor con los diferentes flujos de salida que PowerShell tiene de forma predeterminada: Verbose, Host, Output, Warning, Error, etc.,

el archivo de registro también se verá ligeramente diferente de lo que estamos acostumbrados:

faltan los encabezados de columna, pero eso se puede remediar fácilmente configurando primero el proveedor de Registro:

Este archivo de registro incluirá una marca de tiempo en el nombre del archivo, y ahora incluirá una fila de encabezado. Esto se debe a que el proveedor de registro predeterminado de PSFramework no agregará una fila de encabezado, pero sí el proveedor de archivos de registro., El archivo de registro ahora se verá así:

esto ahora incluye una gran cantidad de información útil como el nombre de archivo de nuestro script, la línea donde se produjo el registro y el nombre de usuario del usuario que está ejecutando el script. Otra gran ventaja del registro de PSFramework es que registra de forma asíncrona. El registro no ralentizará sus scripts. Finalmente, también limpiará automáticamente sus registros. De forma predeterminada, eliminará los archivos de registro después de siete días o cuando excedan los 100 megabytes.,

una comparación

el script Function-Write-Log coincide más con lo que muchos programadores de aplicaciones están acostumbrados. Incluye los niveles de registro estándar (excepto Debug) y escribe un archivo de registro como hacen muchos marcos de registro: una marca de tiempo, el nivel de registro y el mensaje.

sin embargo, le falta alguna funcionalidad adicional que podría ser crucial para usted: limpieza de Registros; registro asincrónico; e información técnica adicional como el script, el número de línea y el usuario de ejecución.,

el registro de PSFramework proporciona estas características, aunque requiere que instale todo el marco. Esto no debería ser un problema real, pero es algo a tener en cuenta. PSFramework también utiliza diferentes niveles de registro de los que estamos acostumbrados. Sin embargo, coinciden estrechamente con los flujos de salida de PowerShell. Esto puede parecer más natural para los usuarios experimentados de PowerShell.

¿qué sigue?

hemos echado un vistazo a una forma sencilla de iniciar sesión en PowerShell. También hemos mejorado nuestra propia solución mediante el uso de un mejor script (Function-Write-Log. ps1) y mediante el uso del registro incluido en PSFramework.,

una cosa que me llamó la atención fue que el registro en PowerShell sigue siendo bastante básico. No es que las opciones que vimos son malas o carentes. Pero no encontré un solo script o módulo de registro que incluya múltiples niveles de registro, registro asíncrono, limpieza de Registros y, lo más importante, múltiples destinos de registro.

¿Qué pasa si queremos enviar errores a una dirección de correo electrónico? ¿O qué pasa si queremos iniciar sesión en una base de datos? Por lo que puedo ver, PSFramework ofrece la mayoría de las opciones aquí, pero el correo electrónico o la base de datos no están incluidos. Sin embargo, podría ser posible escribir el suyo propio y registrarlo en PSFramework.,

esto puede deberse a que el mundo de PowerShell es diferente del mundo del desarrollo de aplicaciones. Los scripts de PowerShell pueden ser mucho más personalizados, diseñados para un escenario específico y compuestos de varios scripts separados.

sin embargo, el registro sigue siendo importante, especialmente con scripts que se ejecutan regularmente y tienen un cierto nivel de complejidad. PowerShell es un lenguaje potente para automatizar multitud de tareas. Cuando algo sale mal con tal tarea, usted quiere saber qué salió mal, qué la precedió y cómo arreglarla. Los registros le dan esta información.,

Como un siguiente paso, es posible que desee buscar en la agregación y la gestión de sus registros. Scalyr es una gran herramienta para esto. Eche un vistazo a la API de Scalyr para ver las diferentes opciones de envío de eventos de registro a Scalyr. Esto se puede llamar fácilmente desde PowerShell y mejorará su capacidad de supervisión y solución de problemas de sus scripts de PowerShell.

Este post fue escrito por Peter Morlion., Peter es un programador apasionado que ayuda a personas y empresas a mejorar la calidad de su código, especialmente en bases de código heredadas. Cree firmemente que las mejores prácticas de la industria son invaluables cuando se trabaja hacia este objetivo, y sus especialidades incluyen TDD, DI y SOLID principles.