質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

572閲覧

エラーが出ているのにログファイルに反映されない。

TomF

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/11/01 02:15

初歩的な質問ですみません。

cmdのコンソール画面にて対象のファイル「remove.py」を指定して実行すると、コンソール画面にはエラー内容が表示されるのですが、ログファイル出力された「test.log」にはその内容が記載されません。

それぞれの意味は解説ページでなんとなく把握できたのですが、実際の使い方がよくわからない状態です。
検索も下手なので自分のレベルで理解できるところが見つからず、行き詰ってしまったので質問した次第です。
ご指摘いただけると幸いです。
windows10です。
よろしくお願いいたします。

Python

1import os 2import glob 3import time 4import shutil 5import logging 6 7logger = logging.getLogger('LoggingTest') 8 9logger.setLevel(10) 10 11sh = logging.StreamHandler() 12logger.addHandler(sh) 13 14fh = logging.FileHandler('C:/Users/user/Desktop/test.log') 15logger.addHandler(fh) 16 17formatter = logging.Formatter('%(asctime)s:%(lineno)d:%(levelname)s:%(message)s') 18fh.setFormatter(formatter) 19sh.setFormatter(formatter) 20 21logger.log(10, 'debag') 22logger.log(20, 'info') 23logger.log(30, 'warning') 24logger.log(100, 'test') 25 26 27os.chdir('E:/') 28shutil.rmtree("DCIM") 29shutil.rmtree("MISC") 30 31file_list = glob.glob("*.url") 32 33for file in file_list: 34 print("remove:{0}".format(file)) 35 os.remove(file) 36 37file_list = glob.glob("*.db") 38 39for file in file_list: 40 print("remove:{0}".format(file)) 41 os.remove(file) 42 43file_list = glob.glob("*.bk") 44 45for file in file_list: 46 print("remove:{0}".format(file)) 47 os.remove(file) 48

###出力されたログファイル(test.log)

test.log

12020-11-01 10:39:28,762:30:DEBUG:debag 22020-11-01 10:39:28,762:31:INFO:info 32020-11-01 10:39:28,762:32:WARNING:warning 42020-11-01 10:39:28,762:33:Level 100:test

###コンソール画面

Error

1C:\Users\user>C:/Users/user/desktop/remove.py 22020-11-01 10:39:28,762:30:DEBUG:debag 32020-11-01 10:39:28,762:31:INFO:info 42020-11-01 10:39:28,762:32:WARNING:warning 52020-11-01 10:39:28,762:33:Level 100:test 6Traceback (most recent call last): 7 File "C:\Users\user\Desktop\remove.py", line 37, in <module> 8 shutil.rmtree("DCIM") 9 File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\shutil.py", line 737, in rmtree 10 return _rmtree_unsafe(path, onerror) 11 File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\shutil.py", line 596, in _rmtree_unsafe 12 onerror(os.scandir, path, sys.exc_info()) 13 File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\shutil.py", line 593, in _rmtree_unsafe 14 with os.scandir(path) as scandir_it: 15FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: 'DCIM'

上記のエラーが「test.log」に反映されるようにしたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

例外をフックしてログを吐くようにすることはできます。
ロガーを準備している段階に、このようなコードを挿入してみて下さい。

Python

1import sys 2import traceback 3 4def _except_hook(type_, value, traceback_): 5 s = '例外が発生しました。\n' + ''.join( 6 traceback.format_exception(type_, value, traceback_) 7 ) 8 logger.error(s) 9 10sys.excepthook = _except_hook

もちろん毎回try-exceptを書いても良いですが、めんどくさいのが最大の難点です。

Python

1import sys 2 3try: 4 ... 5except: 6 logger.exception('エラーが発生しました。\n') 7 sys.exit(1)

ところで

ロガーを使うという目的とは異なりますが、リダイレクトも選択肢の一つにはなりそうです。
何にせよ手軽ですし。

cmd

1C:...> python プログラム.py >> test.log 2>&1

投稿2020/11/01 03:45

LouiS0616

総合スコア35658

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

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

TomF

2020/11/01 04:27

回答ありがとうございます! 色々なパターンを提示していただき、全て試してログ出力できました! loggerだけで動かないのには驚きました。 ちなみに処理の内容を全てログに残したい場合はどの様にすればよいのでしょうか? エラーの取り方がわかればそちらもわかると思っていたのですが、難しく感じています。 図々しいお願いですが、お手すきの際に教えていただけると幸いです。
LouiS0616

2020/11/01 04:31

処理の内容というと、ところどころのprint(...)の出力のことですかね? 標準出力・標準エラー出力を過不足なく拾いたいならば、リダイレクトを使うのが素直だと思います。
TomF

2020/11/01 05:33

回答ありがとうございます。 そうなんですか、リダイレクトが簡単で確かなんですね! リダイレクトについて色々調べて使っていきたいと思います。 この度は助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問