logview.html 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <!DOCTYPE html>
  2. <html ng-app="App">
  3. <head>
  4. <title>System Logs</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
  7. <link rel="stylesheet" href="../script/semantic/semantic.min.css">
  8. <script type="text/javascript" src="../script/jquery-3.6.0.min.js"></script>
  9. <script type="text/javascript" src="../script/semantic/semantic.min.js"></script>
  10. <style>
  11. .clickable{
  12. cursor: pointer;
  13. }
  14. .clickable:hover{
  15. opacity: 0.7;
  16. }
  17. .logfile{
  18. padding-left: 1em !important;
  19. position: relative;
  20. padding-right: 1em !important;
  21. }
  22. .loglist{
  23. background-color: rgb(250, 250, 250);
  24. }
  25. .logfile .showing{
  26. position: absolute;
  27. top: 0.18em;
  28. right: 0em;
  29. margin-right: -0.4em;
  30. opacity: 0;
  31. }
  32. .logfile.active .showing{
  33. opacity: 1;
  34. }
  35. #logrender{
  36. width: 100% !important;
  37. height: calc(100% - 1.2em);
  38. min-height: calc(90vh - 1.2em) !important;
  39. border: 0px solid transparent !important;
  40. background-color: #252630;
  41. color: white;
  42. font-family: monospace;
  43. overflow-x: scroll !important;
  44. white-space: pre;
  45. resize: none;
  46. scrollbar-width: thin;
  47. font-size: 1.2em;
  48. }
  49. #logrender::selection{
  50. background:#3643bb;
  51. color:white;
  52. }
  53. </style>
  54. </head>
  55. <body>
  56. <br>
  57. <div class="ui container">
  58. <div class="ui stackable grid">
  59. <div class="four wide column loglist">
  60. <h3 class="ui header" style="padding-top: 1em;">
  61. <div class="content">
  62. Log View
  63. <div class="sub header">Check System Log in Real Time</div>
  64. </div>
  65. </h3>
  66. <div class="ui divider"></div>
  67. <div id="logList" class="ui accordion">
  68. </div>
  69. <div class="ui divider"></div>
  70. <small>Notes: Some log files might be huge. Make sure you have checked the log file size before opening</small>
  71. </div>
  72. <div class="twelve wide column">
  73. <textarea id="logrender" spellcheck="false" readonly="true">
  74. ← Pick a log file from the left menu to start debugging
  75. </textarea>
  76. <a href="#" onclick="openLogInNewTab();">Open In New Tab</a>
  77. <br><br>
  78. </div>
  79. </div>
  80. </div>
  81. <br>
  82. </body>
  83. <script>
  84. var currentOpenedLogURL = "";
  85. function openLogInNewTab(){
  86. if (currentOpenedLogURL != ""){
  87. window.open(currentOpenedLogURL);
  88. }
  89. }
  90. function openLog(object, catergory, filename){
  91. $(".logfile.active").removeClass('active');
  92. $(object).addClass("active");
  93. currentOpenedLogURL = "/api/log/read?file=" + filename;
  94. $.get(currentOpenedLogURL, function(data){
  95. if (data.error !== undefined){
  96. alert(data.error);
  97. return;
  98. }
  99. $("#logrender").val(data);
  100. });
  101. }
  102. function initLogList(){
  103. $("#logList").html("");
  104. $.get("/api/log/list", function(data){
  105. //console.log(data);
  106. for (let [key, value] of Object.entries(data)) {
  107. console.log(key, value);
  108. value.reverse(); //Default value was from oldest to newest
  109. var fileItemList = "";
  110. value.forEach(file => {
  111. fileItemList += `<div class="item clickable logfile" onclick="openLog(this, '${key}','${file.Filename}');">
  112. <i class="file outline icon"></i>
  113. <div class="content">
  114. ${file.Title} (${formatBytes(file.Filesize)})
  115. <div class="showing"><i class="green chevron right icon"></i></div>
  116. </div>
  117. </div>`;
  118. })
  119. $("#logList").append(`<div class="title">
  120. <i class="dropdown icon"></i>
  121. ${key}
  122. </div>
  123. <div class="content">
  124. <div class="ui list">
  125. ${fileItemList}
  126. </div>
  127. </div>`);
  128. }
  129. $(".ui.accordion").accordion();
  130. });
  131. }
  132. initLogList();
  133. function formatBytes(x){
  134. var units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
  135. let l = 0, n = parseInt(x, 10) || 0;
  136. while(n >= 1024 && ++l){
  137. n = n/1024;
  138. }
  139. return(n.toFixed(n < 10 && l > 0 ? 1 : 0) + ' ' + units[l]);
  140. }
  141. </script>
  142. </html>