Parameter to specify a logging file

This commit is contained in:
Markus Gans 2020-06-07 18:21:59 +02:00
parent c1b2699e53
commit 0ff67da077
11 changed files with 98 additions and 34 deletions

View File

@ -1,3 +1,7 @@
2020-06-07 Markus Gans <guru.mail@muenster.de>
* The --log-file parameter stores log output to any file. The file
can be viewed directly on another terminal with "tail -f".
2020-06-06 Markus Gans <guru.mail@muenster.de>
* Now, the terminal is not initialized before the method show()
is called. Or you force it explicitly via the FApplication object.

View File

@ -163,6 +163,10 @@ class DirectLogger final : public finalcut::FLog
// An implementation is not required in this context
}
void flush() override
{
output.flush();
}
void setOutputStream (const std::ostream& os) override
{ output.rdbuf(os.rdbuf()); }

View File

@ -310,7 +310,7 @@ int main (int argc, char* argv[])
// Force terminal initialization without calling show()
term_app.initTerminal();
if ( term_app.isQuit() )
if ( finalcut::FApplication::isQuit() )
return 0;
std::cout << "--------\r\nFTermcap\r\n--------\r\n\n";

View File

@ -1067,9 +1067,6 @@ int main (int argc, char* argv[])
finalcut::FTerm::redefineDefaultColors(true);
finalcut::FTerm::setTermTitle (title);
// Force vt100 encoding
//finalcut::FTerm::setEncoding(finalcut::fc::VT100);
// Sets the terminal size to 94×30
//finalcut::FTerm::setTermSize(FSize{94, 30});

View File

@ -84,12 +84,12 @@ SmallWindow::SmallWindow (finalcut::FWidget* parent)
right_arrow.ignorePadding();
right_arrow.setGeometry (FPoint{int(getWidth()) - 1, 2}, FSize{1, 1});
top_left_label = "menu";
top_left_label.setText("menu");
top_left_label.setForegroundColor (wc->label_inactive_fg);
top_left_label.setEmphasis();
top_left_label.setGeometry (FPoint{1, 1}, FSize{6, 1});
top_right_label = "zoom";
top_right_label.setText("zoom");
top_right_label.setAlignment (fc::alignRight);
top_right_label.setForegroundColor (wc->label_inactive_fg);
top_right_label.setEmphasis();

View File

@ -20,6 +20,7 @@
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include <fstream>
#include <memory>
#include <string>
@ -366,9 +367,58 @@ void FApplication::init (uInt64 key_time, uInt64 dblclick_time)
mouse->setDblclickInterval (dblclick_time);
// Initialize logging
if ( ! getStartOptions().logfile_stream.is_open() )
getLog()->setLineEnding(FLog::CRLF);
}
//----------------------------------------------------------------------
void FApplication::setTerminalEncoding (const FString& enc_str)
{
const FString& enc = enc_str.toLower();
if ( enc.includes("utf8") )
getStartOptions().encoding = fc::UTF8;
else if ( enc.includes("vt100") )
getStartOptions().encoding = fc::VT100;
else if ( enc.includes("pc") )
getStartOptions().encoding = fc::PC;
else if ( enc.includes("ascii") )
getStartOptions().encoding = fc::ASCII;
else if ( enc.includes("help") )
showParameterUsage();
else
{
auto ftermdata = FTerm::getFTermData();
ftermdata->setExitMessage ( "Unknown encoding \"" + enc_str
+ "\"\n(Valid encodings are utf8, "
+ "vt100, pc and ascii)" );
exit(EXIT_FAILURE);
}
}
//----------------------------------------------------------------------
void FApplication::setLogFile (const FString& filename)
{
// Get the global logger object
FLog& log = *FApplication::getLog();
auto& log_stream = getStartOptions().logfile_stream;
log_stream.open(filename, std::ofstream::out);
if ( log_stream.is_open() )
{
log.setOutputStream(log_stream);
log.enableTimestamp();
log.setLineEnding (finalcut::FLog::LF);
}
else
{
auto ftermdata = FTerm::getFTermData();
ftermdata->setExitMessage ( "Could not open log file \""
+ FString(optarg) + "\"" );
exit(EXIT_FAILURE);
}
}
//----------------------------------------------------------------------
void FApplication::cmd_options (const int& argc, char* argv[])
{
@ -379,6 +429,7 @@ void FApplication::cmd_options (const int& argc, char* argv[])
static struct option long_options[] =
{
{"encoding", required_argument, nullptr, 0 },
{"log-file", required_argument, nullptr, 0 },
{"no-mouse", no_argument, nullptr, 0 },
{"no-optimized-cursor", no_argument, nullptr, 0 },
{"no-terminal-detection", no_argument, nullptr, 0 },
@ -409,28 +460,10 @@ void FApplication::cmd_options (const int& argc, char* argv[])
if ( c == 0 )
{
if ( std::strcmp(long_options[idx].name, "encoding") == 0 )
{
FString encoding{optarg};
encoding = encoding.toLower();
setTerminalEncoding(FString(optarg));
if ( encoding.includes("utf8") )
getStartOptions().encoding = fc::UTF8;
else if ( encoding.includes("vt100") )
getStartOptions().encoding = fc::VT100;
else if ( encoding.includes("pc") )
getStartOptions().encoding = fc::PC;
else if ( encoding.includes("ascii") )
getStartOptions().encoding = fc::ASCII;
else if ( encoding.includes("help") )
showParameterUsage();
else
{
auto ftermdata = FTerm::getFTermData();
ftermdata->setExitMessage ( "Unknown encoding "
+ std::string(encoding.c_str()) );
exit(EXIT_FAILURE);
}
}
if ( std::strcmp(long_options[idx].name, "log-file") == 0 )
setLogFile(FString(optarg));
if ( std::strcmp(long_options[idx].name, "no-mouse") == 0 )
getStartOptions().mouse_support = false;
@ -488,10 +521,12 @@ void FApplication::showParameterUsage()
<< " Display this help and exit\n"
<< "\n"
<< "The Final Cut options:\n"
<< " --encoding <name> "
<< " --encoding=<MODE> "
<< " Sets the character encoding mode\n"
<< " "
<< " {utf8, vt100, pc, ascii}\n"
<< " --log-file=<FILE> "
<< " Writes log output to FILE\n"
<< " --no-mouse "
<< " Disable mouse support\n"
<< " --no-optimized-cursor "
@ -1199,6 +1234,8 @@ void FApplication::processLogger()
if ( ! logger->str().empty() )
logger->pubsync();
logger->flush();
}
//----------------------------------------------------------------------

View File

@ -147,6 +147,8 @@ class FApplication : public FWidget
// Methods
void init (uInt64, uInt64);
static void setTerminalEncoding (const FString&);
static void setLogFile (const FString&);
static void cmd_options (const int&, char*[]);
static FStartOptions& getStartOptions();
static void showParameterUsage();

View File

@ -89,6 +89,7 @@ class FLog : public std::stringbuf
virtual void warn (const std::string&) = 0;
virtual void error (const std::string&) = 0;
virtual void debug (const std::string&) = 0;
virtual void flush() = 0;
virtual void setOutputStream (const std::ostream&) = 0;
virtual void setLineEnding (LineEnding) = 0;
virtual void enableTimestamp() = 0;

View File

@ -77,6 +77,7 @@ class FLogger : public FLog
void warn (const std::string&) override;
void error (const std::string&) override;
void debug (const std::string&) override;
void flush() override;
void setOutputStream (const std::ostream&) override;
void setLineEnding (LineEnding) override;
void enableTimestamp() override;
@ -127,6 +128,10 @@ inline void FLogger::debug (const std::string& msg)
printLogLine (msg);
}
//----------------------------------------------------------------------
inline void FLogger::flush()
{ output.flush(); }
//----------------------------------------------------------------------
inline void FLogger::setOutputStream (const std::ostream& os)
{ output.rdbuf(os.rdbuf()); }

View File

@ -35,6 +35,7 @@
#error "Only <final/final.h> can be included directly."
#endif
#include <fstream>
#include <iostream>
#include "final/fc.h"
@ -82,7 +83,6 @@ class FStartOptions final
uInt8 sgr_optimizer : 1;
uInt8 vgafont : 1;
uInt8 newfont : 1;
fc::encoding encoding{fc::UNKNOWN};
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(UNIT_TEST)
uInt8 meta_sends_escape : 1;
@ -95,6 +95,9 @@ class FStartOptions final
uInt16 dark_theme : 1;
uInt16 : 15; // padding bits
fc::encoding encoding{fc::UNKNOWN};
std::ofstream logfile_stream;
static FStartOptions* start_options;
};

View File

@ -59,17 +59,28 @@ class myLogger : public finalcut::FLog
output << "Debug: " << entry << std::endl;
}
void flush() override
{
// An implementation is not required in this context
}
void setOutputStream (const std::ostream& os) override
{ output.rdbuf(os.rdbuf()); }
void setLineEnding (LineEnding) override
{ }
{
// An implementation is not required in this context
}
void enableTimestamp() override
{ }
{
// An implementation is not required in this context
}
void disableTimestamp() override
{ }
{
// An implementation is not required in this context
}
private:
// Data member