Changeset 18670
- Timestamp:
- Dec 24, 2024, 9:30:38 PM (3 months ago)
- Location:
- logviewerplugin/trunk/logviewer
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
logviewerplugin/trunk/logviewer/templates/logviewer.html
r17736 r18670 1 <!DOCTYPE html 2 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 4 <html xmlns="http://www.w3.org/1999/xhtml" 5 xmlns:py="http://genshi.edgewall.org/" 6 xmlns:i18n="http://genshi.edgewall.org/i18n" 7 xmlns:xi="http://www.w3.org/2001/XInclude"> 1 # extends 'admin.html' 2 # set levels = [ 3 (1, 'Critical'), 4 (2, 'Errors'), 5 (3, 'Warnings'), 6 (4, 'Info'), 7 (5, 'Debug'), 8 ] 8 9 9 <xi:include href="admin.html" /> 10 <head> 11 <title>Log Viewer</title> 12 </head> 10 # block admintitle 11 Log Viewer 12 # endblock admintitle 13 13 14 <body> 15 <h2>Log Viewer</h2> 16 <div class="us_message" id="us_message" py:if="len(us_message)>0"> 17 <div py:for="message in us_message">${message}</div> 14 # block adminpanel 15 <h2>Log Viewer</h2> 16 # if us_message: 17 <div class="us_message" id="us_message"> 18 # for message in us_message: 19 <div>${message}</div> 18 20 </div> 19 <div class="us_error" id="us_error" py:if="len(us_error)>0"> 20 <div py:for="message in us_error">${message}</div> 21 # endfor 22 # endif 23 # if us_error: 24 <div class="us_error" id="us_error"> 25 # for message in us_error: 26 <div>${message}</div> 27 # endfor 21 28 </div> 29 # endif 22 30 <div class="form" id="level_input"> 23 31 <form method="post" id="log_form" class="us_form"> 32 ${jmacros.form_token_input()} 24 33 <fieldset id="selection"> 25 <legend>Selection</legend><ul class="fieldset"> 26 <li id="li_levels"><fieldset id="fieldset_levels"> 34 <legend>Selection</legend> 35 <ul class="fieldset"> 36 <li id="li_levels"> 37 <fieldset id="fieldset_levels"> 27 38 <legend>Log Levels</legend> 28 <select name="level"> 29 <option value="1" py:attrs="{'selected': level==1 or None}">Critical</option> 30 <option value="2" py:attrs="{'selected': level==2 or None}">Errors</option> 31 <option value="3" py:attrs="{'selected': level==3 or None}">Warnings</option> 32 <option value="4" py:attrs="{'selected': level==4 or None}">Info</option> 33 <option value="5" py:attrs="{'selected': level==5 or None}">Debug</option> 34 </select> 35 <span title="include levels listed on top of the selected level"><input type="checkbox" name="up" value="1" py:attrs="{'checked': up==1 or None}"/> and higher</span> 36 </fieldset></li><li id="li_search"><fieldset id="fieldset_search"> 37 <legend>Search</legend> 38 <span title="show only lines (not) containing this search term">Lines (<input type="checkbox" name="invertsearch" value="1" py:attrs="{'checked': invert==1 or None}"/> not) including <input type="text" name="filter" value="${filter}"/></span> 39 <span title="search term is a regular expression"><input type="checkbox" name="regexp" value="1" py:attrs="{'checked': regexp==1 or None}"/> RegExp</span> 40 </fieldset></li><li id="li_tail"><fieldset id="fieldset_tail"> 41 <legend>Tail</legend> 42 <span title="Display only this many lines. Default: display all"><input type="text" name="tail" style="width:35px;" value="${tail}"/> lines</span> 43 </fieldset></li></ul> 39 <select name="level"> 40 # for level_id, label in levels: 41 <option value="${level_id}"${{'selected': level == level_id}|htmlattr}>${label}</option> 42 # endfor 43 </select> 44 <label title="include levels listed on top of the selected level"> 45 <input type="checkbox" name="up" value="1"${{'checked': up == 1}|htmlattr} /> 46 and higher 47 </label> 48 </fieldset> 49 </li> 50 <li id="li_search"> 51 <fieldset id="fieldset_search"> 52 <legend>Search</legend> 53 <span title="show only lines (not) containing this search term"> 54 Lines 55 (<label> 56 <input type="checkbox" name="invertsearch" value="1"${{'checked': invert == 1}|htmlattr} /> 57 not 58 </label>) 59 <label>including <input type="text" name="filter" value="${filter}" /></label> 60 </span> 61 <label title="search term is a regular expression"> 62 <input type="checkbox" name="regexp" value="1"${{'checked': regexp == 1}|htmlattr} /> 63 RegExp 64 </label> 65 </fieldset> 66 </li> 67 <li id="li_tail"> 68 <fieldset id="fieldset_tail"> 69 <legend>Tail</legend> 70 <label title="Display only this many lines. Default: display all"> 71 <input type="text" name="tail" style="width:35px;" value="${tail}"/> lines 72 </label> 73 </fieldset> 74 </li> 75 </ul> 44 76 </fieldset> 45 77 <div class="actions"> … … 49 81 </div> 50 82 51 <div class="us_log" id="us_log" py:if="len(us_log)>0"> 83 # if us_log: 84 <div class="us_log" id="us_log"> 52 85 <fieldset> 53 86 <legend>Log messages</legend> 54 <div py:for="logline in us_log" class="${logline['level']}">${logline['line']}</div> 87 # for logline in us_log: 88 <div class="${logline.level}">${logline.line}</div> 89 # endfor 55 90 </fieldset> 56 91 </div> 57 </body>58 </html> 92 # endif 93 # endblock adminpanel -
logviewerplugin/trunk/logviewer/web_ui.py
r17738 r18670 1 import io 1 2 import os 2 3 import re … … 117 118 add_stylesheet(req, 'logviewer/css/logviewer.css') 118 119 119 return 'logviewer.html', data , None120 return 'logviewer.html', data 120 121 121 122 # ITemplateProvider methods … … 158 159 classes = ['', 'log_crit', 'log_err', 159 160 'log_warn', 'log_info', 'log_debug'] 161 162 try: 163 with io.open(logname, 'r', encoding='utf-8', errors='replace') as f: 164 lines = f.readlines() 165 except IOError: 166 self.log.debug('Could not read from logfile!') 167 return [] 168 160 169 log = [] 161 170 logline = {} 162 try: 163 with open(logname, 'r') as f: 164 lines = f.readlines() 165 linecount = len(lines) 166 if tail and linecount - tail > 0: 167 start = linecount - tail 168 else: 169 start = 0 170 for i in range(start, linecount): 171 line = lines[i].decode('utf-8', 'replace') 172 if tfilter: 173 if regexp: 174 if not invert and not re.search(tfilter, line): 175 continue 176 if invert and re.search(tfilter, line): 177 continue 178 else: 179 if not invert and line.find(tfilter) == -1: 180 continue 181 if invert and not line.find(tfilter) == -1: 182 continue 183 logline = {} 184 if line.find(levels[level]) != -1: 185 logline['level'] = classes[level] 171 linecount = len(lines) 172 if tail and linecount - tail > 0: 173 start = linecount - tail 174 else: 175 start = 0 176 for i in range(start, linecount): 177 line = lines[i] 178 if tfilter: 179 if regexp: 180 if not invert and not re.search(tfilter, line): 181 continue 182 if invert and re.search(tfilter, line): 183 continue 184 else: 185 if not invert and line.find(tfilter) == -1: 186 continue 187 if invert and not line.find(tfilter) == -1: 188 continue 189 logline = {} 190 if line.find(levels[level]) != -1: 191 logline['level'] = classes[level] 192 logline['line'] = line 193 log.append(logline) 194 elif up: 195 i = level 196 found = False 197 while i > 0: 198 if line.find(levels[i]) != -1: 199 logline['level'] = classes[i] 200 logline['line'] = line 201 log.append(logline) 202 found = True 203 i -= 1 204 if not found and re.search('^[^0-9]+', line): 205 logline['level'] = 'log_other' 186 206 logline['line'] = line 187 207 log.append(logline) 188 elif up:189 i = level190 found = False191 while i > 0:192 if line.find(levels[i]) != -1:193 logline['level'] = classes[i]194 logline['line'] = line195 log.append(logline)196 found = True197 i -= 1198 if not found and re.search('^[^0-9]+', line):199 logline['level'] = 'log_other'200 logline['line'] = line201 log.append(logline)202 except IOError:203 self.log.debug('Could not read from logfile!')204 208 return log
Note: See TracChangeset
for help on using the changeset viewer.