僕のRaspberryyPiはSDカードのアクセスを減らす為に/dev/shm領域へ自作アプリのログを残すようにしている。30秒毎に読み出すCPU温度のログなんてSDカードに書き込んでたらすぐカードがダメになっちゃいそうなのでこのような方式にした。
しかしこの場所は電源を切ると消えてしまう。
なので日付が変わると昨日のログをメールで送信して、一定量溜まると消して行くという方法をとった。
crontabで0:05時になると昨日のログをアプリ毎に分けてメールで送信するlog_mail.pyを、1:00に過去ログを消すdel_log.pyというアプリを起動させている。
crontab
05 0 * * * python /usr/local/lib/log_mail.py &
00 1 * * * python /usr/local/lib/del_log.py &
ログをメールで送信するコード。
importしているのは過去に紹介したコード。
<ファイルマネージャーとG-mail送信コード>
-- log_mail.py --
2016/01/12 前日と当日のログデータを選択して送れるよう更新
2016/01/24 ログのバックアップデータを送ってバックアップを削除するよう更新
#!/usr/bin/python
#coding:utf-8
import datetime
import file_mng
import gmail
import time
def send(day=0):
logdir = file_mng.get_logdir()
logfiles = file_mng.search_log(logdir, str(day))
for st in logfiles:
sp = st.rsplit("/",2)
apl = sp[1]
day = sp[2]
subtitle = "LOG[" + apl + "]" + day
file = file_mng.load(st)
body = ""
for s in file:
body += s + "\n"
gmail.send(mailadd, subtitle, body)
time.sleep(1)
def today():
day = file_mng.get_today()
send(day)
def yesterday():
day = file_mng.get_yesterday()
send(day)
def send_tmp(day = 0):
logdir = file_mng.get_logdir_tmp()
logfiles = file_mng.search_log(logdir, str(day))
for st in logfiles:
sp = st.rsplit("/",2)
apl = sp[1]
day = sp[2]
subtitle = "TMP_LOG[" + apl + "]" + day
file = file_mng.load(st)
body = ""
for s in file:
body += s + "\n"
gmail.send(mailadd, subtitle, body)
time.sleep(1)
def del_tmp():
file_mng.del_logs_tmp()
def tmp_check():
if file_mng.is_tmp_logs() is True:
day = file_mng.get_yesterday()
send_tmp(day)
day = file_mng.get_today()
send_tmp(day)
del_tmp()
if __name__=='__main__':
tmp_check()
yesterday()
#today()
ログを消すコードlog_num変数で残しておくログの数を指定してある。
-- del_log.py --
#!/usr/bin/python coding:utf-8
import file_mng
import gmail
logdir = file_mng.get_logdir()
log_num = 10
def deller():
logdirs = file_mng.search_log(logdir)
for dir in logdirs:
logfiles = file_mng.search_files(dir + "/*")
logfiles.sort()
logfiles.reverse()
filecount = 0
for logfile in logfiles:
filecount += 1
if log_num < filecount:
file_mng.del_file(logfile)
if __name__=='__main__':
deller()
以上。