in src/main/cpp/multiprocessrollingfileappender.cpp [257:368]
bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const TriggeringPolicyPtr& trigger)
{
bool result = false;
LogString fileName = getFile();
if (!_priv->rollingPolicy)
; // can't roll without a policy
else if (isAlreadyRolled(fileName, &_priv->fileLength))
reopenFile(fileName);
else
{
MultiprocessRollingFileAppenderPriv::Lock lk(_priv, fileName);
if (!lk.hasLock())
LogLog::warn(LOG4CXX_STR("Failed to lock ") + fileName);
else if (isAlreadyRolled(fileName, &_priv->fileLength))
reopenFile(fileName);
else if (trigger && !trigger->isTriggeringEvent(this, _priv->_event, fileName, _priv->fileLength))
;
else if (auto rollover1 = _priv->rollingPolicy->rollover(fileName, getAppend(), p))
{
closeWriter();
if (rollover1->getActiveFileName() == fileName)
{
bool success = true; // A synchronous action is not required
if (auto pAction = rollover1->getSynchronous())
success = pAction->execute(p);
bool appendToExisting = true;
if (success)
{
appendToExisting = rollover1->getAppend();
if (appendToExisting)
{
_priv->fileLength = File().setPath(rollover1->getActiveFileName()).length(p);
}
else
{
_priv->fileLength = 0;
}
if (auto asyncAction = rollover1->getAsynchronous())
{
try
{
asyncAction->execute(p);
}
catch (std::exception& ex)
{
LogString msg(LOG4CXX_STR("Async action in rollover ["));
msg.append(fileName);
msg.append(LOG4CXX_STR("] failed"));
_priv->errorHandler->error(msg, ex, 0);
}
}
}
else
{
LogString msg(LOG4CXX_STR("Rollover of ["));
msg.append(fileName);
msg.append(LOG4CXX_STR("] failed"));
_priv->errorHandler->error(msg);
}
setFileInternal(rollover1->getActiveFileName(), appendToExisting, _priv->bufferedIO, _priv->bufferSize, p);
}
else
{
setFileInternal(rollover1->getActiveFileName());
// Call activateOptions to create any intermediate directories(if required)
FileAppender::activateOptionsInternal(p);
OutputStreamPtr os = std::make_shared<FileOutputStream>
( rollover1->getActiveFileName()
, rollover1->getAppend()
);
setWriterInternal(createWriter(os));
bool success = true; // A synchronous action is not required
if (auto pAction = rollover1->getSynchronous())
success = pAction->execute(p);
if (success)
{
if (rollover1->getAppend())
{
_priv->fileLength = File().setPath(rollover1->getActiveFileName()).length(p);
}
else
{
_priv->fileLength = 0;
}
if (auto asyncAction = rollover1->getAsynchronous())
{
try
{
asyncAction->execute(p);
}
catch (std::exception& ex)
{
LogString msg(LOG4CXX_STR("Async action in rollover ["));
msg.append(fileName);
msg.append(LOG4CXX_STR("] failed"));
_priv->errorHandler->error(msg, ex, 0);
}
}
}
}
result = true;
}
}
return result;
}