Files
2026-07-17 20:24:25 +00:00

158 lines
8.0 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>v0.2.16 | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="v0.2.16 | EchoHub Documentation ">
<link rel="icon" href="../images/hue_icon.svg">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/blob/master/docs/#L1">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="v0216">v0.2.16</h1>
<p>A logging and observability pass built on the new server-logs room. Busy servers stop drowning
in connect/disconnect noise, the events operators actually care about — uploads, moderation
actions — now get logged, and a new periodic report summarizes server activity as pretty-printed
JSON that streams into the logs room and is saved to the database for history.</p>
<h2 id="new-features">New Features</h2>
<ul>
<li><strong>Periodic server-stats report</strong> — every 6 hours (configurable), the server logs an aggregate
activity snapshot as pretty-printed JSON and saves it to the database. Each report covers the
window since the previous one: messages sent, files uploaded (and total bytes), new members,
active members (distinct senders), session connections/disconnections, kicks, bans, total
registered members, users online now, and peak concurrent online. Reports also stream into the
live server-logs room, and old ones are pruned past a configurable retention. New <code>Stats</code> config
section (<code>Stats:Enabled</code>, <code>Stats:IntervalHours</code> = 6, <code>Stats:RetentionDays</code> = 90).</li>
<li><strong>Upload logging</strong> — every file, image, and audio upload is now logged with its resource URL
(<code>/api/files/{id}</code>), kind, size, uploader, and channel. In end-to-end encrypted rooms the
filename is client-side ciphertext, so it's logged as <code>[encrypted]</code> — the server still never
sees room content.</li>
<li><strong>Moderation &amp; user-action logging</strong> — role changes, kicks, bans, unbans, mutes, unmutes,
moderator message removals, and channel nukes are now logged with the actor, target, and reason.
Bans and channel nukes log at Warning level so they stand out.</li>
</ul>
<h2 id="improvements">Improvements</h2>
<ul>
<li><strong>Quieter connection logs</strong> — user connect, disconnect, join-channel, and leave-channel events
(over both SignalR and IRC) dropped from Information to Debug. On a busy server these fired
constantly and buried everything else; the aggregate counts now live in the periodic stats
report instead. They still show in Development, where the default level is Debug.</li>
<li><strong>Config examples stay in sync</strong><code>.env.example</code> gained the <code>ServerLogs</code> and <code>Stats</code> sections
(the former had been missing), alongside <code>appsettings.json</code> / <code>appsettings.example.json</code>.</li>
</ul>
<h2 id="notes-for-server-operators">Notes for server operators</h2>
<ul>
<li>New config section: <code>Stats</code><code>Enabled</code> (default true), <code>IntervalHours</code> (default 6),
<code>RetentionDays</code> (default 90, <code>0</code> keeps reports forever). See <code>appsettings.example.json</code> and
<code>.env.example</code>. A non-positive interval falls back to 6h; positive values are honored down to a
1-second floor.</li>
<li>One new database migration (<code>AddServerStatsReports</code>) applies automatically on startup.</li>
<li>Connect/disconnect/join/leave now log at Debug — if you relied on those Information lines, lower
<code>Serilog:MinimumLevel:Default</code> (or <code>ServerLogs:MinLevel</code> for the room) to <code>Debug</code>, or read the
periodic stats report for aggregates.</li>
</ul>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/docs/#L1" class="edit-link">Edit this page</a>
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a></div></div>
</div>
</div>
</footer>
</body>
</html>