En general, los que nos dedicamos a los sistemas somos bastante perezosos a la hora de programar, aunque en principio hay un abismo entre programadores o picateclas e IT Pros o pelacables, existe una zona “oscura” para ambos mundos, que son los scripts.
¿Los tendrían que hacer los programadores sin conocimientos profundos de los sistemas o los IT Pros sin conocimientos profundos de programación?
En mi opinión, los IT Pros tenemos que ponernos las pilas y meterle caña al scripting,es muuuuy sencillo el crear un script para automatizar tareas repetitivas o complejas y no requiere grandes conocimientos de programación. Por esto mismo he decidido crear unas series “Scripting People” de ejemplos útiles en nuestra vida para resolver las tareas repetitivas, aburridas o complejas que voy encontrando en mi camino.
Esta vez os dejaré algo facilillo… Un script de reciclado de logs. ¿No os habéis encontrado con sistemas con un disco duro algo escaso y que generan tal cantidad de logs (o archivos) que nos llenan el disco duro y nos tenemos que pelar un montón de horas para solucionar el problema? Pues ahí va mi humilde solución…
Por cierto, no esperéis scripts con un alto nivel de complejidad de código, los explicaré todo lo que considere oportuno y seguro que hay una mejor forma de hacerlos, pero esta es la mía.
1 |
****************************************************************** <br />' Scripting People - Reciclado de Logs<br />' by Oscar Marin<br />'(como habreis observado evito usar tildes y<br />' simbolos extranyos para que no hayan problemas<br />' de compatibilidad con nada)<br />' Definimos el Directorio de busqueda<br />path = "C:\programa_pesado\logs"<br /><br />' Definimos la fecha de borrado de los ficheros<br />killdate = date() - 90<br /><br />' La fecha seria, la actual menos 90 dias, es decir,<br />' borraremos los ficheros mas antiguos de 3 meses<br />' Definimos un patron de busqueda, por si hay logs<br />' con diferente nombre, en este caso borraremos los<br />' access-log-fecha.log (basta con definir un trozo<br />' unico en la cadena de busqueda)<br />patron = "access-"<br /><br />' Inicializamos un array (un contenedor para meter objetos)<br />' que usaremos mas tarde<br />arFiles = Array()<br /><br />' Creamos el objeto "Script"<br />' necesario en los scripts WSH(Windows Scripting Host)<br />set fso = CreateObject("Scripting.FileSystemObject")<br /> <br />' Primero tendremos que organizar los objetos (los ficheros del<br />' directorio) en un array y luego trabajar (borrar) con ellos,<br />' ya que es posible que el objeto FSO no nos los devuelva con el<br />' orden que esperamos<br /><br />' Llamamos a la funcion "SelectFiles" que seleccionará los ficheros<br />' a borrar, es decir, los ficheros del path que hemos seleccionado<br />' que sean más antiguos de la fecha que hemos puesto y los metemos<br />' en un array.<br />' Mas abajo podreis ver concretamente que hace la funcion SelectFiles <br />SelectFiles path, killdate, arFiles, false<br /><br />' Inicializamos a 0 la variable que controla el numero de<br />' ficheros borrados<br />nDeleted = 0<br /><br />' Y hacemos el bucle de borrado, desde 0, hasta el total de elementos<br />' que tenemos en el array (contenedor de ficheros a borrar)<br />for n = 0 to ubound(arFiles)<br /><br /> '=================================================<br /> ' WARNING: Es importante saber que los ficheros<br />' borrados con FSO (arFiles(n).delete) no van a la<br />' papelera de reciclaje, se eliminan directamente<br /> '=================================================<br /><br />' Si hubiera un error, paso de el y me voy al siguiente elemento<br />' a procesar. Si no ponemos esta linea y hubiera un error, el<br />' script se detendria <br />on error resume next<br /><br />' Borramos cada fichero del array (no va a la papelera de reciclaje) <br />arFiles(n).delete true<br /><br />' Si hay un error de borrado, es decir, el codigo que devuelve<br />' es diferente de 0 (si es un 0 no hay error) <br />if err.number 0 then<br /><br />'Escribe en pantalla que no se puede borrar el fichero <br /> wscript.echo "Unable to delete: " & arFiles(n).path<br /><br />' si no<br /> else<br /><br />' Aumentamos en 1 el contador de ficheros borrados<br /> nDeleted = nDeleted + 1<br /> end if<br />next<br /><br />' Escribimos en pantalla el numero de ficheros eliminados <br />wscript.echo nDeleted & " of " & ubound(arFiles)+1 _<br /> & " eligible files were deleted"<br /> <br /> '=================================================<br /> ' Enviamos el resultado por correo electronico:<br /> '=================================================<br /><br />' Definimos el esquema necesario para el envio de correo <br />sch = "http://schemas.microsoft.com/cdo/configuration/"<br /><br />' Y creamos el objeto de la configuracion del envio de correo <br />Set MsgConfig = CreateObject("CDO.Configuration")<br /><br />' Configuramos los campos necesarios para el envio de correo <br />With MsgConfig.Fields<br /><br />' Podemos enviar el mensaje (cdoSendUsingPickup = 1) utilizando<br />' el SMTP local con el directorio de "pickup", o bien<br />' enviar el mensaje utilizando un SMTP externo (cdoSendUsingPort = 2) <br /> .Item(sch & "sendusing") = 2 ' cdoSendUsingPort<br /><br />' Definimos el servidor SMTP a utilizar<br /> .Item(sch & "smtpserver") = "smtp.contoso.com"<br /><br />' Y grabamos las opciones <br /> .update <br />End With<br /><br />' Creamos el objeto mensaje<br />Set Msg = CreateObject("CDO.Message")<br /> <br />With Msg<br /><br />' Le aplicamos la configuracion anterior<br /> Set .Configuration = MsgConfig<br />' Y definimos los campos del mensaje en si <br /> ' Campo Para<br />.To = "oscarintherocks@gmail.com"<br /><br />' Campo De<br /> .From = "oscarintherocks@gmail.com"<br /><br />' Campo asunto<br /> .Subject = "Hoy he borrado " & nDeleted & " logs"<br /><br />' Y el cuerpo del mensaje<br /> .TextBody = "He borrado " & nDeleted & " de " & ubound(arFiles)+1 _<br /> & " ficheros susceptibles de borrado. Estos ficheros son anteriores _<br />a la fecha " & vbCrLf & Killdate & vbCrLf & vbCrLf _<br />& "Los ficheros se han borrado de la siguiente carpeta: " _<br />& vbCrLf & path<br /><br />' Por ultimo enviamos el mensaje <br />.Send<br /> <br />End With<br /><br />' ==================================<br />' Funciones... A continuacion vienen las funciones que utilizamos<br />' en el script mas arriba<br />' ==================================<br /><br />' Funcion para seleccionar que ficheros borraremos y añadirlos al array<br />sub SelectFiles(sPath,vKillDate,arFilesToKill,bIncludeSubFolders)<br /><br />' Como veis entre parentesis, le hemos pasado 4 parametros que<br />' utilizaremos dentro de la funcion<br /><br />' Definimos el directorio con el Path que le hemos pasado a la funcion <br />Set folder = fso.GetFolder(sPath)<br /><br />' Definimos una variable con todos los ficheros del directorio<br /> Set files = folder.files<br /><br />' Y para cada fichero<br /> for each file in files<br /><br />' Buscamos el patron para hacer una primera seleccion de los ficheros <br />if InStr(file, patron) Then<br /><br />' Si contiene el patron<br />' Inicializamos la variable de la fecha de modificacion <br />dtlastmodified = null<br /><br />' Si se produce algun error seguiremos con el siguiente fichero<br /> on error resume Next<br /><br />' Obtenemos la fecha de modificacion del fichero para pasarle el filtro<br />' de fecha<br /> dtlastmodified = file.datelastmodified<br />' Controlamos que no haya un error en la fecha y nos pete el script<br /> if not isnull(dtlastmodified) Then<br /><br />' Si la fecha de modificacion es anterior a la fecha a partir<br />' de la cual queremos borrar ficheros<br /> if dtlastmodified < vKillDate then<br /><br />' Anyadimos 1 al contador de ficheros a borrar<br /> count = ubound(arFilesToKill) + 1<br /><br />' Ampliamos el array en 1 para meter el fichero que queremos borrar<br /> redim preserve arFilesToKill(count)<br /><br />' Y metemos el fichero en el array, para despues borrar<br />' los ficheros del array completo<br /> set arFilesToKill(count) = file<br /> end if<br /> end if<br /> end if<br /> next<br /><br />' Si en la funcion le hemos pasado un "true" en el cuarto parametro<br />' lo que haremos sera incluir los subdirectorios<br />if bIncludeSubFolders then<br /><br />' por lo tanto para cada subdirectorio<br /> for each fldr in folder.subfolders<br /><br />' Volvemos a llamar a la funcion que eliminara los ficheros a<br />' borrar recursivamente<br /> SelectFiles fldr.path,vKillDate,arFilesToKill,true<br /> next<br /> end if<br />end sub<br /><br />******************************************************************<br /> |
Pues esto es todo, con este script podréis hacer un reciclado de logs automático simplemente ejecutándolo diariamente en las tareas programadas. Por supuesto se puede adaptar a nuestras necesidades y mejorar todo lo que queráis.
Espero que os sea útil.