You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rm...@apache.org on 2021/04/27 00:29:45 UTC
[logging-log4cxx] branch master updated: LOGCXX-523 Call error
handler if rollover fails (#64)
This is an automated email from the ASF dual-hosted git repository.
rmiddleton pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
The following commit(s) were added to refs/heads/master by this push:
new 674f43d LOGCXX-523 Call error handler if rollover fails (#64)
674f43d is described below
commit 674f43db0dce625afe6ec9981afeb1fda6ab923b
Author: Robert Middleton <rm...@users.noreply.github.com>
AuthorDate: Mon Apr 26 20:29:39 2021 -0400
LOGCXX-523 Call error handler if rollover fails (#64)
* LOGCXX-523 Call error handler if rollover fails
If the rollover fails, call the specified error handler for
the given appender. This means that you can now replace appenders
with a new appender.
The entire API at this point is not very robust at the moment. A
better error handling mechanism needs to be made to properly
handle the errors so that the error handler can have enough
data to do its job.
* Fix build on Windows
* Add include file needed for windows
---
src/main/cpp/appenderattachableimpl.cpp | 25 ++++++++--
src/main/cpp/asyncappender.cpp | 8 ----
src/main/cpp/logger.cpp | 81 ++++-----------------------------
src/main/cpp/rollingfileappender.cpp | 21 +++++++--
4 files changed, 47 insertions(+), 88 deletions(-)
diff --git a/src/main/cpp/appenderattachableimpl.cpp b/src/main/cpp/appenderattachableimpl.cpp
index 6e63488..df077a1 100644
--- a/src/main/cpp/appenderattachableimpl.cpp
+++ b/src/main/cpp/appenderattachableimpl.cpp
@@ -42,6 +42,7 @@ void AppenderAttachableImpl::addAppender(const AppenderPtr newAppender)
return;
}
+ std::unique_lock<std::mutex> lock( m_mutex );
AppenderList::iterator it = std::find(
appenderList.begin(), appenderList.end(), newAppender);
@@ -55,14 +56,27 @@ int AppenderAttachableImpl::appendLoopOnAppenders(
const spi::LoggingEventPtr& event,
Pool& p)
{
- for (AppenderList::iterator it = appenderList.begin();
- it != appenderList.end();
+
+ AppenderList allAppenders;
+ int numberAppended = 0;
+ {
+ // There are occasions where we want to modify our list of appenders
+ // while we are iterating over them. For example, if one of the
+ // appenders fails, we may want to swap it out for a new one.
+ // So, make a local copy of the appenders that we want to iterate over
+ // before actually iterating over them.
+ std::unique_lock<std::mutex> lock( m_mutex );
+ allAppenders = appenderList;
+ }
+ for (AppenderList::iterator it = allAppenders.begin();
+ it != allAppenders.end();
it++)
{
(*it)->doAppend(event, p);
+ numberAppended++;
}
- return (int)appenderList.size();
+ return numberAppended;
}
AppenderList AppenderAttachableImpl::getAllAppenders() const
@@ -77,6 +91,7 @@ AppenderPtr AppenderAttachableImpl::getAppender(const LogString& name) const
return 0;
}
+ std::unique_lock<std::mutex> lock( m_mutex );
AppenderList::const_iterator it, itEnd = appenderList.end();
AppenderPtr appender;
@@ -100,6 +115,7 @@ bool AppenderAttachableImpl::isAttached(const AppenderPtr appender) const
return false;
}
+ std::unique_lock<std::mutex> lock( m_mutex );
AppenderList::const_iterator it = std::find(
appenderList.begin(), appenderList.end(), appender);
@@ -108,6 +124,7 @@ bool AppenderAttachableImpl::isAttached(const AppenderPtr appender) const
void AppenderAttachableImpl::removeAllAppenders()
{
+ std::unique_lock<std::mutex> lock( m_mutex );
AppenderList::iterator it, itEnd = appenderList.end();
AppenderPtr a;
@@ -127,6 +144,7 @@ void AppenderAttachableImpl::removeAppender(const AppenderPtr appender)
return;
}
+ std::unique_lock<std::mutex> lock( m_mutex );
AppenderList::iterator it = std::find(
appenderList.begin(), appenderList.end(), appender);
@@ -143,6 +161,7 @@ void AppenderAttachableImpl::removeAppender(const LogString& name)
return;
}
+ std::unique_lock<std::mutex> lock( m_mutex );
AppenderList::iterator it, itEnd = appenderList.end();
AppenderPtr appender;
diff --git a/src/main/cpp/asyncappender.cpp b/src/main/cpp/asyncappender.cpp
index 89300bc..6da23b1 100644
--- a/src/main/cpp/asyncappender.cpp
+++ b/src/main/cpp/asyncappender.cpp
@@ -61,7 +61,6 @@ AsyncAppender::~AsyncAppender()
void AsyncAppender::addAppender(const AppenderPtr newAppender)
{
- std::unique_lock<std::mutex> lock(appenders->getMutex());
appenders->addAppender(newAppender);
}
@@ -221,19 +220,16 @@ void AsyncAppender::close()
AppenderList AsyncAppender::getAllAppenders() const
{
- std::unique_lock<std::mutex> lock(appenders->getMutex());
return appenders->getAllAppenders();
}
AppenderPtr AsyncAppender::getAppender(const LogString& n) const
{
- std::unique_lock<std::mutex> lock(appenders->getMutex());
return appenders->getAppender(n);
}
bool AsyncAppender::isAttached(const AppenderPtr appender) const
{
- std::unique_lock<std::mutex> lock(appenders->getMutex());
return appenders->isAttached(appender);
}
@@ -244,19 +240,16 @@ bool AsyncAppender::requiresLayout() const
void AsyncAppender::removeAllAppenders()
{
- std::unique_lock<std::mutex> lock(appenders->getMutex());
appenders->removeAllAppenders();
}
void AsyncAppender::removeAppender(const AppenderPtr appender)
{
- std::unique_lock<std::mutex> lock(appenders->getMutex());
appenders->removeAppender(appender);
}
void AsyncAppender::removeAppender(const LogString& n)
{
- std::unique_lock<std::mutex> lock(appenders->getMutex());
appenders->removeAppender(n);
}
@@ -403,7 +396,6 @@ void AsyncAppender::dispatch()
iter != events.end();
iter++)
{
- std::unique_lock<std::mutex> lock(appenders->getMutex());
appenders->appendLoopOnAppenders(*iter, p);
}
}
diff --git a/src/main/cpp/logger.cpp b/src/main/cpp/logger.cpp
index 71c16ed..fc617ae 100644
--- a/src/main/cpp/logger.cpp
+++ b/src/main/cpp/logger.cpp
@@ -42,7 +42,7 @@ IMPLEMENT_LOG4CXX_OBJECT(Logger)
Logger::Logger(Pool& p, const LogString& name1)
: pool(&p), name(), level(), parent(), resourceBundle(),
- repository(), aai()
+ repository(), aai(new AppenderAttachableImpl(*pool))
{
name = name1;
additive = true;
@@ -55,17 +55,9 @@ Logger::~Logger()
void Logger::addAppender(const AppenderPtr newAppender)
{
log4cxx::spi::LoggerRepositoryPtr rep;
- {
- log4cxx::shared_lock<log4cxx::shared_mutex> lock(mutex);
-
- if (aai == 0)
- {
- aai = AppenderAttachableImplPtr(new AppenderAttachableImpl(*pool));
- }
- aai->addAppender(newAppender);
- rep = repository.lock();
- }
+ aai->addAppender(newAppender);
+ rep = repository.lock();
if (rep)
{
@@ -79,13 +71,7 @@ void Logger::reconfigure( const std::vector<AppenderPtr>& appenders, bool additi
additive = additive1;
- if (aai != 0)
- {
- aai->removeAllAppenders();
- aai = 0;
- }
-
- aai = AppenderAttachableImplPtr(new AppenderAttachableImpl(*pool));
+ aai->removeAllAppenders();
for ( std::vector<AppenderPtr>::const_iterator it = appenders.cbegin();
it != appenders.cend();
@@ -108,13 +94,7 @@ void Logger::callAppenders(const spi::LoggingEventPtr& event, Pool& p) const
logger != 0;
logger = logger->parent.get())
{
- // Protected against simultaneous call to addAppender, removeAppender,...
- std::unique_lock<log4cxx::shared_mutex> lock(logger->mutex);
-
- if (logger->aai != 0)
- {
- writes += logger->aai->appendLoopOnAppenders(event, p);
- }
+ writes += logger->aai->appendLoopOnAppenders(event, p);
if (!logger->additive)
{
@@ -175,27 +155,11 @@ bool Logger::getAdditivity() const
AppenderList Logger::getAllAppenders() const
{
- log4cxx::shared_lock<log4cxx::shared_mutex> lock(mutex);
-
- if (aai == 0)
- {
- return AppenderList();
- }
- else
- {
- return aai->getAllAppenders();
- }
+ return aai->getAllAppenders();
}
AppenderPtr Logger::getAppender(const LogString& name1) const
{
- log4cxx::shared_lock<log4cxx::shared_mutex> lock(mutex);
-
- if (aai == 0 || name1.empty())
- {
- return 0;
- }
-
return aai->getAppender(name1);
}
@@ -275,16 +239,7 @@ LevelPtr Logger::getLevel() const
bool Logger::isAttached(const AppenderPtr appender) const
{
- log4cxx::shared_lock<log4cxx::shared_mutex> lock(mutex);
-
- if (appender == 0 || aai == 0)
- {
- return false;
- }
- else
- {
- return aai->isAttached(appender);
- }
+ return aai->isAttached(appender);
}
bool Logger::isTraceEnabled() const
@@ -471,36 +426,16 @@ void Logger::l7dlog(const LevelPtr& level1, const std::string& key,
void Logger::removeAllAppenders()
{
- std::unique_lock<log4cxx::shared_mutex> lock(mutex);
-
- if (aai != 0)
- {
- aai->removeAllAppenders();
- aai = 0;
- }
+ aai->removeAllAppenders();
}
void Logger::removeAppender(const AppenderPtr appender)
{
- std::unique_lock<log4cxx::shared_mutex> lock(mutex);
-
- if (appender == 0 || aai == 0)
- {
- return;
- }
-
aai->removeAppender(appender);
}
void Logger::removeAppender(const LogString& name1)
{
- std::unique_lock<log4cxx::shared_mutex> lock(mutex);
-
- if (name1.empty() || aai == 0)
- {
- return;
- }
-
aai->removeAppender(name1);
}
diff --git a/src/main/cpp/rollingfileappender.cpp b/src/main/cpp/rollingfileappender.cpp
index bb805a6..3e6f2dc 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/rollingfileappender.cpp
@@ -39,6 +39,7 @@
#include <log4cxx/helpers/bytebuffer.h>
#include <log4cxx/rolling/fixedwindowrollingpolicy.h>
#include <log4cxx/rolling/manualtriggeringpolicy.h>
+#include <log4cxx/helpers/transcoder.h>
using namespace log4cxx;
using namespace log4cxx::rolling;
@@ -305,9 +306,12 @@ bool RollingFileAppenderSkeleton::rolloverInternal(Pool& p)
{
success = rollover1->getSynchronous()->execute(p);
}
- catch (std::exception&)
+ catch (std::exception& ex)
{
LogLog::warn(LOG4CXX_STR("Exception on rollover"));
+ LogString exmsg;
+ log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
+ errorHandler->error(exmsg, ex, 0);
}
}
@@ -363,9 +367,12 @@ bool RollingFileAppenderSkeleton::rolloverInternal(Pool& p)
{
success = rollover1->getSynchronous()->execute(p);
}
- catch (std::exception&)
+ catch (std::exception& ex)
{
LogLog::warn(LOG4CXX_STR("Exception during rollover"));
+ LogString exmsg;
+ log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
+ errorHandler->error(exmsg, ex, 0);
}
}
@@ -400,9 +407,12 @@ bool RollingFileAppenderSkeleton::rolloverInternal(Pool& p)
return true;
}
}
- catch (std::exception&)
+ catch (std::exception& ex)
{
LogLog::warn(LOG4CXX_STR("Exception during rollover"));
+ LogString exmsg;
+ log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
+ errorHandler->error(exmsg, ex, 0);
}
#ifdef LOG4CXX_MULTI_PROCESS
@@ -458,9 +468,12 @@ void RollingFileAppenderSkeleton::subAppend(const LoggingEventPtr& event, Pool&
_event = &(const_cast<LoggingEventPtr&>(event));
rolloverInternal(p);
}
- catch (std::exception&)
+ catch (std::exception& ex)
{
LogLog::warn(LOG4CXX_STR("Exception during rollover attempt."));
+ LogString exmsg;
+ log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
+ errorHandler->error(exmsg);
}
}