1. 程式人生 > >【Python程式設計】Python_logging 模組

【Python程式設計】Python_logging 模組

Python_logging 模組


一、日誌的作用?

在每天運維人員的工作中,接觸伺服器還是很多的,比如:web伺服器,有可能有一個服務宕了,我們都會去看它的日誌,比如web服務Nginx為例:Nginx啟動失敗,首先我們會去它安裝路徑查詢error.log這個日誌,因為這個日誌裡面存放著內容:告訴你為什麼nginx會啟動失敗,有很多原因,所以在這裡日誌起到了很大的作用,它不僅能為運維人員提供幫助,同時也可以給研發人員進行日誌參考來除錯程式碼,及時發現問題並快速定位、解決問題,補救損失。

1、日誌的等級

在日誌中有五個等級如下:

  • debug:這是一個debug日誌的級別,是一個詳細資訊日誌。
  • info:這是一個info日誌的級別,證明事情按預期工作。 關鍵事件。
  • warning:這是一個warning日誌級別,是一個警告日誌。
  • error:這是一個error日誌級別,是一個錯誤日誌。
  • critical:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌(災難)

在使用日誌的時候,我們需要匯入logging模組。 debug info等等日誌級別就是logging裡面的一些方法,後面加上需要輸出的內容就可以了。

例如1:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging.
debug("這是一個debug日誌的級別,是一個詳細資訊日誌") logging.info("這是一個info日誌的級別,是一個確認事情按預期工作的日誌") logging.warning("這是一個warning的日誌級別,是一個警告的日誌") logging.error("這是一個error的日誌級別,是一個錯誤的日誌") logging.critical("這是一個critical日誌級別,是一個非常嚴重錯誤的日誌") # 以下為輸出的結果 >>> WARNING:root:這是一個warning的日誌級別,是一個警告的日誌 ERROR:root:這是一個error的日誌級別,是一個錯誤的日誌 CRITICAL:
root:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌

注意:在5個日誌級別等級中,預設的等級是warning,所以預設輸出warning等級以上的日誌資訊,如:warning error critical

2、配置日誌的等級

在以上的例子中可以看出,預設輸出的是warning以上的等級日誌資訊,更改等級配置可以通過logging.besicConfig方法來做一些日誌等級的配置

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(level="DEBUG") # 我們可以使用basicConfig來配置日誌的等級。

logging.debug("這是一個debug日誌的級別,是一個詳細資訊日誌")
logging.info("這是一個info日誌的級別,是一個確認事情按預期工作的日誌")
logging.warning("這是一個warning的日誌級別,是一個警告的日誌")
logging.error("這是一個error的日誌級別,是一個錯誤的日誌")
logging.critical("這是一個critical日誌級別,是一個非常嚴重錯誤的日誌")
# 以下為輸出的結果:
DEBUG:root:這是一個debug日誌的級別,是一個詳細資訊日誌
INFO:root:這是一個info日誌的級別,是一個確認事情按預期工作的日誌
WARNING:root:這是一個warning的日誌級別,是一個警告的日誌
ERROR:root:這是一個error的日誌級別,是一個錯誤的日誌
CRITICAL:root:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌

那麼使用logging.basicConfig就可以對日誌的等級進行配置 後面加:level="日誌的等級"

3、配置日誌的輸出資訊

有時候我們需要輸出一些內容,比如access.log日誌一樣,有時間,網址,狀態碼,使用者等等

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
# 同時還是使用basicConfig來配置,levelname就是日誌等級的意思,message就是日誌的內容。
>>>
DEBUG:這是一個debug日誌的級別,是一個詳細資訊日誌
INFO:這是一個info日誌的級別,是一個確認事情按預期工作的日誌
WARNING:這是一個warning的日誌級別,是一個警告的日誌
ERROR:這是一個error的日誌級別,是一個錯誤的日誌
CRITICAL:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌

4、如何修改日誌時間的格式?

logging.basicConfig(format="%(asctime)a:%(message)s",level="DEBUG")
>>>
2018-11-11 23:05:39,642:這是一個debug日誌的級別,是一個詳細資訊日誌
2018-11-11 23:05:39,642:這是一個info日誌的級別,是一個確認事情按預期工作的日誌
2018-11-11 23:05:39,642:這是一個warning的日誌級別,是一個警告的日誌
2018-11-11 23:05:39,643:這是一個error的日誌級別,是一個錯誤的日誌
2018-11-11 23:05:39,643:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌

5、來點稍微複雜的格式?

提到複雜的格式,應該是在logging.baicConfig()括號裡面加點其他的東西就可以瞭如下:

logging.basicConfig(format='%(lineno)d - %(filename)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s',level="DEBUG")

logging.debug("這是一個debug日誌的級別,是一個詳細資訊日誌")
logging.info("這是一個info日誌的級別,是一個確認事情按預期工作的日誌")
logging.warning("這是一個warning的日誌級別,是一個警告的日誌")
logging.error("這是一個error的日誌級別,是一個錯誤的日誌")
logging.critical("這是一個critical日誌級別,是一個非常嚴重錯誤的日誌")
>>>
13 - loglog.py - 2018-11-11 23:15:54,000 - root - DEBUG - 這是一個debug日誌的級別,是一個詳細資訊日誌
14 - loglog.py - 2018-11-11 23:15:54,001 - root - INFO - 這是一個info日誌的級別,是一個確認事情按預期工作的日誌
15 - loglog.py - 2018-11-11 23:15:54,001 - root - WARNING - 這是一個warning的日誌級別,是一個警告的日誌
16 - loglog.py - 2018-11-11 23:15:54,001 - root - ERROR - 這是一個error的日誌級別,是一個錯誤的日誌
17 - loglog.py - 2018-11-11 23:15:54,001 - root - CRITICAL - 這是一個critical日誌級別,是一個非常嚴重錯誤的日誌

這時候輸出的就有點專業了,解釋如下:

  • lineno:輸出日誌的行數
  • filename:輸出當前日誌檔案的名稱
  • asctime:輸出當前的一個時間
  • name: 輸出當前使用者名稱稱
  • levelname:輸出當前的日誌級別
  • message:輸出當前日誌的內容

6、如何在工程中使用如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import logging

def yankerp(logger_name="YANKAI-LOG", log_file="yankai.log",level=logging.DEBUG):
    # 建立logger物件
    logger = logging.getLogger(logger_name)
    logger.setLevel(level)

    # 建立控制檯
    ch = logging.StreamHandler()
    ch.setLevel(level)

    # 建立檔案
    fh = logging.FileHandler(filename=log_file, encoding="utf-8")

    # create formatter
    formatter = logging.Formatter('%(asctime)s - %(filename)s - %(name)s - [line:%(lineno)d]- %(levelname)s - %(message)s')

    # 新增 formatter

    ch.setFormatter(formatter)
    fh.setFormatter(formatter)

    logger.addHandler(ch)
    logger.addHandler(fh)

    return logger

首先定義了一個函式yankerp 定義了logger_name log_file level引數。

1、首先建立logger物件,其實在這裡logger只是一個變數而已,把logging.getLogger類例項化成一個logger物件

2、使用logger物件的其中的方法setLevel設定日誌等級:(level)這裡就是DEBUG

3、建立控制檯,使用logging.StreamHandler() 方法,例項化生成物件ch

4、用過ch物件裡面的setLevl方法來設定日誌等級

5、建立檔案,使用logging裡面方法,FileHandler定義了file_name也就是yankai.log檔名稱及 encoding:編碼格式.

6、建立formatter定義了日誌的輸出格式例項化到formatter物件。

最後新增formatter 控制檯/建立檔案把formatter輸出格式的物件新增到控制檯/檔案,最後使用剛開始例項化的logger物件把檔案,控制檯新增進入,最後返回logger物件。

如何使用如下:

在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述