logging模塊和包

日志模塊和包

logging

logging模塊簡介

logging模塊是記錄我們軟件的各種狀態,還可以記錄各種交易信息

其實每個軟件都是有錯誤日志的,開發人員可以通過錯誤日志中的內容對他的程序進行修改

日志級別

import logginglogging.debug('調試debug')           # DEBUG = 10
logging.info('消息info')             # INFO = 20
logging.warning('警告warn')          # WARNING = 30
logging.error('錯誤error')           # ERROR = 40
logging.critical('嚴重critical')     # CRITICAL = 50'''
WARNING:root:警告warn
ERROR:root:錯誤error
CRITICAL:root:嚴重critical
'''

默認情況下Python的logging模塊將日志打印到了標準輸出中,且只顯示了大于等于WARNING級別的日志,這說明默認的日志級別設置為WARNING(日志級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG),默認的日志格式為日志級別:Logger名稱:用戶輸出消息。

靈活配置日志級別、日志格式、輸出位置

import logging  
logging.basicConfig(level=logging.DEBUG,  format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  datefmt='%a, %d %b %Y %H:%M:%S',  filename='/tmp/test.log',  filemode='w')  logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')

basicConfig()函數中可通過具體參數來更改logging模塊默認行為,可用參數有:

  • filename:用指定的文件名創建FiledHandler,這樣日志會被存儲在指定的文件中。
  • filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
  • format:指定handler使用的日志顯示格式。
  • datefmt:指定日期時間格式。
  • level:設置記錄日志的級別
  • stream:用指定的stream創建StreamHandler。可以指定輸出到
  • sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。

format參數中可能用到的格式化串

  • %(name)s Logger的名字
  • %(levelno)s 數字形式的日志級別
  • %(levelname)s 文本形式的日志級別
  • %(pathname)s 調用日志輸出函數的模塊的完整路徑名,可能沒有
  • %(filename)s 調用日志輸出函數的模塊的文件名
  • %(module)s 調用日志輸出函數的模塊名
  • %(funcName)s 調用日志輸出函數的函數名
  • %(lineno)d 調用日志輸出函數的語句所在的代碼行
  • %(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
  • %(relativeCreated)d 輸出日志信息時的,自Logger創建以 來的毫秒數
  • %(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒
  • %(thread)d 線程ID。可能沒有
  • %(threadName)s 線程名。可能沒有
  • %(process)d 進程ID。可能沒有
  • %(message)s用戶輸出的消息

logging對象配置

import logginglogger = logging.getLogger()
# 創建一個handler,用于寫入日志文件
fh = logging.FileHandler('test.log',encoding='utf-8') # 再創建一個handler,用于輸出到控制臺 
ch = logging.StreamHandler() 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setLevel(logging.DEBUG)fh.setFormatter(formatter) 
ch.setFormatter(formatter) 
logger.addHandler(fh) #logger對象可以添加多個fh和ch對象 
logger.addHandler(ch) logger.debug('logger debug message') 
logger.info('logger info message') 
logger.warning('logger warning message') 
logger.error('logger error message') 
logger.critical('logger critical message')

logging庫提供了多個組件:Logger、Handler、Filter、Formatter。Logger對象提供應用程序可直接使用的接口,Handler發送日志到適當的目的地,Filter提供了過濾日志信息的方法,Formatter指定日志顯示格式。另外,可以通過:logger.setLevel(logging.Debug)設置級別,當然,也可以通過

fh.setLevel(logging.Debug)單對文件流設置某個級別。

包的簡介

包是一種通過使用‘.模塊名’來組織python模塊名稱空間的方式。

具體的:包就是一個包含有__init__.py文件的文件夾,所以其實我們創建包的目的就是為了用文件夾將文件/模塊組織起來

需要強調的是:

  1. 在python3中,即使包下沒有__init__.py文件,import 包仍然不會報錯,而在python2中,包下一定要有該文件,否則import 包報錯
  2. 創建包的目的不是為了運行,而是被導入使用,記住,包只是模塊的一種形式而已,包的本質就是一種模塊

為何要使用包

包的本質就是一個文件夾,那么文件夾唯一的功能就是將文件組織起來
隨著功能越寫越多,我們無法將所以功能都放到一個文件中,于是我們使用模塊去組織功能,而隨著模塊越來越多,我們就需要用文件夾將模塊文件組織起來,以此來提高程序的結構性和可維護性

glance/                   #Top-level package├── __init__.py      #Initialize the glance package├── api                  #Subpackage for api│   ├── __init__.py│   ├── policy.py│   └── versions.py├── cmd                #Subpackage for cmd│   ├── __init__.py│   └── manage.py└── db                  #Subpackage for db├── __init__.py└── models.py

注意項

#1.關于包相關的導入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什么位置,在導入時都必須遵循一個原則:凡是在導入時帶點的,點的左邊都必須是一個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。但對于導入后,在使用時就沒有這種限制了,點的左邊可以是包,模塊,函數,類(它們都可以用點的方式調用自己的屬性)。#2、import導入文件時,產生名稱空間中的名字來源于文件,import 包,產生的名稱空間的名字同樣來源于文件,即包下的__init__.py,導入包本質就是在導入該文件#3、包A和包B下有同名模塊也不會沖突,如A.a與B.a來自倆個命名空間

文件內容

按 Ctrl+C 復制代碼

按 Ctrl+C 復制代碼

執行文件與示范文件在同級目錄下 

包的使用之import

import glance.db.models
glance.db.models.register_models('mysql') 

單獨導入包名稱時不會導入包中所有包含的所有子模塊,如

#在與glance同級的test.py中
import glance
glance.cmd.manage.main()'''
執行結果:
AttributeError: module 'glance' has no attribute 'cmd'''' 

解決方法:

#glance/__init__.py
from . import cmd#glance/cmd/__init__.py
from . import manage

執行:

#在于glance同級的test.py中
import glance
glance.cmd.manage.main()

包的使用之from ... import ...

需要注意的是from后import導入的模塊,必須是明確的一個不能帶點,否則會有語法錯誤,如:from a import b.c是錯誤語法

from glance.db import models
models.register_models('mysql')from glance.db.models import register_models
register_models('mysql')

from glance.api import *

在講模塊時,我們已經討論過了從一個模塊內導入所有,此處我們研究從一個包導入所有

此處是想從包api中導入所有,實際上該語句只會導入包api下__init.py文件中定義的名字,我們可以在這個文件中定義_all:

# 在__init__.py中定義
x=10def func():print('from api.__init.py')__all__=['x','func','policy']

此時我們在于glance同級的文件中執行from glance.api import *就導入__all__中的內容(versions仍然不能導入)。

# 在__init__.py中定義
x = 10def func():print('from api.__init.py')__all__=['x','func','policy']

此時我們在于glance同級的文件中執行from glance.api import *就導入__all__中的內容(versions仍然不能導入)。

練習:

# 執行文件中的使用效果如下,請處理好包的導入
from glance import *get()
create_resource('a.conf')
main()
register_models('mysql')

絕對導入和相對導入

我們的最頂級包glance是寫給別人用的,然后在glance包內部也會有彼此之間互相導入的需求,這時候就有絕對導入和相對導入兩種方式:

絕對導入:以glance作為起始

相對導入:用.或者..的方式最為起始(只能在一個包中使用,不能用于不同目錄內)

例如:我們在glance/api/version.py中想要導入glance/cmd/manage.py

在glance/api/version.py# 絕對導入
from glance.cmd import manage
manage.main()# 相對導入
from ..cmd import manage
manage.main()

測試結果:注意一定要在于glance同級的文件中測試

from glance.api import versions 

包以及包所包含的模塊都是用來被導入的,而不是被直接執行的。而環境變量都是以執行文件為準的

比如我們想在glance/api/versions.py中導入glance/api/policy.py,有的同學一抽這倆模塊是在同一個目錄下,十分開心的就去做了,它直接這么做

# 在version.py中import policy
policy.get()

沒錯,我們單獨運行version.py是一點問題沒有的,運行version.py的路徑搜索就是從當前路徑開始的,于是在導入policy時能在當前目錄下找到

但是你想啊,你子包中的模塊version.py極有可能是被一個glance包同一級別的其他文件導入,比如我們在于glance同級下的一個test.py文件中導入version.py,如下

from glance.api import versions'''
執行結果:
ImportError: No module named 'policy'
''''''
分析:
此時我們導入versions在versions.py中執行
import policy需要找從sys.path也就是從當前目錄找policy.py,
# 這必然是找不到的
'''

絕對導入與相對導入總結

絕對導入與相對導入# 絕對導入: 以執行文件的sys.path為起始點開始導入,稱之為絕對導入
#       優點: 執行文件與被導入的模塊中都可以使用
#       缺點: 所有導入都是以sys.path為起始點,導入麻煩# 相對導入: 參照當前所在文件的文件夾為起始開始查找,稱之為相對導入
# 符號: .代表當前所在文件的文件加,..代表上一級文件夾,...代表上一級的上一級文件夾
#       優點: 導入更加簡單
#       缺點: 只能在導入包中的模塊時才能使用
# 注意:
#  1. 相對導入只能用于包內部模塊之間的相互導入,導入者與被導入者都必須存在于一個包內
#    2. attempted relative import beyond top-level package # 試圖在頂級包之外使用相對導入是錯誤的,言外之#       意,必須在頂級包內使用相對導入,每增加一個.代表跳到上一級文件夾,而上一級不應該超出頂級包

轉載于:https://www.cnblogs.com/lifangzheng/p/11284224.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python軟件開發規范

軟件開發規范 什么是軟件開發規范? 好的設計項目目錄結構,就和編碼風格一樣,是每個程序員都有的風格,但是在流水化標準化作業過程中,個性和風格是 不被鼓勵的。如果你去維護一個非常不好讀的項目,雖然實現邏…

D3Vueecharts個人亂記

利用d3vue開發的一個網絡拓撲圖 https://copyfuture.com/blogs-details/20200710101052238h32wazjmcii49dr 一開始用的是echart畫的。 根據https://gallery.echartsjs.com/editor.html?cxH1Rkt3hkb,成功畫出簡單的節點關系。 如圖: 總結—— 【優…

vue中使用Vue-pdf在線預覽

下載 npm i vue-pdf 引入(在所需要預覽的頁面) <script>import axios from axiosimport pdf from vue-pdfimport CMapReaderFactory from vue-pdf/src/CMapReaderFactory.js // 加載中文的包export default {components: {pdf},data () {return {numPages:&#xff0c;…

oracle 自定義 聚合函數

Oracle自定義聚合函數實現字符串連接的聚合 create or replace type string_sum_obj as object ( --聚合函數的實質就是一個對象 sum_string varchar2(4000), static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number, --對象初始化 member func…

Vue3里的setup中使用vuex

useStore 這里我們可以直接從vuex 4.X中解構出useStore方法&#xff0c;就可以在setup中使用vuex的相關函數 template 使用$store <template><div><h2>{{ $store.state.count }}</h2><button click"increaseCount">點擊</button…

JQ 取CHECKBOX選中項值

備忘錄 $("[namecheckbox]:checked").each(function(){ alert((this).val()); }) ;轉載于:https://www.cnblogs.com/showblog/archive/2010/09/13/1825099.html

vue3 echarts5 graph關系圖譜 點擊圖例節點消失線不消失重復生成問題

const myChart ref(null);const myCharts ref(null);onMounted(() > {// 這種會導致線仍然存在 重復生成myCharts.value echarts.init(myChart.value);myCharts.value.setOption(option);});return {myChart,myCharts,}; 現象&#xff1a;如下圖1 點擊圖例類目2&#xf…

非常完整的coco screator socketio

https://github.com/SeaPlanet/cocoscreator_chat 前端源碼 https://github.com/socketio/socket.io-client https://cdnjs.com/libraries/socket.io 轉載于:https://www.cnblogs.com/suneil/p/11288628.html

JavaScript 中 obj.hasOwnProperty(prop) 方法

語法 obj.hasOwnProperty(prop) 參數 prop 要檢測的屬性的 String 字符串形式表示的名稱&#xff0c;或者 Symbol。 返回值 用來判斷某個對象是否含有指定的屬性的布爾值 Boolean。 描述 所有繼承了 Object 的對象都會繼承到 hasOwnProperty 方法。這個方法可以用來檢測…

python面向對象初識

面向對象編程 1.面向對象初步了解 ? 面向過程編程與函數編程對比&#xff1a; s1 ajdsgkaffddha count 0 for i in s1:count 1 print(f字符串的長度為{count}) # 面向過程編程每計算一次便使用一次for循環def my_len(s): # 計算數據類型長度的函數&#xff0c;可重復使用…

Vue3 VSCode新建項目報錯The template root requires exactly one element.

1.首先我們點擊左側第四個圖標插件2.輸入框搜索vetur插件3.點擊設置圖標&#xff0c;再點擊擴展設置4.搜素vetur>validation>template&#xff0c;取消vetur>validation>template的勾選 然后就不會報錯了

計算機視覺概述

關于計算機視覺的介紹性文章&#xff0c;包括計算機視覺的定義&#xff0c;和人類視覺的區別以及涉及到的學科等等。 1. 什么是計算機視覺 計算機視覺既是工程領域&#xff0c;也是科學領域中的一個富有挑戰性重要研究領域。計算機視覺是一門綜合性的學科&#xff0c;它已經吸引…

Java生鮮電商平臺-電商支付流程架構實戰

Java生鮮電商平臺-電商支付流程架構實戰 說明&#xff1a;我一直秉承的就是接地氣的業務架構實戰。我的文章都有一個這樣的核心。 1. 業務場景 2. 解決問題。 3.代碼實現。 4.代碼重構。 5.總結與復盤。 6.缺點與防范 一、場景描述 想必大家都曾遇到過這個問題&#xff0c;在電…

vue3.0 AntDesignVue2.0 table的rowkey報錯問題解決方法

Warning: [antdv: Each record in table should have a unique key prop,or set rowKey to an unique primary key.] Warning: [antdv: Table] Each record in dataSource of table should have a unique key prop, or set rowKey of Table to an unique primary key 提示因為…

模式識別掃盲

模式識別是對表征事物或現象的各種形式的信息進行處理和分析&#xff0c;以對事物或現象進行描述、辨認、分類和解釋的過程&#xff0c;是信息科學和人工智能的重要組成部分。英文“Pattern”源于法文“Patron”&#xff0c;本來是指可作為大家典范的理想的人&#xff0c;或用以…

vue2項目使用codemirror插件實現代碼編輯器功能

1、使用npm安裝依賴 npm install --save codemirror 2、在頁面中放入如下代碼 <template><textarea ref"mycode" class"codesql" v-model"code" style"height:200px;width:600px;"></textarea> </template>…

CentOS 6.5系統安裝配置LAMP(Apache+PHP5+MySQL)服務器環境

安裝篇&#xff1a; 一、安裝Apache yum install httpd #根據提示&#xff0c;輸入Y安裝即可成功安裝 /etc/init.d/httpd start#啟動Apache 備注&#xff1a;Apache啟動之后會提示錯誤&#xff1a; 正在啟動 httpd:httpd: Could not reliably determine the servers fully qual…

前端有用的庫

HTML awesome-html5 精選的HTML5資源精選清單 CSS tailwindcss 與Tailwind CSS相關的很棒的事情awesome-css-frameworks 很棒的CSS框架列表awesome-css-cn CSS 資源大全中文版&#xff0c;內容包括&#xff1a;CSS預處理器、框架、CSS結構、代碼風格指南、命名習慣等等awesom…

計算機視覺牛人(轉載)(最早在自動化所論壇上發現的)

paper畢竟是死的, 寫paper的人才是活的. 那么我現在研究一下cv圈的格局, 按師承關系, 借鑒前人, 我總結a tree stucture of cv guys.David Marr----->Shimon Ullman (Weizmann) ----->Eric Grimson (MIT)----->Daniel Huttenlocher (Cornell)----->Pedro Felzenszw…

Java生鮮電商平臺-促銷系統的架構設計與源碼解析

Java生鮮電商平臺-促銷系統的架構設計與源碼解析 說明&#xff1a;本文重點講解現在流行的促銷方案以及源碼解析,讓大家對促銷&#xff0c;納新有一個深入的了解與學習過程. 促銷系統是電商系統另外一個比較大&#xff0c;也是比較復雜的系統&#xff0c;作為一個賣貨的&#x…