એરર હેન્ડલિંગ માટે પાયથોન લોગીંગને ઓપ્ટિમાઇઝ કરી રહ્યું છે
પ્રોગ્રામના અમલ દરમિયાન ઇવેન્ટ્સને ટ્રેક કરવા અને સમસ્યાઓનું નિદાન કરવા માટે પાયથોનમાં લોગ ઇન કરવું આવશ્યક છે. જો કે, અમુક મોડ્યુલો વધુ પડતી ટ્રેસ માહિતી ઉત્પન્ન કરી શકે છે, જે લોગને ક્લટર કરી શકે છે. આવા કિસ્સાઓમાં, યોગ્ય લોગીંગ સ્તર સુયોજિત કરવું, જેમ કે ભૂલ, બિનજરૂરી વિગતોને ફિલ્ટર કરવામાં મદદ કરી શકે છે.
એવા સંજોગોમાં જ્યાં એક મોડ્યુલ વધુ પડતા લોગ જનરેટ કરે છે, પરંતુ તેને કૉલ કરતા બીજા મોડ્યુલમાં ભૂલો થાય છે, તાજેતરના લોગ સંદેશાઓને એક્સેસ કરવા તે નિર્ણાયક બની જાય છે. ભૂલના મૂળ કારણને ટ્રેસ કરતી વખતે આ ઘણીવાર થાય છે. અતિશય લોગને અવગણવા અને મહત્વપૂર્ણને પકડવા વચ્ચે સંતુલન જરૂરી છે.
પુસ્તકાલયો ગમે છે spdlog C++ માં રિંગ બફર દ્વારા બેકટ્રેકિંગ માટે બિલ્ટ-ઇન સપોર્ટ છે, જે વિકાસકર્તાઓને ભૂલ તરફ દોરી જતા તાજેતરના લોગની સમીક્ષા કરવાની મંજૂરી આપે છે. અજગર લોગીંગ લાઇબ્રેરી, તેમ છતાં, આ સુવિધાને બૉક્સની બહાર પ્રદાન કરતી નથી, જે સમાન પદ્ધતિને કેવી રીતે અમલમાં મૂકવી તે પ્રશ્ન ઉભો કરે છે.
આ લેખ અન્વેષણ કરે છે કે જ્યારે કોઈ ભૂલ થાય ત્યારે તાજેતરના લોગ સંદેશાઓ કેપ્ચર કરવા માટે તમે પાયથોનની લોગીંગ સિસ્ટમને કેવી રીતે અનુકૂલિત કરી શકો છો, તપાસનાર મૉડ્યૂલ ટ્રેસ ડેટા સાથેના લૉગને જબરજસ્ત કર્યા વિના નિદાન માટે ઉપલબ્ધ છે.
આદેશ | ઉપયોગનું ઉદાહરણ |
---|---|
deque(maxlen=capacity) | થી ડબલ-એન્ડેડ કતાર સંગ્રહો મોડ્યુલનો ઉપયોગ રિંગ બફર બનાવવા માટે થાય છે જે નિશ્ચિત સંખ્યામાં લોગ સંદેશાઓ ધરાવે છે, જ્યારે નવા સંદેશાઓ આવે ત્યારે સૌથી જૂનાને કાઢી નાખે છે. તાજેતરના સંદેશાઓના લોગને અસરકારક રીતે જાળવવા માટે આ એક નિર્ણાયક માળખું છે. |
emit(self, record) | દરેક લૉગ સંદેશ જેમ જેમ જનરેટ થાય છે તેની પ્રક્રિયા કરવા માટે કસ્ટમ લૉગિંગ હેન્ડલર્સમાં ઓવરરાઇડ કરેલી પદ્ધતિ. તે માં લોગ સંદેશ ઉમેરવા માટે જવાબદાર છે ડેક અમારા કસ્ટમ રીંગ બફર સોલ્યુશનમાં. |
logging.handlers.MemoryHandler | આ એક લોગીંગ હેન્ડલર છે જે લોગ સંદેશાઓને મેમરીમાં બફર કરે છે. જ્યારે ચોક્કસ લોગ લેવલ પહોંચી જાય ત્યારે તે તેમને ફ્લશ કરે છે (આ કિસ્સામાં, ભૂલ). જ્યાં સુધી વધુ ગંભીર ઘટના ન બને ત્યાં સુધી લોગ સંદેશાઓના આઉટપુટને સ્થગિત કરવા માટે તે ઉપયોગી છે. |
flushLevel=logging.ERROR | એક દલીલ પસાર થઈ મેમરી હેન્ડલર લૉગ લેવલનો ઉલ્લેખ કરવા માટે કે જે બફર કરેલા સંદેશાઓના ફ્લશિંગને અંતિમ ગંતવ્ય (જેમ કે કન્સોલ અથવા ફાઇલ) સુધી ટ્રિગર કરે છે. તે સુનિશ્ચિત કરે છે કે જો કોઈ ભૂલ થાય તો જ અમને ડિબગ લોગ જોવા મળે છે. |
setTarget(stream_handler) | માં મેમરી હેન્ડલર અભિગમ, આ પદ્ધતિ લક્ષ્ય હેન્ડલરને સુયોજિત કરે છે કે જેના પર બફર થયેલ લોગ ફ્લશ કરવામાં આવશે. આ કિસ્સામાં, લક્ષ્ય એ છે સ્ટ્રીમહેન્ડલર, જે કન્સોલ પર લોગ આઉટપુટ કરે છે. |
format(record) | લોગીંગ મોડ્યુલની ફોર્મેટિંગ સિસ્ટમનો ભાગ. કસ્ટમ હેન્ડલરમાં, આ પદ્ધતિ લોગ રેકોર્ડને રીંગ બફરમાં ઉમેરતા પહેલા તેને ફોર્મેટ કરે છે, જે સતત અને વાંચી શકાય તેવા આઉટપુટ માટે પરવાનગી આપે છે. |
logger.addHandler(buffer_handler) | કસ્ટમ અથવા મેમરી હેન્ડલરને લોગર સાથે જોડે છે જેથી તે હેન્ડલરના રૂપરેખાંકન (દા.ત., બફરિંગ, પરિપત્ર સ્ટોરેજ, વગેરે) મુજબ લોગ સંદેશાઓ પર પ્રક્રિયા કરે. આ આદેશ ખાતરી કરે છે કે અમારું બફર લોગીંગ માટે વપરાય છે. |
logger.setLevel(logging.DEBUG) | લૉગિંગ સંદેશાઓ માટે લઘુત્તમ ગંભીરતા સ્તર વ્યાખ્યાયિત કરે છે. ઉદાહરણોમાં, તે સેટ કરેલ છે ડીબગ, ખાતરી કરીને કે ઓછા ગંભીર સંદેશાઓ સહિત તમામ સંદેશાઓ કેપ્ચર કરવામાં આવે છે અને પછીના નિરીક્ષણ માટે બફર કરવામાં આવે છે. |
Python માં ભૂલ પર તાજેતરના લોગને અસરકારક રીતે કેપ્ચર કરી રહ્યું છે
પ્રસ્તુત પ્રથમ સ્ક્રિપ્ટ એ સાથે કસ્ટમ લોગીંગ હેન્ડલરનો ઉપયોગ કરે છે ડેક પાયથોનનું માળખું સંગ્રહો મોડ્યુલ આ ડેક રિંગ બફર તરીકે કામ કરે છે, જેમાં તાજેતરના લોગ સંદેશાઓની નિશ્ચિત સંખ્યા હોય છે. હેન્ડલર ઓવરરાઇડ કરે છે ઉત્સર્જિત પદ્ધતિ, જેને દર વખતે લોગ જનરેટ કરવામાં આવે ત્યારે કહેવામાં આવે છે. આ પદ્ધતિમાં, દરેક લોગ સંદેશને ફોર્મેટ કરવામાં આવે છે અને પછી ડેકમાં જોડવામાં આવે છે. કારણ કે ડેકની મહત્તમ લંબાઈ હોય છે, જ્યારે તે ક્ષમતા સુધી પહોંચે છે ત્યારે તે સૌથી જૂના સંદેશાઓને આપમેળે કાઢી નાખે છે. આ સોલ્યુશન સૌથી તાજેતરના લોગને અસરકારક રીતે ટ્રૅક કરે છે, તે સુનિશ્ચિત કરે છે કે ચેકર મોડ્યુલમાંથી અતિશય ડીબગ સંદેશાઓ લોગ આઉટપુટને ડૂબી જતા નથી પરંતુ જ્યારે રનર મોડ્યુલમાં કોઈ ભૂલ આવે ત્યારે પણ ઉપલબ્ધ હોય છે.
જ્યારે રનર મોડ્યુલમાં ભૂલ મળી આવે છે, ત્યારે સ્ક્રિપ્ટ કસ્ટમ પદ્ધતિને કૉલ કરે છે get_logs ડેકમાં સંગ્રહિત લોગ સંદેશાઓ પુનઃપ્રાપ્ત કરવા માટે. આ તમને પરીક્ષકના લોગ સંદેશાઓનું નિરીક્ષણ કરવાની મંજૂરી આપે છે જે તરત જ ભૂલની પહેલા છે. આ અભિગમ પાછળનો વિચાર એ છે કે લોગ વર્બોસિટી અને ઉપયોગિતા વચ્ચે સંતુલન જાળવીને લોગ સંદેશાઓ મુશ્કેલીનિવારણ માટે નિર્ણાયક સંદર્ભ પૂરો પાડે છે. પાયથોનમાં ગોળાકાર લોગ બફર બનાવવાની આ એક સરળ અને અસરકારક રીત છે બેકટ્રેસ C++ ની spdlog લાઇબ્રેરીમાં સુવિધા જોવા મળે છે.
બીજો સોલ્યુશન બિલ્ટ-ઇનનો ઉપયોગ કરે છે મેમરી હેન્ડલર પાયથોનના લોગીંગ મોડ્યુલમાંથી. MemoryHandler મેમરીમાં લોગ સંદેશાઓને બફર કરીને અને જ્યારે ચોક્કસ લોગ લેવલનો સામનો કરવામાં આવે ત્યારે જ તેને ફ્લશ કરીને કામ કરે છે, જેમ કે ભૂલ. આ કિસ્સામાં, હેન્ડલર 10 લોગ સંદેશાઓ સુધી બફર કરવા અને જ્યારે ભૂલ થાય ત્યારે તેને ફ્લશ કરવા માટે ગોઠવેલ છે. આ અભિગમ રિંગ બફર ટેકનિક જેવો જ છે પરંતુ પાયથોનના હાલના લોગીંગ ઈન્ફ્રાસ્ટ્રક્ચરનો ઉપયોગ કરે છે, જે અમલીકરણને સરળ બનાવે છે. MemoryHandler એ એવા સંજોગો માટે આદર્શ છે કે જ્યાં તમે લોગ સંદેશાઓનો સ્નેપશોટ કેપ્ચર કરવા માંગો છો જે સામાન્ય કામગીરી દરમિયાન લૉગને ક્લટર કર્યા વિના ભૂલ તરફ દોરી જાય છે.
બંને સોલ્યુશન્સ પ્રભાવ માટે ઑપ્ટિમાઇઝ કરવામાં આવ્યા છે અને મેમરી વપરાશને મર્યાદિત કરવા માટે ડિઝાઇન કરવામાં આવ્યા છે. મેમરીમાં સંગ્રહિત લૉગ્સની સંખ્યાને મર્યાદિત કરીને અને માત્ર મહત્વપૂર્ણ ઘટનાઓ દરમિયાન બફરને ફ્લશ કરીને, તેઓ સ્વચ્છ, વ્યવસ્થિત લૉગ્સ જાળવવામાં મદદ કરે છે. આ વિકાસકર્તાઓને બિનજરૂરી માહિતીની વિશાળ માત્રામાં તપાસ કરવાને બદલે વાસ્તવિક ભૂલને ડિબગ કરવા પર ધ્યાન કેન્દ્રિત કરવાની મંજૂરી આપે છે. પ્રશ્નમાં રહેલા લોગરમાં કસ્ટમ અથવા મેમરી હેન્ડલર્સ ઉમેરીને દરેક સ્ક્રિપ્ટને હાલના પાયથોન લોગીંગ રૂપરેખાંકનોમાં સરળતાથી સંકલિત કરી શકાય છે, અને બંને વિવિધ લોગ ફોર્મેટ અને સ્તરો સાથે સ્વીકારવા માટે પૂરતી લવચીક છે.
કસ્ટમ રીંગ બફર સાથે ભૂલ પર તાજેતરના પાયથોન લોગીંગ સંદેશાઓને કેપ્ચર કરી રહ્યા છીએ
પાયથોન લોગીંગ મોડ્યુલ - કસ્ટમ રીંગ બફર અમલીકરણ
# Approach 1: Using a custom handler with a deque (ring buffer) to store recent logs
import logging
from collections import deque
# Custom log handler to store recent log messages
class BufferingHandler(logging.Handler):
def __init__(self, capacity):
super().__init__()
self.log_buffer = deque(maxlen=capacity) # Circular buffer
def emit(self, record):
self.log_buffer.append(self.format(record)) # Store formatted log messages
def get_logs(self):
return list(self.log_buffer) # Retrieve recent log messages
# Configure logging with custom handler
logger = logging.getLogger('checker')
buffer_handler = BufferingHandler(capacity=10)
logger.addHandler(buffer_handler)
logger.setLevel(logging.DEBUG)
# Example log generation
for i in range(20):
logger.debug(f"Debug message {i}")
# Simulate an error in runner and print the last few log messages
try:
1 / 0 # Simulate error
except ZeroDivisionError:
print("Error occurred, recent log messages:")
for log in buffer_handler.get_logs():
print(log)
Python માં બફર લોગીંગ માટે MemoryHandler નો ઉપયોગ કરવો
પાયથોન લોગીંગ મોડ્યુલ - મેમરી હેન્ડલર અભિગમ
# Approach 2: Using MemoryHandler to buffer log messages
import logging
# MemoryHandler buffers log records in memory and flushes them when conditions are met
memory_handler = logging.handlers.MemoryHandler(capacity=10, flushLevel=logging.ERROR)
# Configuring logging with a stream handler for output
stream_handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
# Attach the memory handler and stream handler to logger
logger = logging.getLogger('checker')
logger.setLevel(logging.DEBUG)
memory_handler.setTarget(stream_handler)
logger.addHandler(memory_handler)
# Generating some debug messages
for i in range(15):
logger.debug(f"Debug message {i}")
# Simulate an error that will trigger the buffer to flush
logger.error("An error occurred in runner")
# The memory handler will now flush its buffer and show the last 10 messages
Python માં લોગ સંદેશાઓ કેપ્ચર કરવા માટે વૈકલ્પિક રીતોની શોધખોળ
પાયથોનમાં તાજેતરના લોગ સંદેશાઓ કેપ્ચર કરવા માટેનો બીજો અભિગમ તૃતીય-પક્ષ લાઇબ્રેરીનો ઉપયોગ કરે છે જેમ કે લોગુરુ. પાયથોનના બિલ્ટ-ઇન લોગીંગ મોડ્યુલથી વિપરીત, લોગુરુ વધુ લવચીક અને વપરાશકર્તા મૈત્રીપૂર્ણ ઈન્ટરફેસ આપે છે. તેમાં લૉગને ફેરવવા, લૉગ લેવલને ફિલ્ટર કરવા અને લૉગને વિવિધ ફોર્મેટમાં કૅપ્ચર કરવા માટે બિલ્ટ-ઇન સપોર્ટનો સમાવેશ થાય છે. અતિશય લોગ્સ જનરેટ કરતી એપ્લિકેશનો સાથે કામ કરતી વખતે આ લાઇબ્રેરી ખાસ કરીને ઉપયોગી થઈ શકે છે, કારણ કે તે લોગ મેનેજમેન્ટને સરળ બનાવે છે જ્યારે ભૂલ હેન્ડલિંગ દરમિયાન નિર્ણાયક સંદેશાઓ ચૂકી ન જાય તેની ખાતરી કરે છે.
લોગુરુ લોગ સિંક સેટ કરવા માટે પરવાનગી આપે છે, જેને મેમરી, ફાઇલો અથવા તો બાહ્ય સેવાઓમાં લોગ સ્ટોર કરવા માટે કસ્ટમાઇઝ કરી શકાય છે. તમે કસ્ટમ સિંકનો ઉપયોગ કરીને અસ્થાયી ઇન-મેમરી બફર બનાવી શકો છો, જે પછી ભૂલનો સામનો કરવા પર ફ્લશ કરી શકાય છે. આ લોગુરુને તે લોકો માટે એક શક્તિશાળી વિકલ્પ બનાવે છે જેઓ પ્રમાણભૂત લોગીંગ લાઇબ્રેરીની જેમ હેન્ડલર્સને મેન્યુઅલી રૂપરેખાંકિત કર્યા વિના તેમની લોગીંગ સિસ્ટમ પર વધુ નિયંત્રણ ઈચ્છે છે.
લોગુરુનો બીજો ફાયદો એ છે કે તે હાલની લોગીંગ સિસ્ટમો સાથે સરળ એકીકરણ માટે પરવાનગી આપે છે, એટલે કે તમે તમારા સમગ્ર લોગીંગ સેટઅપને ઓવરહોલ કર્યા વિના લોગુરુ પર સ્વિચ કરી શકો છો. જટિલ એપ્લિકેશનો સાથે કામ કરતી વખતે આ ખાસ કરીને મદદરૂપ થઈ શકે છે જ્યાં કામગીરી અને લોગ મેનેજમેન્ટ નિર્ણાયક છે. આખરે, જ્યારે પાયથોનનું લોગીંગ મોડ્યુલ મોટાભાગના ઉપયોગના કિસ્સાઓ માટે પૂરતું છે, ત્યારે લોગુરુ જેવી લાઈબ્રેરીઓનું અન્વેષણ કરવાથી લોગ સંદેશાઓને અસરકારક રીતે કેપ્ચર કરવા અને મેનેજ કરવા માટે વધારાની સુગમતા અને ઉપયોગમાં સરળતા મળે છે.
Python માં લોગ સંદેશાઓ કેપ્ચર કરવા વિશે સામાન્ય પ્રશ્નો
- હું લોગ મેસેજ વર્બોસિટી કેવી રીતે મર્યાદિત કરી શકું?
- ઉપયોગ કરો logger.setLevel(logging.ERROR) ડિબગ અને માહિતી જેવા નીચી ગંભીરતાના સંદેશાઓને દબાવવા માટે, માત્ર ભૂલો દર્શાવતા.
- તાજેતરના લોગને મેમરીમાં સંગ્રહિત કરવાની શ્રેષ્ઠ રીત કઈ છે?
- એ deque(maxlen=capacity) સૌથી જૂની એન્ટ્રીઓને આપમેળે કાઢી નાખવા સાથે, તાજેતરના લોગ સંદેશાઓને સંગ્રહિત કરવા માટે વાપરી શકાય છે.
- જ્યારે કોઈ ભૂલ થાય ત્યારે હું બફર કરેલા લોગને કેવી રીતે ફ્લશ કરી શકું?
- સાથે MemoryHandler, લોગ મેમરીમાં સંગ્રહિત થાય છે અને જ્યારે ચોક્કસ લોગ લેવલ ટ્રિગર થાય છે ત્યારે ફ્લશ થાય છે, જેમ કે flushLevel=logging.ERROR.
- પાયથોનના લોગીંગ પર લોગુરુનો ઉપયોગ કરવાનો શું ફાયદો છે?
- Loguru ઓછા બોઈલરપ્લેટ કોડ સાથે લોગ સેટઅપને સરળ બનાવે છે અને વધુ સરળ ફિલ્ટરિંગ અને લોગ રોટેટિંગ જેવી વધુ સાહજિક સુવિધાઓ પ્રદાન કરે છે.
- શું હું લોગુરુને હાલના લોગીંગ રૂપરેખાંકનો સાથે એકીકૃત કરી શકું?
- હા, લોગુરુ ડિફોલ્ટ લોગીંગ હેન્ડલરને બદલીને પાયથોનની બિલ્ટ-ઇન લોગીંગ સિસ્ટમ સાથે સરળતાથી એકીકૃત થઈ શકે છે.
લોગ કેપ્ચર તકનીકોનો સારાંશ
ભૂલ-સંભવિત પરિસ્થિતિઓમાં, પાયથોનના લોગીંગ મોડ્યુલનો ઉપયોગ અસરકારક રીતે આઉટપુટને અવ્યવસ્થિત કર્યા વિના તાજેતરના લોગ સંદેશાઓને કેપ્ચર કરવામાં મદદ કરે છે. કસ્ટમ હેન્ડલર્સ જેમ કે ડેક અને મેમરી હેન્ડલર જ્યારે કોઈ ભૂલ થાય ત્યારે નિર્ણાયક સંદેશાઓ સંગ્રહિત કરવાની બહુમુખી રીતો પ્રદાન કરે છે.
આ સોલ્યુશન્સ ઉચ્ચ વર્બોસિટીવાળા મોડ્યુલોમાં ભૂલોને ડિબગ કરવા માટે વ્યવહારુ છે, વિકાસકર્તાઓ પાસે જરૂરી લોગ ડેટા ઉપલબ્ધ છે તેની ખાતરી કરે છે. જેવા તૃતીય-પક્ષ સાધનોને એકીકૃત કરીને લોગુરુ, ન્યૂનતમ રૂપરેખાંકન સાથે અદ્યતન લોગ મેનેજમેન્ટ ઓફર કરતાં વધુ સુગમતા ઉપલબ્ધ છે.
પાયથોન લોગીંગ સોલ્યુશન્સ માટે સ્ત્રોતો અને સંદર્ભો
- પાયથોન્સની સમજૂતી ડેક અમલીકરણ અને લોગીંગમાં તેનો ઉપયોગ: પાયથોન દસ્તાવેજીકરણ - સંગ્રહો
- Python's પર વિગતો લોગીંગ પુસ્તકાલય અને મેમરી હેન્ડલર: પાયથોન દસ્તાવેજીકરણ - લોગીંગ
- ની ઝાંખી લોગુરુ અદ્યતન પાયથોન લોગીંગ વિકલ્પ તરીકે: લોગુરુ દસ્તાવેજીકરણ
- ની સરખામણી અને ઉપયોગ spdlog બેકટ્રેસ સપોર્ટ માટે C++ માં: spdlog GitHub રીપોઝીટરી