C++ Library containing a lot of needful things: Stack Trace, Command Line Parser, Resource Handling, Configuration Files, Unix Command Execution, Directories, Regular Expressions, Tokenizer, Function Trace, Standard Extensions.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
10 KiB
224 lines
10 KiB
20 years ago
|
/** @file
|
||
|
|
||
|
$Id$
|
||
|
|
||
|
$Date$
|
||
|
$Author$
|
||
|
|
||
|
@copy © Marc Wäckerlin
|
||
|
@license LGPL, see file <a href="license.html">COPYING</a>
|
||
|
|
||
|
$Log$
|
||
19 years ago
|
Revision 1.3 2005/11/29 12:39:42 marc
|
||
|
make it compilable with gcc 4.0.2 and newer doxygen
|
||
|
|
||
20 years ago
|
Revision 1.2 2005/04/14 19:06:37 marc
|
||
|
no more duplicated traces, better filtering for Qt
|
||
|
|
||
20 years ago
|
Revision 1.1 2005/04/07 20:57:36 marc
|
||
|
initial version
|
||
|
|
||
|
|
||
|
1 2 3 4 5 6 7 8
|
||
|
5678901234567890123456789012345678901234567890123456789012345678901234567890
|
||
|
*/
|
||
|
|
||
|
#include <log4cxx/propertyconfigurator.h>
|
||
|
#include <log4cxx/helpers/properties.h>
|
||
|
#include <fstream>
|
||
|
|
||
17 years ago
|
#if (__GNUC__==3 && __GNUC_MINOR__<4 || __GNUC__<3) \
|
||
|
&& defined(_REENTRANT) && !defined(_MT)
|
||
19 years ago
|
#define _MT
|
||
|
#endif
|
||
|
|
||
20 years ago
|
namespace mrw {
|
||
|
|
||
|
/** @addtogroup debug
|
||
|
*/
|
||
|
//@{
|
||
|
|
||
|
/** @defgroup AutoInitLog4cxx Automatically initialize log4cxx
|
||
|
|
||
|
If you want to enable log4cxx
|
||
|
(http://logging.apache.org/log4cxx), you have to configure it in
|
||
|
your application, normally in the main. If you want to configure
|
||
|
it automatically, without changing a single line in your code
|
||
|
(e.g. for temporary debugging), simply link to @c
|
||
|
libmrwlog4cxxconfiguration, either with option @c
|
||
|
-lmrwlog4cxxconfiguration for single threaded, or with @c
|
||
|
-lmrwlog4cxxconfiguration-mt for multi threaded applications.
|
||
|
|
||
|
With @ref trclog4cxx and @ref
|
||
|
AutoFunctionTrace, you can add tracing based on @c log4cxx,
|
||
|
without even change a single line in your code. But your code
|
||
|
still has to initialize @c log4cxx. If you even want to
|
||
|
automatically initialize @c log4cxx, use this library!
|
||
|
|
||
|
Configures @c log4cxx in the following way:
|
||
|
-# if available, read @c log4cxx property file
|
||
|
(read first file found, in this order)
|
||
|
-# file specified in environment variable
|
||
|
@c $MRW_LOG4CXX_CONFIGFILE
|
||
|
-# <code>.mrwlog4cxx</code> (local file)
|
||
|
-# <code>~/.mrwlog4cxx</code> (file in user's home)
|
||
|
-# <code>/etc/mrwlog4cxx</code> (global configuration)
|
||
|
-# if no configuration file is found, use default configuration:
|
||
|
@verbatim
|
||
17 years ago
|
log4j.rootLogger = WARN, A1
|
||
|
log4j.logger.mrw.fntrace = OFF
|
||
|
log4j.logger.mrw.fn = OFF
|
||
20 years ago
|
log4j.logger.mrw.fn.log4cxx = OFF
|
||
|
log4j.logger.mrw.fn.boost = OFF
|
||
|
log4j.logger.mrw.fn.Thread = OFF
|
||
|
log4j.logger.mrw.fn.QString = OFF
|
||
|
log4j.logger.mrw.fn.QShared = OFF
|
||
|
log4j.logger.mrw.fn.QWidget = OFF
|
||
|
log4j.logger.mrw.fn.QRect = OFF
|
||
|
log4j.logger.mrw.fn.qstrcmp = OFF
|
||
|
log4j.logger.mrw.fn.*.qt_cast = OFF
|
||
|
log4j.logger.mrw.fn.mrw = OFF
|
||
|
log4j.logger.mrw.fn.std = OFF
|
||
|
log4j.logger.mrw.fn.CppUnit = OFF
|
||
|
log4j.logger.mrw.fn.__gnu_cxx = OFF
|
||
20 years ago
|
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
|
||
|
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
|
||
|
@endverbatim
|
||
|
and for multi threaded programs in addition:
|
||
|
@verbatim
|
||
17 years ago
|
log4j.appender.A1.layout.ConversionPattern = \%t-\%-40l - \%m\%n
|
||
20 years ago
|
@endverbatim
|
||
|
on the other hand, single threaded programs are formatted as:
|
||
|
@verbatim
|
||
17 years ago
|
log4j.appender.A1.layout.ConversionPattern = \%-40l - \%m\%n
|
||
20 years ago
|
@endverbatim
|
||
|
This results in the following behaviour:
|
||
|
- trace to console
|
||
|
- format as...
|
||
17 years ago
|
- @c "\%t-\%-40l - \%m\%n" if threaded
|
||
|
- @c "\%-40l - \%m\%n" if not threaded
|
||
20 years ago
|
- enable all tracing to @c DEBUG
|
||
|
- enable tracing of @ref AutoFunctionTrace
|
||
|
- disable function trace for @c log4cxx
|
||
|
- disable function trace for @c boost
|
||
|
- disable function trace for @c Qt base classes
|
||
|
- disable function trace for @c libmrw
|
||
20 years ago
|
- disable function trace for @c std
|
||
20 years ago
|
- disable function trace for @c CppUnit
|
||
|
- disable function trace for @c gcc internals
|
||
|
*/
|
||
|
//@{
|
||
|
|
||
|
class InitLog4cxx {
|
||
|
public:
|
||
|
InitLog4cxx() {
|
||
|
std::string logconfigfile;
|
||
|
char* c(getenv("MRW_LOG4CXX_CONFIGFILE"));
|
||
|
if (c && std::ifstream(c))
|
||
|
logconfigfile = c;
|
||
|
else if (std::ifstream(".mrwlog4cxx"))
|
||
|
logconfigfile = ".mrwlog4cxx";
|
||
|
else if ((c=getenv("HOME")) &&
|
||
|
std::ifstream((std::string(c)+"/.mrwlog4cxx").c_str()))
|
||
|
logconfigfile = std::string(c)+"/.mrwlog4cxx";
|
||
|
else if (std::ifstream("/etc/mrwlog4cxx"))
|
||
|
logconfigfile = "/etc/mrwlog4cxx";
|
||
|
if (logconfigfile.size()) {
|
||
17 years ago
|
log4cxx::PropertyConfigurator::configure
|
||
|
(log4cxx::String(logconfigfile.begin(), logconfigfile.end()));
|
||
20 years ago
|
return;
|
||
|
}
|
||
|
log4cxx::helpers::Properties properties;
|
||
17 years ago
|
std::string name, cont;
|
||
|
properties.setProperty((name="log4j.rootLogger",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="WARN, A1",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fntracea",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.log4cxx",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.boost",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.Thread",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.QString",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.QShared",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.QWidget",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.QRect",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.qstrcmp",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.*.qt_cast",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.mrw",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.std",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.CppUnit",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.logger.mrw.fn.__gnu_cxx",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="OFF",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.appender.A1",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="org.apache.log4j.ConsoleAppender",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
|
properties.setProperty((name="log4j.appender.A1.layout",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="org.apache.log4j.PatternLayout",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
19 years ago
|
#ifdef _MT
|
||
17 years ago
|
properties.setProperty((name="log4j.appender.A1.layout.ConversionPattern",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="%t-%-40l - %m%n",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
20 years ago
|
#else
|
||
17 years ago
|
properties.setProperty((name="log4j.appender.A1.layout.ConversionPattern",
|
||
|
log4cxx::String(name.begin(), name.end())),
|
||
|
(cont="%-40l - %m%n",
|
||
|
log4cxx::String(cont.begin(), cont.end())));
|
||
20 years ago
|
#endif
|
||
|
log4cxx::PropertyConfigurator::configure(properties);
|
||
|
}
|
||
|
};
|
||
|
static InitLog4cxx INIT_LOG4CXX;
|
||
|
|
||
|
//@}
|
||
|
//@}
|
||
19 years ago
|
}
|