dogmaLogging.py (5301B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dogma\dogmaLogging.py 2 import dogma.data as dogma_data 3 try: 4 from log import LogTraceback, LogException, LogInfo, LogNotice, LogWarn, LogError 5 except ImportError: 6 import logging 7 import traceback 8 9 def LogTraceback(msg, *args, **kwargs): 10 logging.error('Traceback inbound - %s' % (msg,)) 11 logging.error(''.join(traceback.format_stack())) 12 13 14 def LogException(msg, *args, **kwargs): 15 logging.exception('Exception - %s' % (msg,)) 16 17 18 def __Log(logFunc, *args, **kwargs): 19 logFunc(' '.join(('%s' % arg for arg in args)), **kwargs) 20 21 22 def GetLogFunc(logFunc): 23 return lambda *args, **kwargs: __Log(logFunc, *args, **kwargs) 24 25 26 LogInfo = GetLogFunc(logging.debug) 27 LogNotice = GetLogFunc(logging.info) 28 LogWarn = GetLogFunc(logging.warn) 29 LogError = GetLogFunc(logging.error) 30 31 import evetypes 32 33 def GetCategoryNameFromID(categoryID): 34 string = evetypes.GetCategoryNameByCategory(categoryID, languageID='en') 35 return plainStr(string) 36 37 38 def GetGroupNameFromID(groupID): 39 string = evetypes.GetGroupNameByGroup(groupID, languageID='en') 40 return plainStr(string) 41 42 43 def GetTypeNameFromID(typeID): 44 string = evetypes.GetName(typeID, languageID='en') 45 return plainStr(string) 46 47 48 def plainStr(string): 49 if isinstance(string, unicode): 50 return string.encode('cp1252', errors='xmlcharrefreplace') 51 return string 52 53 54 def EvalArgs(context, *args): 55 return ';'.join([ '{} = {}'.format(i, eval(i, context)) for i in args ]) 56 57 58 def FormatDictMembers(myDict, members = None): 59 if members is None: 60 members = myDict 61 stringParts = [ '\n {} : {}'.format(m, repr(myDict[m])) for m in members ] 62 stringParts.append('\n') 63 return ''.join(stringParts) 64 65 66 def PrettifyString(s): 67 indent = 0 68 chars = [] 69 opener = '([{<' 70 closer = ')]}>' 71 72 def newline(chars, indent, INDENT_DEPTH = 2): 73 chars.append('\n') 74 for i in range(indent * INDENT_DEPTH): 75 chars.append(' ') 76 77 ignore_whitespace = True 78 whitespace = ' ' 79 flush_separators = False 80 separators = ',' 81 for c in s: 82 if flush_separators: 83 if c in separators: 84 chars.append(c) 85 continue 86 else: 87 flush_separators = False 88 newline(chars, indent) 89 ignore_whitespace = True 90 if ignore_whitespace and c in whitespace: 91 continue 92 ignore_whitespace = False 93 if c in opener: 94 chars.append(c) 95 indent += 1 96 newline(chars, indent) 97 ignore_whitespace = True 98 elif c in closer: 99 indent -= 1 100 newline(chars, indent) 101 chars.append(c) 102 flush_separators = True 103 else: 104 chars.append(c) 105 106 return ''.join(chars) 107 108 109 def DecodeID(someID): 110 getInvItemRowFromDB = sm.GetService('i2').GetItemMx 111 try: 112 invItemRow = getInvItemRowFromDB(someID) 113 isInvItem = True 114 except: 115 isInvItem = False 116 117 if isInvItem: 118 categoryName = GetCategoryNameFromID(invItemRow.categoryID) 119 groupName = GetGroupNameFromID(invItemRow.groupID) 120 typeName = GetTypeNameFromID(invItemRow.typeID) 121 ownerID = invItemRow.ownerID 122 locationID = invItemRow.locationID 123 descr = 'invItem of type {}/{}/{}, ownerID {}, locationID {}'.format(categoryName, groupName, typeName, ownerID, locationID) 124 return descr 125 if dogma_data.is_attribute(someID): 126 descr = "dgmattrib '{}'".format(dogma_data.get_attribute_name(someID)) 127 return descr 128 descr = '<not an invItem or dgmattrib>' 129 return descr 130 131 132 def TraceReferrers(target, prefix = '', depth = 0, visited = None, breadthLimit = 5, depthLimit = 6): 133 if depth > depthLimit: 134 LogWarn(prefix, '-- bailing due to excess depth!') 135 return 136 if visited is None: 137 visited = set() 138 targetAddr = id(target) 139 visited.add(targetAddr) 140 import gc 141 import types 142 referrers = gc.get_referrers(target) 143 numChildrenProcessed = 0 144 for i in range(len(referrers)): 145 r = referrers[i] 146 if isinstance(r, types.FrameType): 147 continue 148 commonDescription = '{}{} : {} at {}'.format(prefix, str(i), type(r).__name__, id(r)) 149 if isinstance(r, dict): 150 keys = r.keys() 151 names = [ name for name, val in r.iteritems() if val == target ] 152 LogWarn(commonDescription, 'via', names, 'of', keys) 153 else: 154 LogWarn(commonDescription) 155 valString = str(r) 156 if len(valString) > 200: 157 LogWarn(' value (truncated):', valString[:200]) 158 else: 159 LogWarn(' value:', r) 160 if id(r) in visited: 161 LogWarn(' -- already visited') 162 continue 163 if numChildrenProcessed == breadthLimit: 164 LogWarn(' -- truncating due to breadthLimit of', breadthLimit) 165 break 166 referrers[i] = 'removed' 167 TraceReferrers(r, prefix=prefix + str(i) + '.', depth=depth + 1, visited=visited, depthLimit=depthLimit) 168 numChildrenProcessed += 1 169 170 171 def WrappedMethod(m): 172 return m 173 174 175 def WrappedClass(m): 176 return m