質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

cronのように実行されたプログラムのログをメールで出力したい。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,008

yuki_90453

score 153

いつもお世話になっております。
Rubyにてメール受信時に動くプログラムを作成しています。
crontabで動くプログラムと違い、実行結果や出力をメールで受け取れないのでエラーが発生した際に対応が遅くなってしまい大変、困っております。

現状、下記のようにloggerとmailのライブラリを使用し、ログを記録しメールで送信といった風に行っております。

require 'logger'
    def initialize
        $log = Logger.new("log/logger.log",10)
        $log.datetime_format = "%Y-%m-%d %H:%M:%S"
        $log.level = Logger::INFO
        $errors = []
    end
 def logger(type="info", text)
        puts text
        $log.info (text) if type == "info"
        $log.warn (text) if type == "warn"
        if type == "error"
            $log.error (text)
            $errors << text
        end
    end
    def send_log_mail(type ="log")
        Mail.defaults do
        delivery_method :smtp, {
            :address => "smtp.gmail.com",
            :port => 587,
            :domain => 'gmail.com',
            :user_name => 'test@gmail.com',
            :password => 'password',
            :authentication => 'plain',
            :enable_starttls_auto => true
        }
        end
        if type == "log" && $logs.empty? == false
            m = Mail.new do
                from "test@gmail.com"
                to "info@example.com"
                subject "ログ"
                body $logs
            end
            m.charset = "UTF-8"
            m.content_transfer_encoding = "8bit"
            m.deliver
        elsif type == "error" && $errors.empty? == false
                m = Mail.new do
                    from "test@gmail.com"
                    to "info@example.com"
                    subject "エラー"
                    body $errors
                end
                m.charset = "UTF-8"
                m.content_transfer_encoding = "8bit"
                m.deliver
        end
    end

send_log_mail("error")
send_log_mail

しかし、上記の方法ではプログラムがエラーで動かなかった場合のエラーなど、ログ出力出来ません。
crontabであれば、エラーやputsなどすべてのログがメールで送信されるので、そのような形にしたいと考えております。

質問

crontabのように標準でそのような機能はないのでしょうか?
どのようにすれば、プログラムで発生した標準出力を読み込めるのでしょうか?

よろしくお願い致します。

追記

#!/bin/bash
TEMP=/tmp/syncStock_temp$$
trap "rm -f $TEMP" 0
cd /var/www/html/Ruby/Application/
/usr/local/rbenv/shims/bundle exec /usr/local/rbenv/versions/2.3.1/bin/ruby mailTrigger.rb > $TEMP 2>&1
CC=$?
if test $CC != 0 -o -s $TEMP
then mail -s "ERROR CC=$CC" mail < $TEMP
fi
exit 0
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

.forwardとかaliasesとかによるメール起動のプログラムで、エラーを差出人じゃなくて受取人ないし固定の別ユーザーが知りたいという事ですよね。

まずこけないと思われるシェルスクリプトを一枚かぶせるくらいですかね。

あるいは、Postfixに手を入れるか・・・・そっちの方が危ないか。

#!/bin/sh
TEMP=/tmp/hogehoge$$
trap "rm -f $TEMP" 0
/path/to/ruby /path/to/script > $TEMP 2>&1
CC=$?
if test $CC != 0 -o -s $TEMP
then mail -s "ERROR CC=$CC" me@example.com < $TEMP
fi
exit 0

追記

シェルスクリプト不案内のようなので、解説しておきます。

  1. 一時ファイル名を決める($$はプロセスID)
  2. スクリプト終了時に一時ファイルを削除する
  3. プログラム起動。出力は一時ファイルにリダイレクト
  4. プログラムの終了コードを取得
  5. 終了コードがゼロでないか、または、一時ファイルが空でない時に
  6. 終了コードと一時ファイル内容をメールする
  7. 終わりは終了コードゼロで

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/06 22:41

    Ruby側では、「# -*- encoding: utf-8 -*-」という風にUTF-8を指定しています。
    シェルスクリプト側で文字コードの変換を行おうと考え下記のように修正しましまたが、変化はありませんでした。
    iconv -f UTF16 -t EUCJP $TEMP > $TEMP.test
    mail -s "ERROR CC=$CC" hepp0k0.jani.win@gmail.com < $TEMP.test

    キャンセル

  • 2017/06/06 22:46

    プログラムがバグっているので、文字コードをどうのこうのしても駄目です。文字化けじゃ無いです。バグです。
    あるいは、そういう内容のメールが来てそのまま出力しているか。

    キャンセル

  • 2017/06/06 22:55

    そうですか。
    ここから、今回の質問とは趣旨が変わってしまいそうなんで、別でまた質問させて頂きます。
    ありがとうございます。

    キャンセル

0

crontabのように標準でそのような機能はないのでしょうか?

cron(crontab)の環境変数設定 メール送信先(MAILTO) PATH

ログインした時にメールがある、というようなメッセージが出る場合は、mailやmuttなどのメールクライアントで読む事が出来ます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

私は昔からlogcheckと言うツールを愛用しています。

機能としてはシンプルで、
1時間毎にsyslogを監視し、
パターンにマッチしないログをメールで通知してくれます。

読む必要のないログは、
除外パターンを登録する事で届かなくなります。

監視対象のログも、任意に追加できますので、
ローテーションしてるようなものや、
日付毎にファイル名が変わるものでなければOKだと思います。
私はapacheのエラーログも監視しています。

1時間に1通なので、緊急対応には向きませんが、
落ちた時の警告には、monitと言うツールを利用しています。

いずれも昔からある枯れたツールなので、
もっと色々あるのかもしれませんが、
これらのツールで特に困らないので、
愛用しています。

エラーメッセージはシステム毎に異なるため、
最初はどうしても読む必要のないメッセージが多く届きます。
なので、それらを除外パターン登録するのは少々面倒ですが、
このやり方は、自分が想定しないエラーを確実に通知してくれるので、
慣れると手放せません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

やりたいこととしてはrubyのプログラムでエラーがあった時に、エラーをメールで検知したいということでしょうか?
もしそうだとしたらsentryの導入を検討してみてください。
https://sentry.io/welcome/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる