Skip to content

Commit

Permalink
modularize logging code and redo runtime logging method switching
Browse files Browse the repository at this point in the history
  • Loading branch information
shenlebantongying committed Feb 3, 2025
1 parent 284a559 commit 755c041
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 92 deletions.
2 changes: 0 additions & 2 deletions src/common/logfileptr.cc

This file was deleted.

3 changes: 0 additions & 3 deletions src/common/logfileptr.hh

This file was deleted.

75 changes: 75 additions & 0 deletions src/logging.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include "config.hh"
#include "logging.hh"
#include <QGlobalStatic>
#include <QMutexLocker>
#include <QDateTime>

Q_GLOBAL_STATIC(Logger, gd_logger)

QMutex logMutex;

void logToFileMessageHander( QtMsgType type, const QMessageLogContext & context, const QString & mess )
{
QString strTime = QDateTime::currentDateTime().toString( "MM-dd hh:mm:ss" );
QString message = QString( "%1 %2\r\n" ).arg( strTime, mess );

if ( gd_logger -> logFile.isOpen() ) {
//without the lock ,on multithread,there would be assert error.
QMutexLocker _( &logMutex );
switch ( type ) {
case QtDebugMsg:
message.prepend( "Debug: " );
break;
case QtWarningMsg:
message.prepend("Warning: " );
break;
case QtCriticalMsg:
message.prepend( "Critical: " );
break;
case QtFatalMsg:
message.prepend( "Fatal: " );
gd_logger -> logFile.write( message.toUtf8() );
gd_logger -> logFile.flush();
abort();
case QtInfoMsg:
message.insert( 0, "Info: " );
break;
}

gd_logger -> logFile.write( message.toUtf8() );
gd_logger -> logFile.flush();

return;
} else {
throw std::runtime_error( "logToFileMessageHandler fatal error!" );
}
}

void Logger::retainDefaultMessageHandler(QtMessageHandler handler){
gd_logger->defaultMessageHandler=handler;
}

void Logger::switchLoggingMethod(bool logToFile){
if(logToFile){
if(!gd_logger -> logFile.isOpen()){
gd_logger -> logFile.setFileName( Config::getConfigDir() + "gd_log.txt" );
if(!gd_logger -> logFile.open( QFile::WriteOnly )){
qDebug()<<"Failed to open log file!";
return;
};
}
qInstallMessageHandler(logToFileMessageHander);
} else {
if(gd_logger -> logFile.isOpen()){
gd_logger -> logFile.flush();
}
qInstallMessageHandler(gd_logger->defaultMessageHandler);
}
}

void Logger::closeLogFile(){
if(gd_logger -> logFile.isOpen()){
gd_logger -> logFile.flush();
gd_logger -> logFile.close();
}
}
12 changes: 12 additions & 0 deletions src/logging.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once
#include <QFile>
#include <QMutex>

/// Manage Logging, mainly for switching to log-to-file because of Windows
struct Logging {
static void retainDefaultMessageHandler(QtMessageHandler);
static void switchLoggingMethod( bool logToFile );
static void closeLogFile();
QFile logFile;
QtMessageHandler defaultMessageHandler;
};
85 changes: 4 additions & 81 deletions src/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */

#include "config.hh"
#include "logfileptr.hh"
#include "logging.hh"
#include "mainwindow.hh"
#include "termination.hh"
#include "version.hh"
Expand All @@ -14,11 +14,9 @@
#include <QMutex>
#include <QSessionManager>
#include <QString>
#include <QStringBuilder>
#include <QtWebEngineCore/QWebEngineUrlScheme>
#include <stdio.h>
#include <QStyleFactory>

#if defined( Q_OS_UNIX )
#include <clocale>
#include "unix/ksignalhandler.hh"
Expand Down Expand Up @@ -82,66 +80,6 @@ bool callback( const char * dump_dir, const char * minidump_id, void * context,
#endif
#endif

QMutex logMutex;

void gdMessageHandler( QtMsgType type, const QMessageLogContext & context, const QString & mess )
{
if ( GlobalBroadcaster::instance()->getPreference() == nullptr
|| !GlobalBroadcaster::instance()->getPreference()->enableApplicationLog ) {
return;
}
QString strTime = QDateTime::currentDateTime().toString( "MM-dd hh:mm:ss" );
QString message = QString( "%1 %2\r\n" ).arg( strTime, mess );

if ( ( logFilePtr != nullptr ) && logFilePtr->isOpen() ) {
//without the lock ,on multithread,there would be assert error.
QMutexLocker _( &logMutex );
switch ( type ) {
case QtDebugMsg:
message.insert( 0, "Debug: " );
break;
case QtWarningMsg:
message.insert( 0, "Warning: " );
break;
case QtCriticalMsg:
message.insert( 0, "Critical: " );
break;
case QtFatalMsg:
message.insert( 0, "Fatal: " );
logFilePtr->write( message.toUtf8() );
logFilePtr->flush();
abort();
case QtInfoMsg:
message.insert( 0, "Info: " );
break;
}

logFilePtr->write( message.toUtf8() );
logFilePtr->flush();

return;
}

//the following code lines actually will have no chance to run, schedule to remove in the future.
QByteArray msg = mess.toUtf8().constData();
switch ( type ) {
case QtDebugMsg:
fprintf( stderr, "Debug: %s\n", msg.constData() );
break;
case QtWarningMsg:
fprintf( stderr, "Warning: %s\n", msg.constData() );
break;
case QtCriticalMsg:
fprintf( stderr, "Critical: %s\n", msg.constData() );
break;
case QtFatalMsg:
fprintf( stderr, "Fatal: %s\n", msg.constData() );
abort();
case QtInfoMsg:
fprintf( stderr, "Info: %s\n", msg.constData() );
break;
}
}

struct GDOptions
{
Expand Down Expand Up @@ -426,15 +364,6 @@ int main( int argc, char ** argv )
QWebEngineUrlScheme::registerScheme( webUiScheme );
}

QFile file;
logFilePtr = &file;
auto guard = qScopeGuard( [ &file ]() {
logFilePtr = nullptr;
file.close();
} );

Q_UNUSED( guard )

QFont f = QApplication::font();
f.setStyleStrategy( QFont::PreferAntialias );
QApplication::setFont( f );
Expand Down Expand Up @@ -518,12 +447,10 @@ int main( int argc, char ** argv )

cfg.resetState = gdcl.resetState;

Logging::retainDefaultMessageHandler( qInstallMessageHandler( nullptr ) );

// Log to file enabled through command line or preference
if ( gdcl.logFile || cfg.preferences.enableApplicationLog ) {
logFilePtr->setFileName( Config::getConfigDir() + "gd_log.txt" );
logFilePtr->open( QFile::WriteOnly );
qInstallMessageHandler( gdMessageHandler );
}
Logging::switchLoggingMethod( gdcl.logFile || cfg.preferences.enableApplicationLog );

// Reload translations for user selected locale is nesessary
QTranslator qtTranslator;
Expand Down Expand Up @@ -622,9 +549,5 @@ int main( int argc, char ** argv )
#endif
int r = app.exec();

if ( logFilePtr->isOpen() ) {
logFilePtr->close();
}

return r;
}
8 changes: 2 additions & 6 deletions src/termination.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,15 @@
/* This file is (c) 2008-2012 Konstantin Isakov <[email protected]>
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */

#include "logfileptr.hh"
#include "log_to_file.hh"
#include "termination.hh"
#include <QDebug>
#include <exception>

static void termHandler()
{
qDebug() << "GoldenDict has crashed unexpectedly.\n\n";

if ( logFilePtr && logFilePtr->isOpen() ) {
logFilePtr->close();
}

Logger::closeLogFile();
abort();
}

Expand Down
3 changes: 3 additions & 0 deletions src/ui/mainwindow.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#endif

#include "mainwindow.hh"
#include "logging.hh"
#include <QWebEngineProfile>
#include "edit_dictionaries.hh"
#include "dict/loaddictionaries.hh"
Expand Down Expand Up @@ -2366,6 +2367,8 @@ void MainWindow::editPreferences()

ui.fullTextSearchAction->setEnabled( cfg.preferences.fts.enabled );

Logging::switchLoggingMethod( cfg.preferences.enableApplicationLog );

Config::save( cfg );
}

Expand Down

0 comments on commit 755c041

Please sign in to comment.