Improve log formatting

* Updated log level detection for current Minecraft versions
* Better formatting: using a monospaced font and raw text instead of HTML (fixes #111)
This commit is contained in:
Petr Mrázek 2014-11-09 14:53:08 +01:00
parent f9a7c1cf21
commit 2e9284951c
3 changed files with 97 additions and 62 deletions

View File

@ -16,6 +16,14 @@ LogPage::LogPage(MinecraftProcess *proc, QWidget *parent)
connect(m_process, SIGNAL(log(QString, MessageLevel::Enum)), this,
SLOT(write(QString, MessageLevel::Enum)));
// create the format and set its font
defaultFormat = new QTextCharFormat(ui->text->currentCharFormat());
QFont font;
font.setFamily("Courier");
font.setStyleHint(QFont::Monospace);
font.setFixedPitch(true);
defaultFormat->setFont(font);
auto findShortcut = new QShortcut(QKeySequence(QKeySequence::Find), this);
connect(findShortcut, SIGNAL(activated()), SLOT(findActivated()));
auto findNextShortcut = new QShortcut(QKeySequence(QKeySequence::FindNext), this);
@ -28,6 +36,7 @@ LogPage::LogPage(MinecraftProcess *proc, QWidget *parent)
LogPage::~LogPage()
{
delete ui;
delete defaultFormat;
}
bool LogPage::apply()
@ -107,24 +116,6 @@ void LogPage::findPreviousActivated()
}
}
void LogPage::writeColor(QString text, const char *color, const char *background)
{
// append a paragraph
QString newtext;
newtext += "<span style=\"";
{
if (color)
newtext += QString("color:") + color + ";";
if (background)
newtext += QString("background-color:") + background + ";";
newtext += "font-family: monospace;";
}
newtext += "\">";
newtext += text.toHtmlEscaped();
newtext += "</span>";
ui->text->appendHtml(newtext);
}
void LogPage::write(QString data, MessageLevel::Enum mode)
{
if (!m_write_active)
@ -159,31 +150,59 @@ void LogPage::write(QString data, MessageLevel::Enum mode)
for (QString &paragraph : paragraphs)
{
//TODO: implement filtering here.
filtered.append(paragraph.trimmed());
filtered.append(paragraph);
}
QListIterator<QString> iter(filtered);
if (mode == MessageLevel::MultiMC)
while (iter.hasNext())
writeColor(iter.next(), "blue", 0);
else if (mode == MessageLevel::Error)
while (iter.hasNext())
writeColor(iter.next(), "red", 0);
else if (mode == MessageLevel::Warning)
while (iter.hasNext())
writeColor(iter.next(), "orange", 0);
else if (mode == MessageLevel::Fatal)
while (iter.hasNext())
writeColor(iter.next(), "red", "black");
else if (mode == MessageLevel::Debug)
while (iter.hasNext())
writeColor(iter.next(), "green", 0);
else if (mode == MessageLevel::PrePost)
while (iter.hasNext())
writeColor(iter.next(), "grey", 0);
// TODO: implement other MessageLevels
else
while (iter.hasNext())
writeColor(iter.next(), 0, 0);
QTextCharFormat format(*defaultFormat);
switch(mode)
{
case MessageLevel::MultiMC:
{
format.setForeground(QColor("blue"));
break;
}
case MessageLevel::Debug:
{
format.setForeground(QColor("green"));
break;
}
case MessageLevel::Warning:
{
format.setForeground(QColor("orange"));
break;
}
case MessageLevel::Error:
{
format.setForeground(QColor("red"));
break;
}
case MessageLevel::Fatal:
{
format.setForeground(QColor("red"));
format.setBackground(QColor("black"));
}
case MessageLevel::PrePost:
{
format.setForeground(QColor("grey"));
}
case MessageLevel::Info:
case MessageLevel::Message:
default:
{
// do nothing, keep original
}
}
while (iter.hasNext())
{
// append a paragraph/line
auto workCursor = ui->text->textCursor();
workCursor.movePosition(QTextCursor::End);
workCursor.insertText(iter.next(), format);
workCursor.insertBlock();
}
if (isVisible())
{
if (m_scroll_active)

View File

@ -28,6 +28,7 @@ namespace Ui
{
class LogPage;
}
class QTextCharFormat;
class LogPage : public QWidget, public BasePage
{
@ -55,15 +56,6 @@ public:
}
virtual bool shouldDisplay() const;
private:
/**
* @brief write a colored paragraph
* @param data the string
* @param color the css color name
* this will only insert a single paragraph.
* \n are ignored. a real \n is always appended.
*/
void writeColor(QString text, const char *color, const char *background);
private slots:
/**
* @brief write a string
@ -90,4 +82,6 @@ private:
bool m_scroll_active = true;
int m_saved_offset = 0;
bool m_write_active = true;
QTextCharFormat * defaultFormat;
};

View File

@ -144,19 +144,41 @@ QString MinecraftProcess::censorPrivateInfo(QString in)
// console window
MessageLevel::Enum MinecraftProcess::guessLevel(const QString &line, MessageLevel::Enum level)
{
if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") ||
line.contains("[FINER]") || line.contains("[FINEST]"))
level = MessageLevel::Message;
if (line.contains("[SEVERE]") || line.contains("[STDERR]"))
level = MessageLevel::Error;
if (line.contains("[WARNING]"))
level = MessageLevel::Warning;
if (line.contains("Exception in thread") || line.contains(" at "))
level = MessageLevel::Fatal;
if (line.contains("[DEBUG]"))
level = MessageLevel::Debug;
QRegularExpression re("\\[(?<timestamp>[0-9:]+)\\] \\[[^/]+/(?<level>[^\\]]+)\\]");
auto match = re.match(line);
if(match.hasMatch())
{
// New style logs from log4j
QString timestamp = match.captured("timestamp");
QString levelStr = match.captured("level");
if(levelStr == "INFO")
level = MessageLevel::Message;
if(levelStr == "WARN")
level = MessageLevel::Warning;
if(levelStr == "ERROR")
level = MessageLevel::Error;
if(levelStr == "FATAL")
level = MessageLevel::Fatal;
if(levelStr == "TRACE" || levelStr == "DEBUG")
level = MessageLevel::Debug;
}
else
{
// Old style forge logs
if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") ||
line.contains("[FINER]") || line.contains("[FINEST]"))
level = MessageLevel::Message;
if (line.contains("[SEVERE]") || line.contains("[STDERR]"))
level = MessageLevel::Error;
if (line.contains("[WARNING]"))
level = MessageLevel::Warning;
if (line.contains("[DEBUG]"))
level = MessageLevel::Debug;
}
if (line.contains("overwriting existing"))
level = MessageLevel::Fatal;
return MessageLevel::Fatal;
if (line.contains("Exception in thread") || line.contains(" at "))
return MessageLevel::Fatal;
return level;
}