Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FEAT(client): Introduce new logging system based on spdlog #6707

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

davidebeatrici
Copy link
Member

@davidebeatrici davidebeatrici commented Jan 16, 2025

Sinks:

  • OutputDebugString() (for debugger on Windows)
  • Standard output stream (stdout)
  • File
  • Developer console (Qt widget)

Improvements compared to our old logging system based on Qt:

  • Duplicate messages are skipped if less than 5 seconds have passed. When that happens, an informative message is printed.
  • The previous format/pattern is retained, but the log level (e.g. <W>) is colored based on the severity:
  • The log is now written to a file on all platforms, not only Windows and macOS.
  • When the log file's size reaches 5 MiB, the sink renames it and creates a new one. Up to 4 files are kept:
    Console.txt   -> Console.1.txt
    Console.1.txt -> Console.2.txt
    Console.2.txt -> Console.3.txt
    Console.3.txt -> <delete>
    
  • We can eventually create multiple loggers, ideally one for each facility (Audio, ServerHandler, etc.).
    That would allow us to quickly filter log messages and know right away which subsystem is responsible for them.
  • Modern C++ string formatting. This of course only applies to the new functions such as log::debug(), not qDebug().

Only one "feature" is not reimplemented: showing a dialog in case of a fatal error, right before exiting the program.
However, that only worked on Windows and macOS using their native API, to avoid depending on a Qt event loop:

if (type == QtFatalMsg) {
::MessageBoxA(nullptr, qPrintable(msg), "Mumble", MB_OK | MB_ICONERROR);
exit(0);
}

if (type == QtFatalMsg) {
CFStringRef csMsg = CFStringCreateWithFormat(kCFAllocatorDefault, nullptr, CFSTR("%s\n\nThe error has been logged. Please submit your log file to the Mumble project if the problem persists."), qPrintable(msg));
CFUserNotificationDisplayAlert(0, 0, nullptr, nullptr, nullptr, CFSTR("Mumble has encountered a fatal error"), csMsg, CFSTR("OK"), nullptr, nullptr, nullptr);
CFRelease(csMsg);
exit(0);
}

@davidebeatrici
Copy link
Member Author

For reference, the Windows build failed just for this:

D:/a/1/s/src/mumble/Logger.cpp(55): error C2220: the following warning is treated as an error
D:/a/1/s/src/mumble/Logger.cpp(55): warning C4459: declaration of 'masterSink' hides global declaration
D:/a/1/s/src/mumble/Logger.cpp(30): note: see declaration of 'masterSink'

Sinks:

- OutputDebugString() (for debugger on Windows)
- Standard output stream (stdout)
- File
- Developer console (Qt widget)

Improvements compared to our old logging system based on Qt:

- Duplicate messages are skipped if less than 5 seconds have passed. When that happens, an informative message is printed.
- The previous format/pattern is retained, but the log level (e.g. "<W>") is colored based on the severity.
- The log is now written to a file on all platforms, not only Windows and macOS.
- When the log file's size reaches 5 MiB, the sink renames it and creates a new one. Up to 4 files are kept:
    Console.txt   -> Console.1.txt
    Console.1.txt -> Console.2.txt
    Console.2.txt -> Console.3.txt
    Console.3.txt -> <delete>
- We can eventually create multiple loggers, ideally one for each facility (Audio, ServerHandler, etc.).
  That would allow us to quickly filter log messages and know right away which subsystem is responsible for them.
- Modern C++ string formatting. This of course only applies to the new functions such as log::debug(), not qDebug().

Only one "feature" is not reimplemented: showing a dialog in case of a fatal error, right before exiting the program.
However, that only worked on Windows and macOS using their native API, to avoid depending on a Qt event loop.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant