🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1068閲覧

Pythonで受信したログを生成してテキストファイルとしてログ出力したい。

grt

総合スコア10

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/20 00:11

前提・実現したいこと

以下のソースコードで現在IPアドレス情報を受け取り、予め配列(ipall)に格納していた文字列と比較して同じIPアドレス情報があった場合はTrue、無かった場合はFalseの判定を入れています。
その内容を以下のように生成してテキストファイルでログとして出力したいのですがうまく出来ません。
ご教示いただけますと幸いです。

□現在のログ
イメージ説明

□生成して出力したいログ
trueなら
ESP-[251.207]-20190920-正しく動作しています。
Falseなら
ESP-[111.111]-20190920-応答がありません。

ソースコード

import socket #通信用 address = ('192.168.1.3', 10000) path_w = r'C:\Users\User\Desktop\log.txt' #log出力先 udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #udpという名前のUDPソケット生成 udp.bind(address) #udpというソケットにaddressを紐づける while True: #受信ループ try: rcv_byte = bytes() #バイトデータ受信用変数 rcv_byte, addr = udp.recvfrom(1024) #最大バイト数設定 msg = rcv_byte.decode() #バイトデータを文字列に変換 print(msg) #文字列表示 with open(path_w,mode='a') as f: f.write(msg) ipall=["251.207","111.111"] #ESP32の一覧IP for i in ipall: print(i in msg) print(i) if msg == 'e': #受信した文字列がeならUDPソケットを閉じて終了 udp.close() break except KeyboardInterrupt:#強制終了を検知したらUDPソケットを閉じて終了 udp.close()

補足情報(FW/ツールのバージョンなど)

Python3.7

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずはじめにログの出力方法ですが、file を"open()->write()->close()"するよりも、logging を使用することをおすすめします。

https://docs.python.org/ja/3/howto/logging.html

理由としては

  • Pythonにてログ出力する最も慣用的な方法である
  • コードのログを出力している箇所が明確になる
  • ログ出力に特化しているので、それなりに最適化されている

ことでしょうか。

で、質問にあるログの出力方法ですが、

質問では

Log

1ESP-[251.207]-20190920-正しく動作しています。

の形式になっておりますが、2番目と3番目を入れ替えて

ESP-20190920-[251.207]-正しく動作しています。

のような記述で良ければ logging のフォーマット機能を使って比較的簡単に書くことができます。

Python

1from logging import getLogger, FileHandler, Formatter, INFO 2 3# LOGGER(ESP用)の設定 4logger = getLogger("ESP") 5logger.setLevel(INFO) 6# ファイル書き込み用にハンドラの設定 7handler = FileHandler('hoge.log') 8handler.setLevel(INFO) 9handler.setFormatter(Formatter('%(name)s-%(asctime)s-%(message)s', 10 datefmt='%Y%m%d')) 11logger.addHandler(handler) 12 13msg = "251.207" # ダミーデータ 14ipall=["251.207","111.111"] #ESP32の一覧IP 15for ip in ipall: 16 if ip in msg: 17 logger.info(f'[{ip}]-正しく動作しています。') 18 else: 19 logger.info(f'[{ip}]-応答がありません。')

出力は以下のようになります。

Log

1ESP-20190920-[251.207]-正しく動作しています。 2ESP-20190920-[111.111]-応答がありません。

また、ログ出力の部分ですが、以下のようメッセージを予め定義しておくことで1行にまとめることもできます。

Python

1LOG_MESSAGES =["応答がありません。", 2 "正しく動作しています。"] 3 4msg = "251.207" # ダミーデータ 5ipall=["251.207","111.111"] #ESP32の一覧IP 6for ip in ipall: 7 logger.info(f'[{ip}]-{LOG_MESSAGES[ip in msg]}')

どうしても

Log

1ESP-[251.207]-20190920-正しく動作しています。

のような形式で出力したいのであれば、datetime.datetime を使って

Python

1from datetime import datetime 2# (略) 3handler.setFormatter(Formatter('%(name)s-%(message)s') 4# (略) 5msg = "251.207" 6ipall=["251.207","111.111"] #ESP32の一覧IP 7for ip in ipall: 8 today = datetime.now().strftime("%Y%m%d") 9 if ip in msg: 10 logger.info(f'[{ip}]-{today}-正しく動作しています') 11 else: 12 logger.info(f'[{ip}]-{today}-応答がありません。')

のようになるでしょうか

投稿2019/09/20 05:01

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grt

2019/09/24 00:06

細かいご説明とソースコードを教えていただきありがとうございました。 またloggingもご教示いただき大変助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問