log.blade.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  6. <title>Laravel log viewer</title>
  7. <link rel="stylesheet"
  8. href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
  9. integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
  10. crossorigin="anonymous">
  11. <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.16/css/dataTables.bootstrap4.min.css">
  12. <style>
  13. body {
  14. padding: 25px;
  15. }
  16. h1 {
  17. font-size: 1.5em;
  18. margin-top: 0;
  19. }
  20. #table-log {
  21. font-size: 0.85rem;
  22. }
  23. .sidebar {
  24. font-size: 0.85rem;
  25. line-height: 1;
  26. }
  27. .btn {
  28. font-size: 0.7rem;
  29. }
  30. .stack {
  31. font-size: 0.85em;
  32. }
  33. .date {
  34. min-width: 75px;
  35. }
  36. .text {
  37. word-break: break-all;
  38. }
  39. a.llv-active {
  40. z-index: 2;
  41. background-color: #f5f5f5;
  42. border-color: #777;
  43. }
  44. .list-group-item {
  45. word-wrap: break-word;
  46. }
  47. .folder {
  48. padding-top: 15px;
  49. }
  50. .div-scroll {
  51. height: 80vh;
  52. overflow: hidden auto;
  53. }
  54. .nowrap {
  55. white-space: nowrap;
  56. }
  57. </style>
  58. </head>
  59. <body>
  60. <div class="container-fluid">
  61. <div class="row">
  62. <div class="col sidebar mb-3">
  63. <h1><i class="fa fa-calendar" aria-hidden="true"></i> 日志浏览器</h1>
  64. <div class="list-group div-scroll">
  65. @foreach($folders as $folder)
  66. <div class="list-group-item">
  67. <a href="{{ yzWebUrl('developer.log-viewer', array('f' => $folder)) }}">
  68. <span class="fa fa-folder"></span> {{$folder}}
  69. </a>
  70. @if ($current_folder == $folder)
  71. <div class="list-group folder">
  72. @foreach($folder_files as $file)
  73. <a href="{{ yzWebUrl('developer.log-viewer', array('l' => $file,'f'=>$folder)) }}"
  74. class="list-group-item @if ($current_file == $file) llv-active @endif">
  75. {{$file}}
  76. </a>
  77. @endforeach
  78. </div>
  79. @endif
  80. </div>
  81. @endforeach
  82. @foreach($files as $file)
  83. <a href="{{ yzWebUrl('developer.log-viewer', array('l' => $file)) }}"
  84. class="list-group-item @if ($current_file == $file) llv-active @endif">
  85. {{$file}}
  86. </a>
  87. @endforeach
  88. </div>
  89. </div>
  90. <div class="col-10 table-container">
  91. @if ($logs === null)
  92. <div>
  93. Log file >50M, please download it.
  94. </div>
  95. @else
  96. <table id="table-log" class="table table-striped" data-ordering-index="{{ $standardFormat ? 2 : 0 }}">
  97. <thead>
  98. <tr>
  99. @if ($standardFormat)
  100. <th>Level</th>
  101. <th>Context</th>
  102. <th>Date</th>
  103. @else
  104. <th>Line number</th>
  105. @endif
  106. <th>Content</th>
  107. </tr>
  108. </thead>
  109. <tbody>
  110. @foreach($logs as $key => $log)
  111. <tr data-display="stack{{{$key}}}">
  112. @if ($standardFormat)
  113. <td class="nowrap text-{{{$log['level_class']}}}">
  114. <span class="fa fa-{{{$log['level_img']}}}" aria-hidden="true"></span>&nbsp;&nbsp;{{$log['level']}}
  115. </td>
  116. <td class="text">{{$log['context']}}</td>
  117. @endif
  118. <td class="date">{{{$log['date']}}}</td>
  119. <td class="text">
  120. @if ($log['stack'])
  121. <button type="button"
  122. class="float-right expand btn btn-outline-dark btn-sm mb-2 ml-2"
  123. data-display="stack{{{$key}}}">
  124. <span class="fa fa-search"></span>
  125. </button>
  126. @endif
  127. {{{$log['text']}}}
  128. @if (isset($log['in_file']))
  129. <br/>{{{$log['in_file']}}}
  130. @endif
  131. @if ($log['stack'])
  132. <div class="stack" id="stack{{{$key}}}"
  133. style="display: none; white-space: pre-wrap;">{{{ trim($log['stack']) }}}
  134. </div>
  135. @endif
  136. </td>
  137. </tr>
  138. @endforeach
  139. </tbody>
  140. </table>
  141. @endif
  142. <div class="p-3">
  143. @if($current_file)
  144. <a href="{{ yzWebUrl('developer.log-viewer', array('dl' => $current_file.$current_folder,'f'=>$current_folder)) }}">
  145. <span class="fa fa-download"></span> Download file
  146. </a>
  147. -
  148. <a id="clean-log" href="{{ yzWebUrl('developer.log-viewer', array('clean' => $current_file.$current_folder,'f'=>$current_folder)) }}">
  149. <span class="fa fa-sync"></span> Clean file
  150. </a>
  151. -
  152. <a id="delete-log" href="{{ yzWebUrl('developer.log-viewer', array('del' => $current_file.$current_folder,'f'=>$current_folder)) }}">
  153. <span class="fa fa-trash"></span> Delete file
  154. </a>
  155. @if(count($files) > 1)
  156. -
  157. <a id="delete-all-log" href="{{ yzWebUrl('developer.log-viewer', array('delall' => 'true','f'=>$current_folder))}}">
  158. <span class="fa fa-trash-alt"></span> Delete all files
  159. </a>
  160. @endif
  161. @endif
  162. </div>
  163. </div>
  164. </div>
  165. </div>
  166. <!-- jQuery for Bootstrap -->
  167. <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
  168. integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
  169. crossorigin="anonymous"></script>
  170. <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
  171. integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
  172. crossorigin="anonymous"></script>
  173. <!-- FontAwesome -->
  174. <script defer src="https://use.fontawesome.com/releases/v5.0.6/js/all.js"></script>
  175. <!-- Datatables -->
  176. <script type="text/javascript" src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
  177. <script type="text/javascript" src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap4.min.js"></script>
  178. <script>
  179. $(document).ready(function () {
  180. $('#table-log').DataTable({
  181. "order": [$('#table-log').data('orderingIndex'), 'desc'],
  182. "stateSave": true,
  183. "stateSaveCallback": function (settings, data) {
  184. window.localStorage.setItem("datatable", JSON.stringify(data));
  185. },
  186. "stateLoadCallback": function (settings) {
  187. var data = JSON.parse(window.localStorage.getItem("datatable"));
  188. if (data) data.start = 0;
  189. return data;
  190. }
  191. });
  192. $('#delete-log, #clean-log, #delete-all-log').click(function () {
  193. return confirm('Are you sure?');
  194. });
  195. });
  196. </script>
  197. </body>
  198. </html>