ログの管理

ログには次の3つある。
  1. 発話依頼プログラムpill-reminder.jsのログ
  2. 発話PUSHプログラムexample.jsのログ
  3. GASのWebAPIのログ

発話依頼プログラムpill-reminder.jsのログ


発話依頼プログラムはNodejsで作られた~/pill-reminder/pill-reminder.jsで、~/pill-reminder/pill-reminder.logにログを出力する。
このログは、下記のシェル~/pill-reminder/pill-reminder.shでバックアップが取られたのち、中身がクリアされ、~/pill-reminder/pill-reminder.jsが起動されるようになっている。
#!/bin/sh
cp /home/mtanaka/pill-reminder/pill-reminder.log /home/mtanaka/pill-reminder/log/pill-reminder_`date "+%Y%m%d"`.log
echo '' > /home/mtanaka/pill-reminder/pill-reminder.log

/usr/local/bin/node /home/mtanaka/pill-reminder/pill-reminder.js  >> /home/mtanaka/pill-reminder/pill-reminder.log &
リスト1.シェルスクリプト~/pill-reminder/pill-reminder.sh

このシェルは/etc/rc.localによって起動時に、また毎日午前1時にcrontabで起動されるように設定されている。
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Speak Push Service (pill-reminder system)
forever start /home/mtanaka/pill-reminder/example.js

# start pill-reminder
su - mtanaka -c '/usr/local/bin/node /home/mtanaka/pill-reminder/pill-reminder.js  >> /home/mtanaka/pill-reminder/pill-reminder.log &'

# ngrok tunneling ssh
su - mtanaka -c '/home/mtanaka/ngrok tcp --region ap 22'

exit 0
リスト2./etc/rc.local

0 1 * * * /home/mtanaka/pill-reminder/pill-reminder.sh
リスト3.crontab

ログのバックアップファイルは
~/pill-reminder/log/pill-reminder_YYYYMMDD.log
という名前で作成される。

発話PUSHプログラムexample.jsのログ


発話PUSHプログラムexample.jsもNodejsで作成されたプログラムであるが、Nodejs foreverを使って永続的に実行させている。このプログラムはOS起動時にリスト2に示す/etc/rc.localで起動するにしている。下記の/root/log-backup.shを毎日午前1時にcrontabを使って起動することでログの取得と交換を行っている。
#!/bin/sh
log_file1=`forever list | grep root | /usr/bin/awk '{print $8}'`
log_file2=$(/usr/bin/printf $log_file1 | /bin/sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
cp $log_file2 /home/mtanaka/pill-reminder/log/example_`date "+%Y%m%d"`.log
echo '' > $log_file2
リスト4./root/log-backup.sh

0 1 * * * /root/log-backup.sh
リスト5.crontab (root)

ログのバックアップファイルは
~/pill-reminder/log/example_YYYYMMDD.log
という名前で作成される。

GASのWebAPIのログ


GASのWebAPIのログはGoogleドライブのマイドライブ内にあるdebugというGoogleドキュメントへ出力される。このログ内容をYYMMDD.logという名前のテキストファイルに保存した後にログをクリアするGASが以下のログ変更処理というGASである。
/**
 * ログ変更
 *
 */
function logChange() {
  var doc = DocumentApp.openById('1cWo.............................DM9E');
  var text= doc.getBody().getText();
  var fileName = formatDate(new Date(), 'YYYYMMDD') + '.log'
  createFile(fileName, text);
  doc.getBody().clear();
}

/**
 * ファイル書き出し
 * @param {string} fileName ファイル名
 * @param {string} content ファイルの内容
 */
function createFile(fileName, content) {  
  var folder = DriveApp.getFolderById('1sY.....................eXTX');
  var contentType = 'text/plain';
  var charset = 'utf-8';

  // Blob を作成する
  var blob = Utilities.newBlob('', contentType, fileName)
                      .setDataFromString(content, charset);

  // ファイルに保存
  folder.createFile(blob);
}

/**
 * 日付をフォーマットする
 * @param  {Date}   date     日付
 * @param  {String} [format] フォーマット
 * @return {String}          フォーマット済み日付
 */
function formatDate(date, format) {
  if (!format) format = 'YYYY-MM-DD hh:mm:ss.SSS';
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
  format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
  format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
  format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
  format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
  if (format.match(/S/g)) {
    var milliSeconds = ('00' + date.getMilliseconds()).slice(-3);
    var length = format.match(/S/g).length;
    for (var i = 0; i < length; i++) format = format.replace(/S/, milliSeconds.substring(i, i + 1));
  }
  return format;
};
リスト5.ログのバックアップとクリアを行うGAS「ログ変更処理」

バックアップされたログは[マイドライブ]内の[ゼミ2018]→[実証実験]→[第2クール]→[log]の中に保存される。

なお、このGASはトリガーによって毎日午前0~1時の間に実行されるように設定されている。

0 件のコメント:

コメントを投稿