39611

[code]

    import logging
    logging.basicConfig(level=logging.DEBUG, 
                        format='%(asctime)s - %(levelname)s - %(message)s')
    
    def factorial(n):
        logging.debug('factorial({})開始'.format(n))
        total = 1
        for i in range(1, n + 1):
            total *= i
            logging.debug('i = {}, total = {}'.format(i, total))
        logging.debug('factorial({})終了'.format(n))
        return total
    
    print(factorial(5))
    logging.debug('プログラム終了')
    
[/code]

このプログラムはメソッドの中でログを取ることによってプログラムがどのように動いているかを把握するためのテストプログラムです。ログの役割についてはなんとなく理解できてきました。「退屈なことはpythonにやらせよう」という書籍をもとに進めています。  
しかしこのプログラムを実行すると・・・↓

[code]

    runfile('C:/Users/sugimoto/Desktop/atom作業フォルダ/python/プログラム/ログを取る.py', wdir='C:/Users/sugimoto/Desktop/atom作業フォルダ/python/プログラム')
    120
    --- Logging error ---
    Traceback (most recent call last):
      File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 992, in emit
        msg = self.format(record)
      File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 838, in format
        return fmt.format(record)
      File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 578, in format
        s = self.formatMessage(record)
    
[/code]

以下に膨大なメッセージが表示され、フォーマット通りの結果が返ってきません。コードは間違っていないと思うのですが、どこかにミスがあるのでしょうか？

**コメントアドバイスを受けファイル名を修正しました**  
1\. ログを取る.py → Logging error  
2\. logは.py → 成功  
3\. ログをとる.py → 成功  
4\. ログを取る.py → 成功（最初にエラーがでていたファイル名に戻してもうまくいった。）

[code]

    runfile('C:/Users/sugimoto/Desktop/atom作業フォルダ/python/プログラム/ログを取る.py', wdir='C:/Users/sugimoto/Desktop/atom作業フォルダ/python/プログラム')
    2017-11-16 13:19:59,744 - DEBUG - factorial(5)開始
    2017-11-16 13:19:59,746 - DEBUG - i = 1, total = 1
    2017-11-16 13:19:59,747 - DEBUG - i = 2, total = 2
    2017-11-16 13:19:59,747 - DEBUG - i = 3, total = 6
    2017-11-16 13:19:59,748 - DEBUG - i = 4, total = 24
    2017-11-16 13:19:59,749 - DEBUG - i = 5, total = 120
    2017-11-16 13:19:59,749 - DEBUG - factorial(5)終了
    2017-11-16 13:19:59,750 - DEBUG - プログラム終了
    120
    
[/code]

**エラーが発生した原因に仮説をたてました**

  1. 開発環境はspyderでプログラムの先頭に# - _\- coding: utf-8 -_ -を書かずに保存していたことにきづきました。
  2. 結果shiftjisか何かで読み込んだ結果エラーが発生した。
  3. その後ファイル名の変更はファイルエディタのatomで変更した。
  4. 結果、ファイルはutf-8の文字コードで保存されることになった
  5. そのため同じ名前のファイル名でもプログラムが正常に動いた

これは仮説ですが、たぶんこんな感じです。spyderはあまり使いなれていないこともあり、atomでファイル名を変更しました。atomは学習のメモ用にも使っているので、いつも両方使用しております。atomには「auto
encoding」というパッケージが入っているで、atomで名前を変えたときに文字コードが変わったのではないかと思います。

spyderは新規ファイル作成時に 「# - _\- coding: utf-8 -_
-」と書かれた状態で作成されるのですが、今回はなぜかそれを消していました。  
（ながながと失礼します）


CC BY-SA 3.0
2017-11-16T02:57:33.260
39609
2017-11-16T05:27:31.837
2017-11-16T05:27:31.837
26076
26076
question
python
loggingモジュールがうまく動作しない。


パス名やファイル名にマルチバイト文字が含まれているからかもしれません。全てASCIIの範囲に含まれる文字にしてみてください。

これには、単にマルチバイト対応していないライブラリが未だに存在するという理由だけでなく、Windows
の場合ファイルパスの文字コードやコマンドプロンプトの文字コードとプログラムの文字コードとの変換の間にバグがあるかもしれないという理由があります。

* * *

再度元に戻したら上手くいったとのことですが、これの理由はよく分かりませんね……。


CC BY-SA 3.0
2017-11-16T04:41:20.803
39611
2017-11-16T04:41:20.803
19110
39609
answer