Home » Aplicaciones »Class »Php »Trucos » Currently Reading:

Generar archivos LOG desde PHP

enero 16, 2015 Aplicaciones, Class, Php, Trucos 1 Comment
Generar archivos LOG desde PHP

A la hora de testear nuestras aplicaciones es muy probable que nos interesa sacar un pequeño informe de navegación o algún tipo de datos en un fichero externo para poder hacer las posteriores comprobaciones. Para ello podemos crear archivos LOG que guarden la información que queramos.

Para crear estos ficheros en un servidor haremos uno de PHP, creando un script que genere ese fichero con la información que queramos.

El primer paso será crear una clase de PHP generando un fichero con nombre “Log.class.php”. A esta clase le asignaremos una serie de variables algunas de las cuales definiremos desde el constructor:

  1. <?php
  2. class Log
  3. {
  4. public function __construct($filename, $path)
  5. {
  6. $this->path     = ($path) ? $path : "/";
  7. $this->filename = ($filename) ? $filename : "log";
  8. $this->date     = date("Y-m-d H:i:s");
  9. $this->ip       = ($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 0;
  10. }

Como vemos, la variable “filename” incluirá el nombre del fichero en el que guardaremos la información y la variable “path” es la ruta en la cual situaremos el fichero. Estas variables son opcionales desde el constructor y si no le pasamos ningún valor tomarían el nombre de fichero “log” y la ruta de la carpeta donde está situado el script.

Por otro lado las variables “date” y “ip” se rellenan con la fecha actual y la ip del usuario.

Un ejemplo de implementación sería esta:

  1. <?php
  2. include "Log.class.php";
  3.  
  4. $log = new Log(); //valores por defecto
  5. $log = new Log("log", "./logs/"); //valores definidos[/as]
  6.  
  7. El siguiente paso será crear dentro de la clase una función que nos permita generar el LOG:
  8.  
  9. &#91;as]<?php
  10.  
  11. class Log
  12. {
  13. public function __construct($filename, $path)
  14. {
  15. $this->path     = ($path) ? $path : "/";
  16. $this->filename = ($filename) ? $filename : "log";
  17. $this->date     = date("Y-m-d H:i:s");
  18. $this->ip       = ($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 0;
  19. }
  20. public function insert($text)
  21. {
  22. file_put_contents($this->path . $this->filename . $date . ".log", $text);

Para crear el fichero utilizaremos el método de PHP “file_put_contents”.

Esta función añadiría el contenido del parámetro “text” dentro del fichero de texto que hemos creado, y al que hemos añadido la extensión “.log”. Este fichero en el caso de no existir se creará en la ruta indicada (Es importante saber que tanto el fichero y la carpeta que lo contiene han de tener permisos de escritura).

  1. <?php
  2.  
  3. include "Log.class.php";
  4.  
  5. $log = new Log("log", "./logs/");
  6. $log->insert('Esto es un test!');

Esta función la podemos mejorar para hacer ese sistema de LOGS más optimo. Añadiendo al texto la hora y la ip en la que se realizó el log:

  1. $log    = $this->date . " [ip] " . $this->ip . " [text] " . $text . PHP_EOL;
  2. $result = (file_put_contents($this->path . $this->filename . $date . ".log", $log)) ? 1 : 0;

También hemos añadido una variable que nos indica si el log se ha escrito con éxito. Por ejemplo, devolvería “0” si el fichero o la carpeta que hemos indicado no tienen permisos de escritura.

Añadiremos otra opción que nos permitirá decidir si queremos que los se guarden siempre dentro del mismo fichero (por ejemplo “datos.log”) o por si el contrario queremos generar un fichero cada vez que hagamos un log, en tal caso será útil añadirle al nombre la hora en la que se realizó (por ejemplo “archivo_2015-01-16_17:10:17.log”)

  1. public function insert($text, $dated)
  2. {
  3. if ($dated) {
  4. $date   = "_" . str_replace(" ", "_", $this->date);
  5. }
  6. else {
  7. $date   = "";
  8. };
  9. $log    = $this->date . " [ip] " . $this->ip . " [text] " . $text . PHP_EOL;
  10. $result = (file_put_contents($this->path . $this->filename . $date . ".log", $log)) ? 1 : 0;

Añadiendo un “true” o “false” en el constructor controlaremos esta decisión.

Otra opción interesante será poder definir si queremos eliminar el contenido anterior del fichero o si queremos ir añadiendo lineas nuevas manteniendo las anteriores (que sería lo más común). El método “file_put_contents” nos permite hacer esto con el parámetro FILE_APPEND. Añadiremos esta funcionalidad en nuestra función:

  1. public function insert($text, $dated)
  2. {
  3. if ($dated) {
  4. $date   = "_" . str_replace(" ", "_", $this->date);
  5. $append = null;
  6. }
  7. else {
  8. $date   = "";
  9. $append = ($clear) ? null : FILE_APPEND;
  10. };
  11. $log    = $this->date . " [ip] " . $this->ip . " [text] " . $text . PHP_EOL;
  12. $result = (file_put_contents($this->path . $this->filename . $date . ".log", $log, $append)) ? 1 : 0;

Vemos que esta opción solo se la damos si hemos definido que no queremos la fecha en el nombre del fichero, dado que en ese caso con cada petición se genera un fichero nuevo y no tiene sentido querer mantener el contenido antiguo en el fichero nuevo.

Por último añadiremos una funcionalidad importante como es la de generar archivos de backup. Por si, por ejemplo, queremos guardar una copia del fichero LOG antes de sobreescribirlo con otra sesión. Para esto utilizaremos el método “copy”:

  1. copy($this->path . $this->filename . ".log", $this->path . $this->filename . "_" . str_replace(" ", "_", $this->date) . "-backup.log");

En este caso generaremos una copia del fichero que hemos indicado, añadiéndole la fecha y el texto “backup” en el nombre (por ejemplo: “datos_2015-01-16_17:12:53-backup.log”)

La clase completa quedaría así:

  1. <?php
  2. class Log
  3. {
  4. public function __construct($filename, $path)
  5. {
  6. $this->path     = ($path) ? $path : "/";
  7. $this->filename = ($filename) ? $filename : "log";
  8. $this->date     = date("Y-m-d H:i:s");
  9. $this->ip       = ($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 0;
  10. }
  11. public function insert($text, $dated, $clear, $backup)
  12. {
  13. if ($dated) {
  14. $date   = "_" . str_replace(" ", "_", $this->date);
  15. $append = null;
  16. }
  17. else {
  18. $date   = "";
  19. $append = ($clear) ? null : FILE_APPEND;
  20. if ($backup) {
  21. $result = (copy($this->path . $this->filename . ".log", $this->path . $this->filename . "_" . str_replace(" ", "_", $this->date) . "-backup.log")) ? 1 : 0;
  22. $append = ($result) ? $result : FILE_APPEND;
  23. }
  24. };
  25. $log    = $this->date . " [ip] " . $this->ip . " [text] " . $text . PHP_EOL;
  26. $result = (file_put_contents($this->path . $this->filename . $date . ".log", $log, $append)) ? 1 : 0;
  27.  
  28. return $result;
  29. }
  30. }

Y la implementación sería esta:

  1. <?php
  2. include "Log.class.php";
  3.  
  4. $log = new Log("log", "./logs/");
  5.  
  6. echo $log->insert('Esto es un test!', false, true, true);

Esto nos mostaría en pantalla un “1” o “0” en función de haberse realizado con éxito el LOG. Y el log generado será este:

  1. 2015-01-16 17:11:53 [ip] XX.X.XX.XXX [text] Esto es un test!
  2. 2015-01-16 17:12:26 [ip] XX.X.XX.XXX [text] Esto es un test!
  3. 2015-01-16 17:14:18 [ip] XX.X.XX.XXX [text] Esto es un test!

Descárgate los ficheros de ejemplo:

*Debes de estar registrado para ver este contenido. Login | Registro

Compártelo:

Generar archivos LOG desde PHP
Visto 7.399 veces

Currently there is "1 comment" on this Article:

  1. […] ejemplo de código es una continuación del tutorial anterior “Cómo generar archivos log desde php“. En este caso el archivo de LOG que generaremos será en formato XML y […]

Comment on this Article:








Twitter: zguillez

AdvertisementAdvertisementAdvertisementAdvertisement

Recibe las novedades por email

Post destacado

Curso profesional de Node.JS y Javascript en Mejorando.la

27 oct 2014

La gente de Mejorando.la a preparado un curso avanzado de desarrollo en Javascript y Node.js. Para aprender a crear web apps robustas, escalables, asíncronas, real-time, con APIs REST y bases de datos. Las clases en vivo son el 28, 29, 30 de Octubre de 6pm a 8pm hora española. Si no puedes ver las clases online también tendrás acceso a todas las grabaciones. El contenido del curso es: Introducción a Node.js Express y Swig MongoDB vs. Redis Mongoose y MongoDB Socket.io y apps realtime Grunt y procesos automáticos   Apps modulares y APIs REST Express y MongoDB Arquitectura escalable en …



Map

Ranking

Codigoactionscript.org: 4.65 sobre 5 (106 valoraciones)

twitter-widget.com