/dozer/templates/logbar.mako

https://bitbucket.org/bbangert/dozer/ · Mako · 131 lines · 128 code · 3 blank · 0 comment · 5 complexity · d16fe74c801f095e152894d8ba6a294f MD5 · raw file

  1. <%!
  2. import time
  3. converter = time.localtime
  4. def format_time(record, start, prev_record=None):
  5. if prev_record:
  6. delta_from_prev = (record.created - prev_record.created) * 1000
  7. return '%+dms' % delta_from_prev
  8. else:
  9. time_from_start = (record.created - start) * 1000
  10. return '%+dms' % time_from_start
  11. def bg_color(event, log_colors):
  12. if event.name in log_colors:
  13. return log_colors[event.name]
  14. for key in log_colors:
  15. if event.name.startswith(key):
  16. return log_colors[key]
  17. return '#fff'
  18. def fg_color(frame, traceback_colors):
  19. for key in traceback_colors:
  20. if key in frame:
  21. return traceback_colors[key]
  22. return None
  23. %>
  24. <div style="width: 100%; position: absolute; top:0; left: 0; z-index: 200000; font-size:11px;">
  25. <div style="width: 100%; background-color: #fff; border: 1px solid #999; padding: 3px; cursor: pointer;" onclick="javascript:DLV.show_events('DLVlogevents');">\
  26. View log events for this request
  27. </div>
  28. <div id="DLVlogevents" style="display:none;">
  29. <table style="width: 100%; overflow: auto; background-color: #ddd;padding:2px;">
  30. <thead>
  31. <tr>
  32. <th>Time</th>
  33. <th>Level</th>
  34. <th>Module</th>
  35. <th>Message</th>
  36. </tr>
  37. </thead>
  38. <tbody>
  39. <% prev_event = None %>
  40. % for event in events:
  41. <% bgcolor = bg_color(event, logcolors) %>
  42. <tr style="text-align: left; vertical-align: top; border-bottom: 1px solid #333; background-color: ${bgcolor}; color: #222;">
  43. <td style="background-color: ${bgcolor}; text-align: right;">${format_time(event, start, prev_event)}</td>
  44. <td style="background-color: ${bgcolor};">${event.levelname}</td>
  45. <td style="background-color: ${bgcolor};">${event.name}</td>
  46. <td style="background-color: ${bgcolor};">\
  47. <%
  48. msg = event.getMessage()
  49. length_limit = 130
  50. keep_last = 70
  51. if len(msg) > length_limit:
  52. use_split = True
  53. first = msg[:length_limit - keep_last]
  54. middle = msg[length_limit - keep_last:-keep_last]
  55. last = msg[-keep_last:]
  56. else:
  57. use_split = False
  58. %>
  59. % if use_split:
  60. <span style="cursor: pointer; text-decoration: underline;" onclick="javascript:DLV.show_span(${id(event)})">${first}</span>\
  61. <span style="display:inline;" id="${id(event)}_extra"> ... </span><span id="${id(event)}" style="display:none">${middle}</span>${last}
  62. % else:
  63. ${msg | h}\
  64. % endif
  65. % if hasattr(event, 'traceback'):
  66. <span style="float: right; cursor: pointer; text-decoration: underline;" onclick="javascript:DLV.show_block('${'tb%s' % id(event)}')">TB</span>
  67. <pre id="${'tb%s' % id(event)}" style="display: none; padding-top: 1em">
  68. % for frame in event.traceback:
  69. <% fgcolor = fg_color(frame, traceback_colors) %>\
  70. % if fgcolor:
  71. <span style="color: ${fgcolor}">${frame}</span>\
  72. % else:
  73. ${frame}\
  74. % endif
  75. % endfor
  76. </pre>
  77. % endif
  78. </td>
  79. </tr>
  80. <% prev_event = event %>
  81. % endfor
  82. <tr style="text-align: left; vertical-align: top; border-bottom: 1px solid #333; background-color: #eee; color: #222;">
  83. <th colspan="2">Total Time:</th>
  84. <td colspan="4">${'%d' % (1000*tottime)}ms</td>
  85. </tr>
  86. </tbody>
  87. </table>
  88. </div>
  89. </div>
  90. <script>
  91. var DLV = {};
  92. DLV.getEBI = function(id, d) {
  93. return (d || document).getElementById(id);
  94. };
  95. DLV.show_events = function(name) {
  96. var elem = DLV.getEBI(name);
  97. if (elem.style.display == 'block') {
  98. elem.style.display = 'none';
  99. } else {
  100. elem.style.display = 'block';
  101. }
  102. return false;
  103. };
  104. DLV.show_span = function(name) {
  105. var elem = DLV.getEBI(name);
  106. if (elem.style.display == 'inline') {
  107. elem.style.display = 'none';
  108. } else {
  109. elem.style.display = 'inline';
  110. }
  111. elem = DLV.getEBI(name+'_extra');
  112. if (elem.style.display == 'inline') {
  113. elem.style.display = 'none';
  114. } else {
  115. elem.style.display = 'inline';
  116. }
  117. return false;
  118. };
  119. DLV.show_block = function(name) {
  120. var elem = DLV.getEBI(name);
  121. if (elem.style.display == 'block') {
  122. elem.style.display = 'none';
  123. } else {
  124. elem.style.display = 'block';
  125. }
  126. return false;
  127. };
  128. </script>