FC2ブログ

徒然さめざめ

思ったことを思ったときに思ったように

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

railsのログを定期的にメールで送信

rake タスクで実装してみた。

設定する箇所は
to_addr
from_addr
hogehoge <= smtp_serverのアドレス


log/ 以下のログファイルから 昨日 以降に出力された部分を to_addr に送りつけます。
development環境とかで動かすとSQLクエリのログがひどいことになったりするので
Base64でエンコードしています。

最初tmailを使用して実装していましたが、環境によってはtmailを入れていないところもあるので
net/smtp だけで実装しています。

SEARCH_RE を変更してErrorだけ!とかにした方がいいかもしれません。
その辺はお任せします。スキに改変してください。

ちなみに定期的にメールを送信する仕事はcronが行います(想定です)。
てへ。
$ cat log.rake

require "date"
require "time"
require "kconv"
require "socket"
require "net/smtp"
require "base64"

namespace :log do
YESTERDAY = (Date.today - 1).strftime("%Y-%m-%d")
SEARCH_RE = Regexp.new("^.*#{YESTERDAY}|^.*#{Date.today.strftime("%Y-%m-%d")}")
desc "Rails Log send to ML:log"
task :mail do
log = "#{Socket.gethostname} の log/ 以下のログファイルから #{YESTERDAY} 以降に出力された部分です。\n\n"
Dir.glob("log/*").each do |file|
log << "\n-----------[" + file + "]------------\n"
next unless File.exist?(file)
File.open(file, "r") do |fp|
tmp = fp.read
pos = tmp.index(SEARCH_RE)
if pos.nil?
log << "log is empty..."
break
end
fp.seek(pos)
log << fp.read
end
end
sendmail(log)
end

private

def sendmail(body="")
to = to_addr
from = from_addr
subject = "#{Socket.gethostname} daily log report #{YESTERDAY} to #{Time.now.strftime("%Y/%d/%m-%H:%M")}"

head = [
"To: #{to}",
"From: #{from}",
"Mime-Version: 1.0",
"Content-Transfer-Encoding: Base64",
"Content-Type: Text/Plain; charset=utf-8",
"Date: #{Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z")}",
"Subject: #{NKF.nkf("-WMm0", subject)}"
].join("\n")

msg = head + "\n\n" + NKF.nkf("-jxm0", Base64.encode64(body))
smtp_server = hogehoge
Net::SMTP.start(smtp_server) do |smtp|
smtp.sendmail(msg, from, to)
end
end

end
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://fmkt.blog65.fc2.com/tb.php/127-9bea3b4e
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。