On Aug 11, 2009, at 2:12 PM, ss ak wrote:

string logfile = "logfile1.log";
printf("\n in main () ");

log4cxx::FileAppenderPtr fileAppender = new log4cxx::FileAppender(log4cxx::LayoutPtr(new log4cxx ::SimpleLayout ()),log4cxx::helpers::Transcoder::decode(logfile.c_str()),false);

log4cxx::helpers::Pool p;
fileAppender->activateOptions(p);

printf(

"\n second printf");
log4cxx::BasicConfigurator::configure();
 //configure(log4cxx::AppenderPtr(fileAppender));
log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("logger");
logger->setLevel(log4cxx::Level::getAll());
logger->addAppender(fileAppender);
LOG4CXX_INFO(logger,"IN main method");

Now the file is created but does not write anything into it....
or does not print "second printf"
the program just aborts,after creating the file...

please help..i need this to be done today........thanks....


You don't mention the platform, guessing Windows. There is the possibility of shutting down Apache Portable Runtime before shutting down log4cxx if the first thing you do is to create a Ptr without initializing it. I wanted to avoid the cost of checking for APR startup in every Ptr constructor, but it seems like this hits a lot of people. Probably should go ahead and change that and take any performance hit.

The main thing is to do:

FileAppenderPtr fileAppender(new FileAppender...)

instead of

FileAppenderPtr fileAppender = new Appender...

The first constructs the FileAppender first then initializes the pointer. The other constructs the pointer first then the FileAppender. Since destruction happens in reverse order of construction, you want to construct the FileAppender first.




---------- Forwarded message ----------
From: ss ak <ssa...@gmail.com>
Date: Tue, Aug 11, 2009 at 9:43 AM
Subject: logString issue...please help
To: log4cxx-user@logging.apache.org


string logfile = "logfile.log";
log4cxx::helpers::Transcoder::decode("logfile.log",12,logstr);
 log4cxx::BasicConfigurator::configure();
log4cxx::FileAppenderPtr fileAppender(new log4cxx::FileAppender());
//log4cxx::Layout(new log4cxx::SimpleLayout())));

fileAppender->setAppend(true);
fileAppender->setFile(logfile.c_str());
logger->setLevel(log4cxx::Level::getAll());
logger->addAppender(fileAppender);

I get this error...please help

error C2664: 'void log4cxx::FileAppender::setFile(const log4cxx::LogString &)' : cannot convert parameter 1 from 'const char *' to 'const log4cxx::LogString &'

1> Reason: cannot convert from 'const char *' to 'const log4cxx::LogString'

1> No constructor could take the source type, or constructor overload resolution was ambiguous

1




string logfile = "logfile.log";
log4cxx::helpers::Transcoder::decode("logfile.log",12,logstr);
 log4cxx::BasicConfigurator::configure();
log4cxx::FileAppenderPtr fileAppender(new log4cxx::FileAppender());
//log4cxx::Layout(new log4cxx::SimpleLayout())));

fileAppender->setAppend(true);
fileAppender->setFile(logfile.c_str());
logger->setLevel(log4cxx::Level::getAll());
logger->addAppender(fileAppender);


If all you wanted to do is explicitly set the file name, you should have done:

fileAppender->setFile(LOG4CXX_STR("logfile.log"));

As long as the constant only contains ASCII characters it will use either the proper type of literal or do a transcoding.




Reply via email to