#!/usr/bin/env ruby #encoding=utf-8 # => 使用方法 # 将此文件放置到rails工程目录下,运行chmod +x monitorlog.rb #./monitorlog.rb start 即可。 # MailTo 修改日志记录发送的人员列表 # # # by wangmh@grandsoft.com.cn 2010-06-05 # require 'fileutils' require 'rubygems' require 'eventmachine' require 'file/tail' require 'net/smtp' require "iconv" Subject = '招聘日志分析' MailTo = ['mmcgzs@yeah.net','wangmh_bit@sina.cn'] module Daemon WorkingDirectory = File.expand_path(File.dirname(__FILE__)) class Base def self.pid_fn File.join(WorkingDirectory, "#{name}.pid") end def self.daemonize Controller.daemonize(self) end end module PidFile def self.store(daemon, pid) File.open(daemon.pid_fn, 'w') {|f| f << pid} end def self.recall(daemon) IO.read(daemon.pid_fn).to_i rescue nil end end module Controller def self.havelog? File.exist?(File.join(File.dirname(__FILE__),'/log/production.log')) end def self.daemonize(daemon) case !ARGV.empty? && ARGV[0] when 'start' unless havelog? puts "Can't find production log! Are you sure in a Rails Projection" exit end start(daemon) when 'stop' stop(daemon) when 'restart' stop(daemon) start(daemon) else puts "Invalid command. Please specify start, stop or restart." exit end end def self.start(daemon) fork do Process.setsid exit if fork PidFile.store(daemon, Process.pid) Dir.chdir WorkingDirectory File.umask 0000 STDIN.reopen "/dev/null" STDOUT.reopen "/dev/null", "a" STDERR.reopen STDOUT trap("TERM") {daemon.stop; exit} daemon.start end end def self.stop(daemon) if !File.file?(daemon.pid_fn) puts "Pid file not found. Is the daemon started?" exit end pid = PidFile.recall(daemon) FileUtils.rm(daemon.pid_fn) pid && Process.kill("TERM", pid) end end end def send_mail(from, to, subject='', body='') return if to.nil? || to.empty? #注意这里的配置的smtp。按照实际进行配置,对应,smtp主机,端口,domain,用户名,密码,验证方式 Net::SMTP.start('211.103.170.9', 25, 'fwxgx.com', 'webmaster@fwxgx.com', '*********', :login) do |smtp| smtp.sendmail("Content-Type:Text/HTML/r/nDate:#{Time.now}/r/nFrom:#{from}/r/nTo:#{to.join(';')}/r/nSubject:#{subject.to_s}/r/n/r/n#{body}", from, to) end end def convert_gb(str) Iconv.iconv("GBK","UTF-8", str.to_s) end class MonitorError < Daemon::Base def self.start n = 0 errorstr = "" f = File.open('result', 'w') thread = Thread.new do EventMachine::run { EventMachine::PeriodicTimer.new(3600*6) do send_mail('webmaster@fwxgx.com', MailTo, convert_gb(Subject), errorstr) errorstr = "" end } end File::Tail::Logfile.open(File.join(File.dirname(__FILE__),'/log/production.log')) do |log| str = "" iserror = false log.backward(0).tail do |line| str << %(<span style="color:#088A08" mce_style="color:#088A08"> #{convert_gb(line)}</span><br/>) if line =~ /^Processing/ str = %(<h3 style="color:#FF0000" mce_style="color:#FF0000"> #{convert_gb(line)}</h3>) iserror = false end iserror = true if line =~ /passenger/ if line =~ /^Rendering/ errorstr << str if iserror str = "" iserror = false end end end thread.join end def self.stop end end MonitorError.daemonize