วิธีบันทึกชื่อไฟล์ต้นฉบับและหมายเลขบรรทัดใน Python


123

เป็นไปได้หรือไม่ที่จะตกแต่ง / ขยายระบบการบันทึกมาตรฐาน python ดังนั้นเมื่อมีการเรียกใช้วิธีการบันทึกระบบจะบันทึกไฟล์และหมายเลขบรรทัดที่เรียกใช้หรืออาจเป็นวิธีการที่เรียกใช้

คำตอบ:


228

ได้เลยตรวจสอบรูปแบบในการบันทึกเอกสาร โดยเฉพาะตัวแปรลินินและชื่อพา ธ

% (ชื่อพา ธ ) s ชื่อพา ธ แบบเต็มของไฟล์ต้นทางที่เรียกใช้การบันทึก (ถ้ามี)

% (filename) s ส่วนชื่อไฟล์ของชื่อพา ธ

% (โมดูล) s โมดูล (ส่วนชื่อของชื่อไฟล์)

% (funcName) s ชื่อของฟังก์ชันที่มีการเรียกบันทึก

% (ผ้าลินิน) d หมายเลขบรรทัดต้นทางที่ออกการโทรบันทึก (ถ้ามี)

มีลักษณะดังนี้:

formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')

1
และใช่ความยุ่งเหยิงของตัวพิมพ์ใหญ่ / เล็กในตัวแปรจะต้องได้รับการพิจารณา
ทอมโพห์ล

1
หรือเรียกอีกอย่างว่า "กรณีอูฐใช้งานได้ไม่ดี"
จอนสเปนเซอร์

81

นอกเหนือจากคำตอบที่มีประโยชน์มากของ Sebนี่คือข้อมูลโค้ดที่มีประโยชน์ซึ่งแสดงให้เห็นถึงการใช้งานคนตัดไม้ด้วยรูปแบบที่เหมาะสม:

#!/usr/bin/env python
import logging

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG)

logger = logging.getLogger(__name__)
logger.debug("This is a debug log")
logger.info("This is an info log")
logger.critical("This is critical")
logger.error("An error occurred")

สร้างผลลัพธ์นี้:

2017-06-06:17:07:02,158 DEBUG    [log.py:11] This is a debug log
2017-06-06:17:07:02,158 INFO     [log.py:12] This is an info log
2017-06-06:17:07:02,158 CRITICAL [log.py:13] This is critical
2017-06-06:17:07:02,158 ERROR    [log.py:14] An error occurred

5
ใช้สิ่งนี้เพื่อดูรายละเอียดเพิ่มเติม: formatter = logging.Formatter ('% (asctime) s,% (levelname) -8s [% (filename) s:% (module) s:% (funcName) s:% (lineno) d] % (message) s ')
Girish Gupta

มีวิธีการเปลี่ยนแปลงในที่เดียวที่ด้านบนของรหัสหรือไม่ว่าข้อความบันทึกถูกพิมพ์ออกมาหรือไม่? ฉันต้องการสองโหมดหนึ่งที่มีการพิมพ์จำนวนมากเพื่อดูว่าโปรแกรมทำงานอย่างไร และอีกอย่างหนึ่งเมื่อมันเสถียรเพียงพอโดยที่ไม่มีการแสดงเอาต์พุต
มารี พ.

3
@ Marie.P อย่าถามคำถามที่แตกต่างในความคิดเห็น คำตอบคือการบันทึกระดับแม้ว่า
bugmenot123

4

ในการสร้างสิ่งที่กล่าวมาข้างต้นในลักษณะที่ส่งการบันทึกการแก้ไขข้อบกพร่องไปยัง standard out:

import logging
import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
formatter = logging.Formatter(FORMAT)
ch.setFormatter(formatter)
root.addHandler(ch)

logging.debug("I am sent to standard out.")

การใส่ข้อมูลข้างต้นลงในไฟล์ที่เรียกว่าdebug_logging_example.pyสร้างผลลัพธ์:

[debug_logging_example.py:14 -             <module>() ] I am sent to standard out.

root.setLevel(logging.DEBUG)แล้วถ้าคุณต้องการที่จะปิดการเข้าสู่ระบบการแสดงความคิดเห็นออกมา

สำหรับไฟล์เดี่ยว (เช่นการกำหนดคลาส) ฉันพบว่านี่เป็นวิธีที่ดีกว่ามากในการทำสิ่งนี้เมื่อเทียบกับการใช้print()คำสั่ง ที่ช่วยให้คุณสามารถปิดเอาต์พุตการดีบักได้ในที่เดียวก่อนที่จะส่ง


1

สำหรับ devs ที่ใช้ PyCharm หรือ Eclipse pydev สิ่งต่อไปนี้จะสร้างลิงก์ไปยังแหล่งที่มาของคำสั่งบันทึกในเอาต์พุตล็อกของคอนโซล:

import logging, sys, os
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format='%(message)s | \'%(name)s:%(lineno)s\'')
log = logging.getLogger(os.path.basename(__file__))


log.debug("hello logging linked to source")

ดูไฮเปอร์ลิงก์ไฟล์ซอร์ส Pydev ในคอนโซล Eclipseสำหรับการสนทนาและประวัติที่ยาวนานขึ้น


0
# your imports above ...


logging.basicConfig(
    format='%(asctime)s,%(msecs)d %(levelname)-8s [%(pathname)s:%(lineno)d in 
    function %(funcName)s] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG
)

logger = logging.getLogger(__name__)

# your classes and methods below ...
# An naive Sample of usage:
try:
    logger.info('Sample of info log')
    # your code here
except Exception as e:
    logger.error(e)

คำตอบอื่น ๆ ที่แตกต่างกันซึ่งจะบันทึกเส้นทางแบบเต็มของไฟล์และชื่อฟังก์ชันที่อาจเกิดข้อผิดพลาด สิ่งนี้มีประโยชน์หากคุณมีโปรเจ็กต์ที่มีโมดูลมากกว่าหนึ่งโมดูลและหลายไฟล์ที่มีชื่อเดียวกันซึ่งแจกจ่ายในโมดูลเหล่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.