Raspberry Pi의 센서로 검출한 데이터를 Python으로 텍스트 로그에 출력시킨다

소개



이 기사에서는 Raspberry Pi의 센서에서 감지한 데이터를 Python에서 텍스트 로그에 출력하는 방법에 대해 설명합니다.

이전에는 Python으로 만드는 간단한 식물 통지 시스템 Raspberry Pi + 수분 센서 + Messaging API에서 Raspberry Pi와 수분 센서를 사용하여 식물의 수분을 감지하는 프로그램을 만들었습니다. 그러나, 프로그램을 만든 것은 좋지만 운용이 전혀 되어 있지 않았기 때문에, 자동 기동의 설정이나 로그 관리를 제대로 하려고 생각해, 커스터마이즈 했습니다.

Raspberry Pi 자동 시작 설정



Raspberry Pi의 자동 시작 설정은 Linux와 기본적으로 동일하다고 생각합니다.
서비스로 사용한다면 init 혹은 systemd를 사용합니다만, 스크립트 레벨로 움직이고 싶은 것만으로는 「/etc/rc.local」에 기술하는 것이 가장 간단하겠지요.

/ 에 tc / rc. ㄉ 카 l



예를 들어, 다음과 같이 파일 끝의 'exit 0' 앞에 자동 기동하고 싶은 프로그램(moisture.py)을 기술하는 것으로, Raspberry Pi 기동시에 root 권한으로 자동 실행합니다.
#!/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.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

echo `date` "moisture.py start" >> /var/log/python/moisture.log
/usr/bin/python3 /home/pi/python/moisture.py & 

exit 0

로그 출력



Python으로 작성한 프로그램에서 센서로 취득한 오브젝트(※)의 데이터와 센서 검지시의 시간을 텍스트 로그에 출력시키고 싶습니다. 파이썬 표준 모듈의 time 모듈과 open 함수를 사용하여 출력하기 위해 다음 함수를 만들고 프로그램에 추가했습니다.

(※) 본 기사의 경우는 volts에 센서로 검지한 식물의 수분량의 데이터를 격납하고 있습니다.
def log_write():
    output_time = time.asctime()
    log_file = open("/var/log/python/moisture.log","a+", encoding="UTF-8")
    log_file.write(output_time + " : " + str(volts) + "V" + "\n")
    log_file.close()

로그 출력 예





로그 회전



아무것도하지 않으면 로그가 커지므로 우선 rsyslog를 사용하여 OS 로그와 함께 로그 회전합니다. 방법은 "/etc/logrotate.d/rsyslog"에 설명하기만 하면 됩니다. 필요한 경우 사용자 정의하는 것이 좋습니다. 이하의 경우는 4세대에서 일주일마다 로그 로테이션을 실시해 줍니다. (기본 설정)
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
# ローテーションさせるログファイルを追加する
/var/log/python/moisture.log
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        invoke-rc.d rsyslog rotate > /dev/null
    endscript
}

로그 회전 테스트



rsyslog를 설정했을 때는 테스트를 하면 안전합니다.
로그 회전 테스트는 다음 명령을 실행합니다.sudo logrotate -dv /etc/logrotate.d/rsyslog
정상인 경우
considering log /var/log/python/moisture.log
Creating new state
  Now: 2018-04-08 00:15
  Last rotated at 2018-04-08 00:00
  log does not need rotating (log has been already rotated)
not running postrotate script, since no logs were rotated

오류의 경우
considering log /var/log/python/moisture.log
error: skipping "/var/log/python/moisture.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
Creating new state

※상기 예는 로그 파일의 부모 디렉토리의 허가에 대해서, "root"이외의 그룹에 의해 기입 가능한 상태의 경우

Python 프로그램의 로그 출력 개념에 대해



예를 들어, 단순한 스크립트로 그 실행 결과를 원한다면, 스크립트 실행 결과를 Linux 커멘드의 리다이렉트>로 하는 방법이라도 좋다고 생각했습니다만, 이번과 같은 프로그램내에서 while를 사용해 상시 움직이는 경우는 향해 없기 때문에 파이썬 측에서 출력하는 것이 필요하다고 생각했습니다.

파이썬 프로그램에서 로그를 출력시킬 때는 이번과 같은 open 함수나, 바이너리 데이터를 취급하고 싶은 경우는 pickle 모듈을 사용해 파일에 기입을 실시합니다. 그 밖에도 방법은 있다고 생각합니다만, Linux로 할 수 있는 것은 Linux로 한다. 파이썬에서 하는 일은 파이썬에서 한다. 적재 적소군요.

좋은 웹페이지 즐겨찾기