Manejar un output de tail por system


#1

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.
para esto estoy llamando a un comando unix

s = system “tail -3 #{path_to_rake_log}”

aunque me saca el listado del log en la consola de al final me tira un
=>true, pero me gustaria saber si hay alguna otra forma de hacer un tail
a
un archivo y poder sacarlo a una vista, o sacar la respuesta del system
a
una vista

de todas formas , encontre esto , que aun no lo uso, pero creo que hace
lo
que necesito, solo queria saber si desde system se podia hacer
http://raa.ruby-lang.org/project/file-tail/1.0.3

muchas gracias

  • saludos

#2

encontré algo por acá
http://snippets.dzone.com/posts/show/6139

funciona bien

saludos

Atte.
Miguel Michelson Martinez

www.artenlinea.cl

On Fri, Nov 7, 2008 at 3:16 PM, Miguel M. <


#3

On Fri, Nov 7, 2008 at 7:16 PM, Miguel M.
removed_email_address@domain.invalid wrote:

s = system “tail -3 #{path_to_rake_log}”

El snippet del link que has puesto en el otro email
(http://snippets.dzone.com/posts/show/6139) no acaba de funcionar muy
bien, lo he probado y aunque le dijera que me devolviera las últimas
50 lineas, no lo hacia, raro raro.

Esto funciona:

@s = `tail -3 #{path_to_rake_log}`

En la vista:

<pre><%= @s %></pre>

Sobre “system”:

"Executes cmd in a subshell, returning true if the command was found
and ran successfully, false otherwise. An error status is available in
$?. The arguments are processed in the same way as for Kernel::exec."

Por eso te devuelve un true. :wink:


#4

ah, gracias Francesc,

esto :

@s = tail -3 #{path_to_rake_log}

funciona :smiley:

no sabia que si se llama a un comando con , se ejecuta como system.
"

Gracias!

Atte.
Miguel Michelson Martinez

www.artenlinea.cl

2008/11/7 Francesc E. removed_email_address@domain.invalid


#5

No devuelve lo mismo que system. System devuelve un boleano, usando
los backtits, devuelve la salida.

On 08/11/2008, at 15:30, “Miguel M.”


#6

El día 8 de noviembre de 2008 15:51, Francesc E.
removed_email_address@domain.invalid
escribió:>

No devuelve lo mismo que system. System devuelve un boleano, usando los
backtits, devuelve la salida.

Yo tengo muy poca memoria para recordar sutilezas de este tipo, cuando
necesito ejecutar algo desde el sistema suelo acudir una y otra vez a
este post de Jay Fields para ver qué método se ajusta mejor a lo que
necesito:

 http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html

#7

En dos palabra: O-le!

On 08/11/2008, at 20:20, Guillermo Álvarez Fernández
<guillermo@cientifico.n


#8

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


#9

Hola , gracias por la ayuda.

en realidad no trato de ver el production.log, si no un log de un rake
task,
que se va escribiendo a medida que se va ejecutando este rake

@guillermo: voy a ver como se va escribiendo el log , y probaré las
distintas alternativas.

les cuento el lunes, ya que la aplicación la tengo en la oficina :slight_smile:

gracias a todos.

Atte.
Miguel Michelson Martinez

www.artenlinea.cl

2008/11/8 Francesc E. removed_email_address@domain.invalid


#10

en realidad no trato de ver el production.log, si no un log de un rake
task, que se va escribiendo a medida que se va ejecutando este rake

Una solución más tradicional en el mundo multiproceso Unixero
seríautilizar la llamada popen, que está implementada también en Ruby

http://ruby-doc.org/core/classes/IO.html#M002267

Podría ajustarse bien a lo que quieres, ya nos contarás.


Pablo M. Schroder
http://docecosas.com


#11

2008/11/10 Miguel M. removed_email_address@domain.invalid:

lo que no sé, es como hacer el output para que me muestre el log que yo
quiera, por ejemplo mi Rails.root+’/log/rake.log’.

Esto no te sirve?

@log = `tail -20 #{Rails.root}/log/rake.log`

#12

Hola a todos ,

como decia Guillermo, el tail - tiene un retraso considerable, ya que
el
log se escribe hasta que se llena el buffer,

sin embargo el codigo para escribir el rails logger funciona bien y se
actualiza a un tiempo ‘mas real’.

lo que no sé, es como hacer el output para que me muestre el log que yo
quiera, por ejemplo mi Rails.root+’/log/rake.log’.

@pablo, revise la documentacion pero entendi bien como podria ajustarlo
a lo
que necesito. seguire revisando eso .

Gracias

Atte.
Miguel Michelson Martinez

www.artenlinea.com

2008/11/10 Pablo M. Schroder removed_email_address@domain.invalid


#13

Hola a todos

@Francesc, Si, todas las soluciones que me han dado me sirven, el
problema
es que el log no se actualiza muy rápido, al parecer es por lo que decia
Guillermo, de que rails escribe al disco una vez que se llena el
BufferedLogger.

quizás el problema está en el escribir la información en el .log y no al
hacer la llamada, el methodo que utilizo para llamar al rake es la
siguiente:

def call_rake(task,options={})
options[:rails_env] = Rails.env
args = options.map{|n,v| “#{n.to_s.upcase}=’#{v}’”}
system “/usr/bin/rake #{task} #{args.join(’ ')} --trace >>
#{Rails.root}/log/rake.log &”
end

creo que el problema puede estar ahi, ya que imprimi un @tail = tail -20 #{Rails.root}/log/development.log y el contenido se va a atualizando
correctamente, no asi con rake.log que es el archivo que estoy
escribiendo

Saludos

Atte.
Miguel Michelson Martinez

www.artenlinea.com

2008/11/10 Francesc E. removed_email_address@domain.invalid


#14

hmm… por nada en especial … solo para tener mas información del
proceso.

de todas formas con --verbose tampoco se soluciona el problema :frowning:

saludos

Atte.
Miguel Michelson Martinez

www.artenlinea.com

2008/11/11 Francesc E. removed_email_address@domain.invalid


#15

parece que lo he resuelto,

En lugar de escribir el log desde el.

system “/usr/bin/rake #{task} #{args.join(’ ')} --verbose >>
#{Rails.root}/log/rake.log &”

ahora uso un:
log = Logger.new( Rails.root+’/log/rake.log’, ‘daily’ )

y las salidas al log las hago asi:

log.debug “procesando: #{ p.url}”

así el log se escribe a medida que le envío los mensajes.

saludos y gracias

Atte.
Miguel Michelson Martinez

www.artenlinea.com

On Tue, Nov 11, 2008 at 11:25 AM, Miguel M. <


#16

On Tue, Nov 11, 2008 at 2:32 PM, Miguel M.
removed_email_address@domain.invalid wrote:

quizás el problema está en el escribir la información en el .log y no al
hacer la llamada, el methodo que utilizo para llamar al rake es la
siguiente:

def call_rake(task,options={})
options[:rails_env] = Rails.env
args = options.map{|n,v| “#{n.to_s.upcase}=’#{v}’”}
system “/usr/bin/rake #{task} #{args.join(’ ')} --trace >>
#{Rails.root}/log/rake.log &”
end

Un pregunta, porque estas utilizando --trace en vez de --verbose?


#17

:smiley:

si, leer un log de un rake generado por mi aplicación desde mi
aplicación.
¿que fue lo que se entendió?, al parecer no me expliqué bien

el problema era que el archivo se escribía con retraso, en el caso de
Logger
, se escribe bien.

Saludos

Atte.
Miguel Michelson Martinez

www.artenlinea.com

2008/11/11 Francesc E. removed_email_address@domain.invalid


#18

Ahora me has liado … tu lo que querias hacer era leer el log desde
la aplicacion no?

On Tue, Nov 11, 2008 at 5:22 PM, Miguel M.