python?scrapy框架的日志文件問題
更新時間:2023年08月12日 10:38:29 作者:小胖_@
這篇文章主要介紹了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— 調試信息
級別:
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月內中的一天(0-31)%H24小時制小時數(shù)(0-23)%I12小時制小時數(shù)(01-12)%M分鐘數(shù)(00=59)%S秒(00-59)%a本地簡化星期名稱%A本地完整星期名稱%b本地簡化的月份名稱%B本地完整的月份名稱%c本地相應的日期表示和時間表示%j年內的一天(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打點調用log(),將信息添加到日志文件中;
# logging.INFO 日志級別
self.log("準備采集導航條",logging.INFO)4.在日志文件中添加日志錯誤信息,需要對錯誤信息進行轉換,因為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("調試消息")
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 調用日志輸出函數(shù)的模塊的完整路徑名,可能沒有
%(filename)s 調用日志輸出函數(shù)的模塊的文件名
%(module)s 調用日志輸出函數(shù)的模塊名
%(funcName)s 調用日志輸出函數(shù)的函數(shù)名
%(lineno)d 調用日志輸出函數(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.調用
log_obj = log('日志文件名')
log_obj.info("普通消息")
log_obj.debug("調試消息")
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這個結尾必須是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.調用
Logger.filename = "a.log" # 設置日志文件名,如果不設置,默認"123.log"
Logger.log_format = "" # 設置日志文件顯示格式
Logger.is_file = True # 設置基于文件大小日志存儲,默認存儲一個日志文件
Logger.is_time = True # 設置基于時間保存日志,默認不設置
Logger.info("普通消息")
Logger.debug("調試消息")
Logger.warn("警告消息")
Logger.error("錯誤消息")
Logger.critical("嚴重錯誤信息")總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
使用Python實現(xiàn)Word文檔的深度克隆的完整代碼
在日常辦公場景中,我們經常需要對 Word 文檔進行內容提取、樣式復制或格式轉換,本文將詳細介紹如何使用 python-docx 庫實現(xiàn) Word 文檔的深度克隆功能,包括段落樣式、表格格式、分頁符等元素的完整復制,需要的朋友可以參考下2025-05-05
Python實現(xiàn)數(shù)據(jù)地址實體抽取
大家好,本篇文章主要講的是Python實現(xiàn)數(shù)據(jù)地址實體抽取,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02
python編程開發(fā)之類型轉換convert實例分析
這篇文章主要介紹了python編程開發(fā)之類型轉換convert用法,結合實例形式分析了Python中常見的數(shù)據(jù)類型及類型轉換convert的具體使用方法,需要的朋友可以參考下2015-11-11

