日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python logging模块日志存储位置踩坑

發布時間:2025/3/20 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python logging模块日志存储位置踩坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

項目過程中寫了一個小模塊,設計到了日志存儲的問題,結果發現了個小問題。

代碼結構如下:

db.py run.py

其中db.py是操作數據庫抽象出來的一個類,run.py是業務邏輯代碼。兩個文件中都有使用Python自帶的logging模塊,來記錄日志。其中前者將日志存入到db_xxx.log下,后者存入run_xxx.log下。

兩者logging相關代碼為:

# db.py import logging import timedt = time.time() logging.basicConfig(filename='db_' + str(dt) + '.log', level=logging.INFO)# run.py import logging import timedt = time.time() logging.basicConfig(filename='run_' + str(dt) + '.log', level=logging.INFO)

同時,在run.py中會調用db.py的函數,例如:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # db.pyclass DB():def __init__(self):xxxxdef select(self):logging.info('log from db.py')# run.pyfrom db import DBif __name__ == '__main__':db = DB()db.select()logging.info('log from run.py')

實際運行起來,發現所有的日志都只會存在 db_xxx.log 中,同時并不會產生 run_xxx.log 文件。

排錯

猜測

依照上面的結果,猜測run.py文件中,引入的db.py中也有logging的設置,但只會有一個生效。

驗證 1

寫兩個py文件first.py和second.py,在second中引用first的函數,看最終日志的輸出文件名及順序。

內容分別為:

# first.pyimport loggingclass TEST():def __init__(self, log_type, dt):dt = str(dt)logging.basicConfig(filename='./log/' + log_type + '_' + dt + '.txt', level=logging.INFO)def test_log(self):logging.info('log from first.py')# second.pyfrom first import TEST import timedt = time.time()import logging logging.basicConfig(filename='./log/' + 'second.txt', level=logging.INFO) logging.info('log from second')test = TEST('db', dt) test.test_log()# 結果? log_dir_test python second.py ? log_dir_test ls log second.txt ? log_dir_test cat log/second.txt INFO:root:log from second INFO:root:log from first.py

可以看到,文件名為 second.txt,即采用了 second.py 的logging設置。同時,日志輸出的順序也是先輸出 second 再是 first。

驗證 2

此時嘗試將second.py的語句順序做一個調整,調整為下面:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # second.pyfrom first import TEST import timedt = time.time() test = TEST('db', dt) test.test_log()import logging logging.basicConfig(filename='./log/' + 'second.txt', level=logging.INFO) logging.info('log from second')# result? log_dir_test cat log/db_1561088221.83.txt INFO:root:log from first.py INFO:root:log from second

可以看到結果存儲到了 db_xxx.txt 中,即采用了 first.py 的logging設置。

驗證 3

再對second.py做調整:

# second.pyfrom first import TEST import timedt = time.time() test = TEST('db', dt)import logging logging.basicConfig(filename='./log/' + 'second.txt', level=logging.INFO) logging.info('log from second')test.test_log()# result? log_dir_test cat log/db_1561088393.36.txt INFO:root:log from second INFO:root:log from first.py

采用了first.py的設置

驗證 4

繼續調整second.py:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # second.pyfrom first import TEST import time import logging logging.basicConfig(filename='./log/' + 'second.txt', level=logging.INFO)dt = time.time() test = TEST('db', dt)logging.info('log from second')test.test_log()# result? log_dir_test cat log/second.txt INFO:root:log from second INFO:root:log from first.py

采用了 second.py 的設置

共性

可以發現,兩個文件的logging設置,在second.py的順序,影響了second.py的logging設置。即:

  • 當 first.py 的logging設置在前的時候,采用first.py的設置
  • 反正,采用second.py的設置
  • 只采用其中一個設置

解釋

起初覺得奇怪,現在想想還是比較容易理解的。

假如 second.py 中已經設置了logging,后面引用了first.py的函數,first.py中又設置了logging。若此時又采用 first.py的設置,那后續如果second.py中又使用了logging.xxx怎么辦?也就是說,Python會覺得混亂,不知所措……

解決辦法

如果還是想達到 db.py 操作都存儲到 db 相關目錄下,run日志存儲到run目錄下怎么辦?似乎沒太好的解決辦法;不優雅的處理方式,可以采用文件操作……比方說使用with open(xx) as f去操作,這樣的話,比較繁瑣。

更好的辦法是什么?就是現在Python的這種機制。即 run.py 相關日志都存儲到 run 目錄下,即使調用了 db.py 的函數,日志也存儲到 run 目錄下。這樣可以保證 run.py 的日志是全的,且時間順序是正確的,減少了排錯的成本。

總結

以上是生活随笔為你收集整理的Python logging模块日志存储位置踩坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。