Parcourir la source

Add exportLogs() function to download logs as CSV

- Added exportLogs() function in functions.js that fetches logs from API endpoint /api/v2/log/0
- Function exports all logs (filter=NONE, pageSize=1000, offset=0) as CSV with columns: Date, Severity, Function, Message, IP Address, User
- CSV is automatically downloaded as 'organizr_logs.csv' file
- Added export button to logs page UI with download icon and tooltip
- Function positioned before existing logContext function for logical organization
mgomon il y a 11 mois
Parent
commit
d2974a5d4e
2 fichiers modifiés avec 27 ajouts et 1 suppressions
  1. 2 1
      api/pages/settings-settings-logs.php
  2. 25 0
      js/functions.js

+ 2 - 1
api/pages/settings-settings-logs.php

@@ -16,7 +16,8 @@ function get_page_settings_settings_logs($Organizr)
 	return '
 	return '
 	<div class="btn-group m-b-20 pull-left">' . $logsDropdown . '</div>
 	<div class="btn-group m-b-20 pull-left">' . $logsDropdown . '</div>
 	<button class="btn btn-danger waves-effect waves-light pull-right purgeLog" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Purge Log"><i class="fa fa-trash"></i></span></button>
 	<button class="btn btn-danger waves-effect waves-light pull-right purgeLog" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Purge Log"><i class="fa fa-trash"></i></span></button>
-	<button onclick="shortcut(\'log-settings\')" class="btn btn-inverse waves-effect waves-light pull-right m-r-5" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Log Settings"><i class="fa fa-cog"></i></span></button>
+	<button onclick="shortcut('log-settings')" class="btn btn-inverse waves-effect waves-light pull-right m-r-5" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Log Settings"><i class="fa fa-cog"></i></span></button>
+	<button onclick="exportLogs()" class="btn btn-success waves-effect waves-light pull-right m-r-5" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Export Logs"><i class="fa fa-download"></i></span></button>
 	<button onclick="organizrLogTable.clear().draw().ajax.reload(null, false)" class="btn btn-info waves-effect waves-light pull-right reloadLog m-r-5" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Reload Log"><i class="fa fa-refresh"></i></span></button>
 	<button onclick="organizrLogTable.clear().draw().ajax.reload(null, false)" class="btn btn-info waves-effect waves-light pull-right reloadLog m-r-5" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Reload Log"><i class="fa fa-refresh"></i></span></button>
 	<button onclick="toggleKillOrganizrLiveUpdate(' . $Organizr->config['logLiveUpdateRefresh'] . ');" class="btn btn-primary waves-effect waves-light pull-right organizr-log-live-update m-r-5" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Live Update"><i class="fa fa-clock-o"></i></span></button>
 	<button onclick="toggleKillOrganizrLiveUpdate(' . $Organizr->config['logLiveUpdateRefresh'] . ');" class="btn btn-primary waves-effect waves-light pull-right organizr-log-live-update m-r-5" type="button" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Live Update"><i class="fa fa-clock-o"></i></span></button>
 	' . $filterDropdown . '
 	' . $filterDropdown . '

+ 25 - 0
js/functions.js

@@ -12026,6 +12026,31 @@ function jsFriendlyJSONStringify (s) {
 	replace(/\u2028/g, '\\u2028').
 	replace(/\u2028/g, '\\u2028').
 	replace(/\u2029/g, '\\u2029');
 	replace(/\u2029/g, '\\u2029');
 }
 }
+function exportLogs() {
+    const query = "api/v2/log/0?filter=NONEpageSize=1000offset=0";
+    $.get(query, function (data) {
+        const logs = data.response.data.results;
+        let csvContent = "data:text/csv;charset=utf-8,Date,Severity,Function,Message,IP Address,User\n";
+        logs.forEach(function (log) {
+            const row = [
+                log.datetime,
+                log.log_level,
+                log.channel,
+                log.message,
+                log.remote_ip_address,
+                log.username
+            ].join(",");
+            csvContent += row + "\n";
+        });
+        const encodedUri = encodeURI(csvContent);
+        const link = document.createElement("a");
+        link.setAttribute("href", encodedUri);
+        link.setAttribute("download", "organizr_logs.csv");
+        document.body.appendChild(link); 
+        link.click();
+        document.body.removeChild(link);
+    });
+}
 function logContext(row){
 function logContext(row){
 	let buttons = '';
 	let buttons = '';
 	buttons += (Object.keys(row).length > 0) ? '<button data-toggle="tooltip" title="" data-original-title="View Details" class="btn btn-xs btn-primary waves-effect waves-light log-details m-r-5" data-trace="'+row.trace_id+'"><i class="mdi mdi-file-find"></i></button>' : '';
 	buttons += (Object.keys(row).length > 0) ? '<button data-toggle="tooltip" title="" data-original-title="View Details" class="btn btn-xs btn-primary waves-effect waves-light log-details m-r-5" data-trace="'+row.trace_id+'"><i class="mdi mdi-file-find"></i></button>' : '';