added logs truncate endpoint

This commit is contained in:
Gani Georgiev
2026-08-19 10:04:35 +03:00
parent 1a5f29818c
commit e71be7194a
15 changed files with 201 additions and 21 deletions
+1
View File
@@ -10,6 +10,7 @@
align-content: center;
overflow: hidden;
touch-action: none;
transform: translateZ(0); /* try to use the GPU */
transition:
opacity var(--animationSpeed),
max-height var(--slideAnimationSpeed),
+4 -1
View File
@@ -4,9 +4,12 @@ export function defaultLogLevels() {
t.span(null, "Default log levels:"),
() => {
const result = [];
for (const level in app.utils.logLevels) {
const sorted = Object.keys(app.utils.logLevels).sort();
for (const level of sorted) {
result.push(t.code(null, `${level}:${app.utils.logLevels[level].label}`));
}
return result;
},
);
+12 -4
View File
@@ -19,9 +19,12 @@ export function logsList(logsSettings) {
},
get paddedDefaultLogLevels() {
const result = [];
for (let level in app.utils.logLevels) {
const sorted = Object.keys(app.utils.logLevels).sort();
for (const level of sorted) {
result.push(("" + level).padStart(2, " ") + ": " + app.utils.logLevels[level].label);
}
return result;
},
});
@@ -133,11 +136,16 @@ export function logsList(logsSettings) {
if (log.data.referer && !log.data.referer.includes(window.location.host)) {
keys.push({ key: "referer" });
}
} else {
// extract the first 6 keys (excluding the error and details)
} else if (keys.length < 6) {
// extract the first 6 keys (excluding the error, details and system truncate keys)
const allKeys = Object.keys(log.data);
for (const key of allKeys) {
if (key != "error" && key != "details" && keys.length < 6) {
if (
keys.length < 6
&& key != "error"
&& key != "details"
&& key != "__pb_truncated__"
) {
keys.push({ key });
}
}
+89 -1
View File
@@ -9,6 +9,7 @@ window.app.modals.openLogsSettings = function(modalSettings = {
onbeforeclose: null,
onafterclose: null,
onsave: null,
ondelete: null,
}) {
const modal = logsSettingsModal(modalSettings);
if (!modal) {
@@ -26,6 +27,7 @@ function logsSettingsModal(modalSettings) {
const data = store({
isLoading: false,
isSaving: false,
isDeleting: false,
formSettings: {},
initFormSettingsHash: "",
get hasChanges() {
@@ -87,6 +89,39 @@ function logsSettingsModal(modalSettings) {
}
}
async function deleteLogs() {
data.isDeleting = true;
try {
// @todo replace with SDK method
await app.pb.send("/api/logs", { method: "DELETE" });
modalSettings.ondelete?.();
app.toasts.success("Successfully deleted all logs.");
data.isDeleting = false;
if (!data.hasChanges) {
app.modals.close(modal);
}
} catch (err) {
if (!err.isAbort) {
data.isDeleting = false;
app.checkApiError(err);
}
}
}
function confirmLogsDelete() {
app.modals.confirm(
"Do you really want to delete all logs?",
() => deleteLogs(),
null,
{ yesButton: "Yes, delete" },
);
}
modal = t.div(
{
pbEvent: "logsSettingsModal",
@@ -147,7 +182,7 @@ function logsSettingsModal(modalSettings) {
{ className: "field-help" },
"Set to ",
t.code(null, 0),
" to disable logs persistence.",
" to delete all logs and disable logs persistence.",
),
),
t.div(
@@ -172,6 +207,46 @@ function logsSettingsModal(modalSettings) {
defaultLogLevels(),
),
),
t.div(
{ className: "col-lg-12" },
t.field(
{ className: "field" },
t.label(
{ htmlFor: "logs.maxDataSize" },
t.span({ className: "txt" }, "Max data size"),
t.small(null, "(bytes)"),
t.i({
className: "ri-information-line link-hint",
ariaDescription: app.attrs.tooltip(
`The max size in bytes of the serialized log JSON data field (truncated on "best-effort" basis).`,
),
}),
),
t.input({
type: "number",
id: "logs.maxDataSize",
name: "logs.maxDataSize",
min: 0,
max: Number.MAX_SAFE_INTEGER,
placeholder: "Default to ~16KB",
value: () => data.formSettings.logs.maxDataSize || "",
oninput: (e) => {
if (e.target.value <= 0) {
data.formSettings.logs.maxDataSize = 0;
} else {
data.formSettings.logs.maxDataSize = Number(e.target.value);
}
},
onchange: () => {
// force placeholder rendering
if (!data.formSettings.logs.maxDataSize) {
data.formSettings.logs.maxDataSize = null;
data.formSettings.logs.maxDataSize = 0;
}
},
}),
),
),
t.div(
{ className: "col-lg-12" },
t.field(
@@ -215,6 +290,19 @@ function logsSettingsModal(modalSettings) {
},
t.span({ className: "txt" }, "Close"),
),
t.button(
{
type: "button",
ariaLabel: app.attrs.tooltip("Delete all logs", "left"),
className: () =>
`btn circle sm secondary transparent link-faded ${data.isDeleting ? "loading" : ""}`,
disabled: () => data.isDeleting || data.isSaving,
onclick: () => {
confirmLogsDelete();
},
},
t.i({ className: "ri-delete-bin-7-line", ariaHidden: true }),
),
t.button(
{
type: "submit",
+1
View File
@@ -113,6 +113,7 @@ export function pageLogs(route) {
onclick: () =>
app.modals.openLogsSettings({
onsave: () => refreshLogsList(),
ondelete: () => refreshLogsList(),
}),
},
t.i({ className: "ri-settings-3-line", ariaHidden: true }),