Fix: Client log dialog stops updating past edit-control default limit

The Win32 EDIT control caps text at ~32K/64K chars by default, so the
client log dialog silently stopped accepting appends long before the
512KB truncation logic could run. Call SetLimitText(0) in both
CClientLog and CActivityDialog to lift the cap.

Also unify newline handling in Logger: each entry now ends with exactly
one '\n' at the source, so the in-memory ring-buffer dump (used by the
TCP log query) splits into lines correctly instead of relying on every
Mprintf caller ending its format with '\n'. writeToFile drops the extra
std::endl accordingly.

Additionally fix a CFont leak in CClientLog::OnInitDialog by moving the
font to a member.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
yuanyuanxiang
2026-08-20 17:54:33 +02:00
parent 0a1ecfc4ab
commit 11e8b122fe
4 changed files with 13 additions and 4 deletions

View File

@@ -152,6 +152,12 @@ public:
id + "[" + timestamp + "] [" + file + ":" + std::to_string(line) + "] " + message: id + "[" + timestamp + "] [" + file + ":" + std::to_string(line) + "] " + message:
id + "[" + timestamp + "] " + message; id + "[" + timestamp + "] " + message;
// 方案B在源头统一保证每条日志以单个 '\n' 结尾,文件与内存 ring buffer
// 共用同一份文本;写文件时不再额外追加换行,内存导出直接拼接即可正确分行。
while (!logEntry.empty() && (logEntry.back() == '\n' || logEntry.back() == '\r'))
logEntry.pop_back();
logEntry += '\n';
// Always record to in-memory ring buffer regardless of enable flag. // Always record to in-memory ring buffer regardless of enable flag.
{ {
std::lock_guard<std::mutex> lock(m_memMutex); std::lock_guard<std::mutex> lock(m_memMutex);
@@ -305,7 +311,7 @@ private:
std::lock_guard<std::mutex> lock(fileMutex); std::lock_guard<std::mutex> lock(fileMutex);
std::ofstream logFile(logFileName, std::ios::app); std::ofstream logFile(logFileName, std::ios::app);
if (logFile.is_open()) { if (logFile.is_open()) {
logFile << logEntry << std::endl; logFile << logEntry; // logEntry 已在 log() 中以单个 '\n' 结尾
} }
} }

View File

@@ -39,6 +39,8 @@ BOOL CActivityDialog::OnInitDialog()
m_editLog.SetFont(&m_font); m_editLog.SetFont(&m_font);
// 重建为 Unicode 编辑框:这是 ✻/✦ 能正确显示的关键。重建时已保留上面的字体。 // 重建为 Unicode 编辑框:这是 ✻/✦ 能正确显示的关键。重建时已保留上面的字体。
RebuildEdit(m_editLog); RebuildEdit(m_editLog);
// 解除 EDIT 控件默认约 64KB 长度上限,否则大快照经 SetWindowTextW 会被静默截断。
m_editLog.SetLimitText(0);
return TRUE; return TRUE;
} }

View File

@@ -37,9 +37,9 @@ BOOL CClientLog::OnInitDialog()
HICON hIcon = AfxGetApp()->LoadIcon(IDI_CLIENTLOG); HICON hIcon = AfxGetApp()->LoadIcon(IDI_CLIENTLOG);
SetIcon(hIcon, TRUE); SetIcon(hIcon, TRUE);
SetIcon(hIcon, FALSE); SetIcon(hIcon, FALSE);
CFont* pFont = new CFont(); m_font.CreatePointFont(85, _T("Consolas"));
pFont->CreatePointFont(85, _T("Consolas")); m_editLog.SetFont(&m_font);
m_editLog.SetFont(pFont); m_editLog.SetLimitText(0); // 解除 EDIT 控件默认长度上限,改由 AppendLog 的 512KB 逻辑管理
return TRUE; return TRUE;
} }

View File

@@ -24,6 +24,7 @@ protected:
private: private:
CEdit m_editLog; CEdit m_editLog;
CFont m_font;
#ifdef AFX_DESIGN_TIME #ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG_CLIENT_LOG }; enum { IDD = IDD_DIALOG_CLIENT_LOG };