El 07/11/2008, a las 19:16, Miguel M.
escribió:
Hola a todos.
estoy haciendo lo siguiente para leer un log de una aplicación en
Rails ( rake.log)
mi idea es mostrarlo en una vista.
Tienes un problema, y es que para reducir el número de operaciones de
IO, rails implementa un BufferedLogger, esto es, que hasta que no se
llena no hace write a disco, por lo que en producción, te dejará de
funcionar lo que te funciona en desarrollo.
para esto estoy llamando a un comando unix
s = system “tail -3 #{path_to_rake_log}”
Te recomiendo algo más parecido a %x(tail -3 #{path_to…})
Pero veamos. Si tu objetivo es capturar el contenido de log de rails,
el punto de insercción de código debe de ser, en la medida de lo
posible, lo más cercano a la funete.
En este caso. Rails utiliza un punto común a la hora de escribir el
log, que es el add del propio rails logger.
Sin mucha complicación podrías copiar y pegar un código parecido a este:
class << Rails.logger
alias old_add add
def add(severity, message = nil, progname = nil, &block)
old_add(severity, message, progname, &block)
@queue ||= Array.new
@queue.push message
@queue.shift if @queue.size >= 100
message
end
def queue; @queue.join("\n"); end
end
en environment.rb
Cada vez que quieras acceder al las 100 últimas lineas de log:
Rails.logger.queue
Es un mokinpanchin muy feo, pero rotundamente más eficaz que un tail a
un log, sobretodo si hablamos de log de la misma
aplicación.
Deberás de estudiar como está la máquina puesta en
producción.
Si utliza más de un mongrel, no te valdría ni mi propuesta (ya que al
guardar el nuevo “log” en memoria, habría diferentes logs por cada
mongrel), ni la tuya, que iría con un considerable retraso.
Para desarrollo, ambas son válidas.
Un Saludo