2017-12-30
新しく記事を書きました、こっちのほうがおすすめです。
GAS と Stackdriver(Logging, Error Reporting) を連携させる - Qiita
最近Google Apps Script(以降はGASと記載)を始めました@howdy39です。
GASを使い始めてまず思ったのは ログ出力(デバッグ)が辛い ということです。
この辛いログ出力をなんとかしようというのがこの記事の内容です。
Logger.log()
GASのログ出力はLogger.log()が基本になると思うのですが、
- 処理実行
- スクリプトエディタを開いて[表示]->[ログ](Command + Enter)
とか面倒すぎて辛い。
Browser.msgBox()
Broser.msgBox()を使えば実行時にすぐ確認できますが、閉じるのも面倒です。
そもそも画面がないGASだと無理。
結果
ということでシンプルなログ設計をしてみました。
ログ設計
開発時に必要なログはGoogleドキュメントに書き込む
スクリプトエディタを開いて[表示]->[ログ]、を回避したいのでGoogleドキュメントに書きます。
これならブラウザを横において確認できます。
また、追記だと最新のログが下にいってしまうので、毎回クリア。
処理の結果をメール送信する
開発時はGoogleドキュメントで構わないが、運用時にいちいちそんなの見てられない。
正常終了と異常終了はメールでログを送るようにします。
コード
で、書いてみたコードがこちら。
行数も大したことないし、特に難しいことはしていないから解説はしません。
筆者は気にしないので正常終了メールにもログをそのまま書いちゃってますが、そのへんは適宜書き換えてください。
var DEV_MODE = true;
var LOG_FILE_ID = '1UkulvHUunDzUzpVUmYmemYkG4YfZtIfr9vMOMIKzBS4'; // 事前にGoogleドキュメントファイルを作ってファイルIDを記載
var RECIPIENT = 'admin@howdylikes.jp';
function myFunction() {
try {
// ログをクリア
if (DEV_MODE) getLogFile().getBody().clear();
Logger.log('hoge');
Logger.log('%s : %s', 'key', 'value');
ここでエラーが発生
// 正常終了メールを送信する
sendNotificationMail('[XXXシステム]正常終了');
} catch (e) {
Logger.log('\n' + JSON.stringify(e, null, ' '));
// 異常終了メールを送信する
sendNotificationMail('[XXXシステム]異常終了');
} finally {
// ログを書き込む
if (DEV_MODE) getLogFile().getBody().appendParagraph(Logger.getLog());
}
}
function getLogFile() {
if (this.logFile === undefined) {
this.logFile = DocumentApp.openById(this.LOG_FILE_ID);
}
return this.logFile;
}
function sendNotificationMail(title) {
MailApp.sendEmail(RECIPIENT, title, Logger.getLog());
}
開発風景
こんな感じになる。
[Command + R]でmyFunctionを実行すれば右のドキュメントのログが更新されます。
エラーの位置もわかるしとても快適。
メール画面
Slackに飛ばす
メール?時代はSlackでしょって人は、myThingやZapierなんかと連動させて異常終了メールだけSlackに送るとかしておくと良さそう。
もちろんGASから直接Slackに出力してもいいでしょう。
その他
Stackdriver Loggingを使えばStackdriverにログレベルを設定してログが出力できるので、こっちを使うのもありだと思う。
2017-12-30
その記事を書きました。
GAS と Stackdriver(Logging, Error Reporting) を連携させる - Qiita
最後に
こうするともっといいよ! というのがあったら教えてください。