python?scrapy框架的日志文件問題
scrapy框架中的常用日志配置
LOG_FILE
: 日志輸出文件,如果為None,日志信息會打印在控制臺;LOG_ENABLED
: 是否啟用日志,默認True;LOG_ENCODING
: 日志編碼,默認utf-8;LOG_LEVEL
: 日志等級,默認debug;LOG_FORMAT
: 日志格式;LOG_DATEFORMAT
: 日志日期格式;LOG_STDOUT
: 日志標椎輸出,默認False,如果是True所有標椎輸出都將寫入日志中;LOG_SHORT_NAMES
: 短日志名,默認False,如果是True將不輸出組件名。
日志級別
CRITICAT
— 嚴重錯誤ERROR
— 一般錯誤WARNING
— 警告信息INFO
— 一般信息DEBUG
— 調(diào)試信息
級別:
CRITICAT>ERROR>WARNING>INFO>DEBUG
logging模塊常用format格式說明
%(levelno)s
: 打印日志級別的數(shù)值%(levelname)s
: 打印日志級別名稱%(pathname)s
: 打印當前執(zhí)行程序的路徑,其實就是sys.argv[0]%(filename)s
: 打印當前執(zhí)行程序名%(funcName)s
: 打印日志的當前函數(shù)%(lineno)d
: 打印日志的當前行號%(asctime)s
: 打印日志的時間%(thread)d
: 打印線程ID%(threadName)s
: 打印線程名稱%(process)d
: 打印進程ID%(message)s
: 打印日志信息
日期格式
%y
兩位數(shù)的年份表示(00-99)%Y
四位數(shù)的年份表示(000-9999)%m
月份(01-12)%d
月內(nèi)中的一天(0-31)%H
24小時制小時數(shù)(0-23)%I
12小時制小時數(shù)(01-12)%M
分鐘數(shù)(00=59)%S
秒(00-59)%a
本地簡化星期名稱%A
本地完整星期名稱%b
本地簡化的月份名稱%B
本地完整的月份名稱%c
本地相應的日期表示和時間表示%j
年內(nèi)的一天(001-366)%p
本地A.M.或P.M.的等價符%U
一年中的星期數(shù)(00-53)星期天為星期的開始%w
星期(0-6),星期天為星期的開始%W
一年中的星期數(shù)(00-53)星期一為星期的開始%x
本地相應的日期表示%X
本地相應的時間表示%Z
當前時區(qū)的名稱%%
%號本身
日志配置的常用形式(代碼)
LOG_FILE = "日志文件名" LOG_LEVEL = "日志級別" # 顯示日志級別以上的日志信息(包括自己) LOG_DATEFORMAT = "%Y-%m-%d %H:%M:%S" LOG_FORMAT = "%(asctime)s-%(levelname)s-%(filename)s-%(funcName)s-%(message)s-%(lineno)d"
scrapy中爬蟲使用日志
在爬蟲文件中使用日志:
1.導包 logging;
import logging
2.在自定義custom_settings中添加日志基本配置;
custom_settings = { "LOG_FILE": "a.log", "LOGLEVEL": "INFO" }
3.因為在scrapy框架中,爬蟲文件直接self打點調(diào)用log(),將信息添加到日志文件中;
# logging.INFO 日志級別 self.log("準備采集導航條",logging.INFO)
4.在日志文件中添加日志錯誤信息,需要對錯誤信息進行轉(zhuǎn)換,因為log()只能添加字符串日志信息。
基本代碼實現(xiàn)
try: a = [] print(a[0]) except Exception as e: # self.log(str(e), logging.ERROR) self.log(f"{repr(e)},錯誤在{sys._getframe().f_code.co_filename}的{sys._getframe().f_lineno}行", logging.ERROR) # self.log(e.message, logging.ERROR) # self.log(traceback.print_exc(), logging.ERROR) # self.log(traceback.format_exc(), logging.ERROR)
scrapy 中管道使用文件
1.導包 logging;
import logging
2.配置日志中名字
log = logging.getLogger("a.log")
3.添加日志文件信息
log.info("日志存儲信息") log.debug("日志存儲信息") log.critical("日志存儲信息") log.error("日志存儲信息") log.warning("日志存儲信息")
自定義日志工具類
第一個
- logger.py
#!_*_coding:utf-8_*_ import logging import os LOG_LEVEL = logging.INFO BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 自定義日志類型 LOG_TYPES = { 'transaction': 'transactions.log', 'access': 'access.log', } def log(log_type): """ from logger.logger import log log_obj = log('日志名稱') log_obj.info("普通消息") log_obj.debug("調(diào)試消息") log_obj.warn("警告消息") log_obj.error("錯誤消息") log_obj.critical("hello world") """ log_dir = "%s/log" % (BASE_DIR) log_file = "%s/%s" % (log_dir, LOG_TYPES.get(log_type, log_type+".log")) os.makedirs(log_dir, exist_ok=True) # 創(chuàng)建日志對象 logger = logging.getLogger(log_type) logger.setLevel(LOG_LEVEL) # 創(chuàng)建一個handler,用于輸出到控制臺 ch = logging.StreamHandler() ch.setLevel(LOG_LEVEL) # 創(chuàng)建一個handler,用于寫入日志文件 fh = logging.FileHandler(log_file, encoding="utf-8") fh.setLevel(LOG_LEVEL) # 定義handler的輸出格式formatter """ format參數(shù)中可能用到的格式化串: %(name)s Logger的名字 %(levelno)s 數(shù)字形式的日志級別 %(levelname)s 文本形式的日志級別 %(pathname)s 調(diào)用日志輸出函數(shù)的模塊的完整路徑名,可能沒有 %(filename)s 調(diào)用日志輸出函數(shù)的模塊的文件名 %(module)s 調(diào)用日志輸出函數(shù)的模塊名 %(funcName)s 調(diào)用日志輸出函數(shù)的函數(shù)名 %(lineno)d 調(diào)用日志輸出函數(shù)的語句所在的代碼行 %(created)f 當前時間,用UNIX標準的表示時間的浮 點數(shù)表示 %(relativeCreated)d 輸出日志信息時的,自Logger創(chuàng)建以 來的毫秒數(shù) %(asctime)s 字符串形式的當前時間。默認格式是 “2018-07-08 16:49:45,896”。逗號后面的是毫秒 %(thread)d 線程ID??赡軟]有 %(threadName)s 線程名??赡軟]有 %(process)d 進程ID。可能沒有 %(message)s用戶輸出的消息 """ formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) fh.setFormatter(formatter) # 給logger添加handler logger.addHandler(ch) logger.addHandler(fh) return logger
- 使用方法
1.導包
from logger import log
2.調(diào)用
log_obj = log('日志文件名') log_obj.info("普通消息") log_obj.debug("調(diào)試消息") log_obj.warn("警告消息") log_obj.error("錯誤消息") log_obj.critical("嚴重錯誤信息")
第二個
logger.py
import logging from logging import StreamHandler, FileHandler, Formatter from logging.handlers import TimedRotatingFileHandler, RotatingFileHandler class Logger(object): # log = logging.getLogger(__name__) filename = "123.log" log_format = "%(asctime)s|%(levelname)s|%(filename)s|%(funcName)s|%(message)s|%(lineno)d" is_file = False is_time = False @classmethod def log_init(cls): log = logging.getLogger(__name__) handler1 = StreamHandler() # 輸出 handler2 = FileHandler(cls.filename, encoding="gb2312") # 寫入 log.setLevel(logging.DEBUG) handler1.setLevel(logging.DEBUG) handler2.setLevel(logging.DEBUG) format = Formatter(cls.log_format) handler1.setFormatter(format) handler2.setFormatter(format) if cls.is_time: # interval 是指等待多少個單位when的時間后,Logger會自動重建文件,當然,這個文件的創(chuàng)建取決于filename+suffix,若這個文件跟之前的文件有重名,則會自動覆蓋掉以前的文件,所以有些情況suffix要定義的不能因為when而重復。 # backupCount 是保留日志個數(shù)。默認的0是不會自動刪除掉日志。若設3,則在文件的創(chuàng)建過程中庫會判斷是否有超過這個3,若超過,則會從最先創(chuàng)建的開始刪除。 filehandler = logging.handlers.TimedRotatingFileHandler("a" + cls.filename, when='S', interval=1, backupCount=3) # 設置后綴名稱,跟strftime的格式一樣 when設置的是S這個結(jié)尾必須是S.log filehandler.suffix = "%Y-%m-%d_%H-%M-%S.log" filehandler.setFormatter(format) log.addHandler(filehandler) if cls.is_file: # 寫入文件,如果文件超過100個Bytes,僅保留5個文件。 handler = logging.handlers.RotatingFileHandler(cls.filename, maxBytes=100, backupCount=5) # 設置后綴名稱,跟strftime的格式一樣 handler.setFormatter(format) log.addHandler(handler) log.addHandler(handler1) log.addHandler(handler2) return log @classmethod def debug(cls, message): log = cls.log_init() log.debug(message) @classmethod def warning(cls, message): log = cls.log_init() log.warning(message) @classmethod def error(cls, message): log = cls.log_init() log.error(message) @classmethod def critical(cls, message): log = cls.log_init() log.critical(message) @classmethod def info(cls, message): log = cls.log_init() log.info(message)
- 使用方法
1.導包
from logger import Logger
2.調(diào)用
Logger.filename = "a.log" # 設置日志文件名,如果不設置,默認"123.log" Logger.log_format = "" # 設置日志文件顯示格式 Logger.is_file = True # 設置基于文件大小日志存儲,默認存儲一個日志文件 Logger.is_time = True # 設置基于時間保存日志,默認不設置 Logger.info("普通消息") Logger.debug("調(diào)試消息") Logger.warn("警告消息") Logger.error("錯誤消息") Logger.critical("嚴重錯誤信息")
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python3安裝及pip3報ERROR:No?matching?distribution?found?for解
這篇文章主要給大家介紹了關于python3安裝及pip3報ERROR:No?matching?distribution?found?for解決的相關資料,文中通過代碼以及圖文介紹的非常詳細,需要的朋友可以參考下2023-08-08Python內(nèi)置的HTTP協(xié)議服務器SimpleHTTPServer使用指南
這篇文章主要介紹了Python內(nèi)置的HTTP協(xié)議服務器SimpleHTTPServer使用指南,SimpleHTTPServer本身的功能十分簡單,文中介紹了需要的朋友可以參考下2016-03-03python中子類調(diào)用父類函數(shù)的方法示例
Python中類的初始化方法是__init__(),因此父類、子類的初始化方法都是這個,下面這篇文章主要給大家介紹了關于python中子類調(diào)用父類函數(shù)的方法示例,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。2017-08-08Python 中對 XML 文件的編碼轉(zhuǎn)換問題
這篇文章主要介紹了Python 中對 XML 文件的編碼轉(zhuǎn)換問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03如何使用pyinstaller打包多個和單個python文件詳解
最近需要將python寫的程序打包分發(fā)給其他同事使用,下面這篇文章主要給大家介紹了關于如何使用pyinstaller打包多個和單個python文件的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06WxPython開發(fā)之實現(xiàn)表格數(shù)據(jù)導出到Excel并打開
在 Python 中使用 wxPython 導出實體類列表數(shù)據(jù)到 Excel,通??梢越柚?nbsp;openpyxl 或 pandas 庫來實現(xiàn),下面就跟隨小編一起來了解下具體操作吧2024-12-12