diff --git a/docs-mini/README.logging b/docs-mini/README.logging index 4e376a5bd..6321d39fc 100644 --- a/docs-mini/README.logging +++ b/docs-mini/README.logging @@ -15,36 +15,40 @@ anyway) as the field delimiter: + true steering.csv 1000 , + true Rudder /controls/rudder + true Ailerons /controls/aileron -Each 'log' subbranch contains an optional 'filename' property -(defaults to "fg_log.csv"), an optional 'delimiter' property (defaults -to a comma), an optional 'interval-ms' property (defaults to 0, which -logs every frame), and a series of 'entry' subbranches. The -'delimiter' property uses only the first character of the property -value as the delimiter. Note that the logger does no escaping, so you -must choose a delimiter that will not appear in the property values -(that's not hard, since most of the values are numeric, but watch for -commas in the titles). +Each 'log' subbranch contains a required 'enabled' property, an +optional 'filename' property (defaults to "fg_log.csv"), an optional +'delimiter' property (defaults to a comma), an optional 'interval-ms' +property (defaults to 0, which logs every frame), and a series of +'entry' subbranches. The 'delimiter' property uses only the first +character of the property value as the delimiter. Note that the +logger does no escaping, so you must choose a delimiter that will not +appear in the property values (that's not hard, since most of the +values are numeric, but watch for commas in the titles). -Each 'entry' subbranch contains a 'property' property specifying the -name of the property to be logged, and an optional 'title' property -specifying the title to use in the CSV file (defaults to the full path -of the property). The elapsed time in milliseconds since the start of -the simulation is always included as the first entry with the title -"Time", so there is no need to include it explicitly. +Each 'entry' subbranch contains a required 'enabled' property, a +'property' property specifying the name of the property to be logged, +and an optional 'title' property specifying the title to use in the +CSV file (defaults to the full path of the property). The elapsed +time in milliseconds since the start of the simulation is always +included as the first entry with the title "Time", so there is no need +to include it explicitly. Here's a sample of the logging output for the above log: @@ -79,4 +83,4 @@ The output log files are always relative to the current directory. -- -David Megginson, 2002-03-12 +David Megginson, last updated 2002-02-01 diff --git a/src/Main/logger.cxx b/src/Main/logger.cxx index e7d025267..da060caed 100644 --- a/src/Main/logger.cxx +++ b/src/Main/logger.cxx @@ -39,21 +39,54 @@ FGLogger::init () vector children = logging->getChildren("log"); for (unsigned int i = 0; i < children.size(); i++) { + + SGPropertyNode * child = children[i]; + + if (!child->getBoolValue("enabled", false)) + continue; + _logs.push_back(Log()); Log &log = _logs[_logs.size()-1]; - SGPropertyNode * child = children[i]; - string filename = child->getStringValue("filename", "fg_log.csv"); - log.interval_ms = child->getLongValue("interval-ms", 0); - log.delimiter = child->getStringValue("delimiter", ",")[0]; + + string filename = child->getStringValue("filename"); + if (filename.size() == 0) { + filename = "fg_log.csv"; + child->setStringValue("filename", filename.c_str()); + } + + string delimiter = child->getStringValue("delimiter"); + if (delimiter.size() == 0) { + delimiter = ","; + child->setStringValue("delimiter", delimiter.c_str()); + } + + log.interval_ms = child->getLongValue("interval-ms"); + log.delimiter = delimiter.c_str()[0]; log.output = new ofstream(filename.c_str()); if (!log.output) { SG_LOG(SG_INPUT, SG_ALERT, "Cannot write log to " << filename); continue; } + + // + // Process the individual entries (Time is automatic). + // vector entries = child->getChildren("entry"); (*log.output) << "Time"; for (unsigned int j = 0; j < entries.size(); j++) { SGPropertyNode * entry = entries[j]; + + // + // Set up defaults. + // + if (!entry->hasValue("property")) { + entry->setBoolValue("enabled", false); + continue; + } + + if (!entry->getBoolValue("enabled")) + continue; + SGPropertyNode * node = fgGetNode(entry->getStringValue("property"), true); log.nodes.push_back(node); @@ -64,6 +97,13 @@ FGLogger::init () } } +void +FGLogger::reinit () +{ + _logs.clear(); + init(); +} + void FGLogger::bind () { diff --git a/src/Main/logger.hxx b/src/Main/logger.hxx index bf31bf417..6b7d95291 100644 --- a/src/Main/logger.hxx +++ b/src/Main/logger.hxx @@ -40,6 +40,7 @@ public: // Implementation of FGSubsystem virtual void init (); + virtual void reinit (); virtual void bind (); virtual void unbind (); virtual void update (double dt);