Skip to content

Simplify WriterAppender interface in the next ABI version #508

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/cpp/fileappender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ void FileAppender::setFileInternal(

try
{
outStream = FileOutputStreamPtr(new FileOutputStream(filename, append1));
outStream = std::make_shared<FileOutputStream>(filename, append1);
}
catch (IOException&)
{
Expand All @@ -336,7 +336,7 @@ void FileAppender::setFileInternal(

if (!parentDir.exists(p) && parentDir.mkdirs(p))
{
outStream = OutputStreamPtr(new FileOutputStream(filename, append1));
outStream = std::make_shared<FileOutputStream>(filename, append1);
}
else
{
Expand Down
2 changes: 1 addition & 1 deletion src/main/cpp/multiprocessrollingfileappender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ void MultiprocessRollingFileAppender::subAppend(const LoggingEventPtr& event, Po
@param os output stream, may not be null.
@return new writer.
*/
WriterPtr MultiprocessRollingFileAppender::createWriter(OutputStreamPtr& os)
WriterPtr MultiprocessRollingFileAppender::createWriter(LOG4CXX_16_CONST OutputStreamPtr& os)
{
auto fos = LOG4CXX_NS::cast<FileOutputStream>(os);
if( fos )
Expand Down
39 changes: 22 additions & 17 deletions src/main/cpp/outputstreamwriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,38 +27,43 @@ using namespace LOG4CXX_NS::helpers;

IMPLEMENT_LOG4CXX_OBJECT(OutputStreamWriter)

struct OutputStreamWriter::OutputStreamWriterPrivate{
OutputStreamWriterPrivate(OutputStreamPtr& out1) : out(out1), enc(CharsetEncoder::getDefaultEncoder()){}

OutputStreamWriterPrivate(OutputStreamPtr& out1,
CharsetEncoderPtr& enc1)
: out(out1), enc(enc1){}
struct OutputStreamWriter::OutputStreamWriterPrivate
{
OutputStreamWriterPrivate
( const OutputStreamPtr& out1
, const CharsetEncoderPtr& enc1 = CharsetEncoder::getDefaultEncoder()
)
: out(out1)
, enc(enc1)
{}

OutputStreamPtr out;
CharsetEncoderPtr enc;
};

OutputStreamWriter::OutputStreamWriter(OutputStreamPtr& out1)
: m_priv(std::make_unique<OutputStreamWriterPrivate>(out1))
OutputStreamWriter::OutputStreamWriter(LOG4CXX_16_CONST OutputStreamPtr& out)
: m_priv(std::make_unique<OutputStreamWriterPrivate>(out))
{
if (out1 == 0)
if (!out)
{
throw NullPointerException(LOG4CXX_STR("out parameter may not be null."));
throw NullPointerException(LOG4CXX_STR("OutputStream parameter may not be null."));
}
}

OutputStreamWriter::OutputStreamWriter(OutputStreamPtr& out1,
CharsetEncoderPtr& enc1)
: m_priv(std::make_unique<OutputStreamWriterPrivate>(out1, enc1))
OutputStreamWriter::OutputStreamWriter
( LOG4CXX_16_CONST OutputStreamPtr& out
, LOG4CXX_16_CONST CharsetEncoderPtr& enc
)
: m_priv(std::make_unique<OutputStreamWriterPrivate>(out, enc))
{
if (out1 == 0)
if (!out)
{
throw NullPointerException(LOG4CXX_STR("out parameter may not be null."));
throw NullPointerException(LOG4CXX_STR("OutputStream parameter may not be null."));
}

if (enc1 == 0)
if (!enc)
{
throw NullPointerException(LOG4CXX_STR("enc parameter may not be null."));
throw NullPointerException(LOG4CXX_STR("CharsetEncoder parameter may not be null."));
}
}

Expand Down
26 changes: 15 additions & 11 deletions src/main/cpp/rollingfileappender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -357,10 +357,11 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
setFileInternal(rollover1->getActiveFileName());
// Call activateOptions to create any intermediate directories(if required)
FileAppender::activateOptionsInternal(p);
OutputStreamPtr os(new FileOutputStream(
rollover1->getActiveFileName(), rollover1->getAppend()));
WriterPtr newWriter(createWriter(os));
setWriterInternal(newWriter);
OutputStreamPtr os = std::make_shared<FileOutputStream>
( rollover1->getActiveFileName()
, rollover1->getAppend()
);
setWriterInternal(createWriter(os));

bool success = true;

Expand Down Expand Up @@ -518,16 +519,19 @@ class CountingOutputStream : public OutputStream
* @param os output stream to wrap.
* @param rfa rolling file appender to inform.
*/
CountingOutputStream(
OutputStreamPtr& os1, RollingFileAppender* rfa1) :
os(os1), rfa(rfa1)
CountingOutputStream
( const OutputStreamPtr& os1
, RollingFileAppender* rfa1
)
: os(os1)
, rfa(rfa1)
{
}

/**
* {@inheritDoc}
*/
void close(Pool& p)
void close(Pool& p) override
{
os->close(p);
rfa = 0;
Expand All @@ -536,15 +540,15 @@ class CountingOutputStream : public OutputStream
/**
* {@inheritDoc}
*/
void flush(Pool& p)
void flush(Pool& p) override
{
os->flush(p);
}

/**
* {@inheritDoc}
*/
void write(ByteBuffer& buf, Pool& p)
void write(ByteBuffer& buf, Pool& p) override
{
os->write(buf, p);

Expand All @@ -566,7 +570,7 @@ class CountingOutputStream : public OutputStream
@param os output stream, may not be null.
@return new writer.
*/
WriterPtr RollingFileAppender::createWriter(OutputStreamPtr& os)
WriterPtr RollingFileAppender::createWriter(LOG4CXX_16_CONST OutputStreamPtr& os)
{
OutputStreamPtr cos = std::make_shared<CountingOutputStream>(os, this);
return FileAppender::createWriter(cos);
Expand Down
22 changes: 15 additions & 7 deletions src/main/cpp/writerappender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,26 @@ WriterAppender::WriterAppender() :
{
}

WriterAppender::WriterAppender(const LayoutPtr& layout1,
LOG4CXX_NS::helpers::WriterPtr& writer1)
: AppenderSkeleton (std::make_unique<WriterAppenderPriv>(layout1, writer1))
#if LOG4CXX_ABI_VERSION <= 15
WriterAppender::WriterAppender(const LayoutPtr& layout, helpers::WriterPtr& writer)
: AppenderSkeleton (std::make_unique<WriterAppenderPriv>(layout, writer))
{
Pool p;
activateOptions(p);
}

WriterAppender::WriterAppender(const LayoutPtr& layout1)
: AppenderSkeleton (std::make_unique<WriterAppenderPriv>(layout1))
WriterAppender::WriterAppender(const LayoutPtr& layout)
: AppenderSkeleton (std::make_unique<WriterAppenderPriv>(layout))
{
}
#else
WriterAppender::WriterAppender(const LayoutPtr& layout, const helpers::WriterPtr& writer)
: AppenderSkeleton(std::make_unique<WriterAppenderPriv>(layout, writer))
{
Pool p;
activateOptions(p);
}
#endif

WriterAppender::WriterAppender(std::unique_ptr<WriterAppenderPriv> priv)
: AppenderSkeleton (std::move(priv))
Expand Down Expand Up @@ -182,7 +190,7 @@ void WriterAppender::closeWriter()
<code>encoding</code> property. If the encoding value is
specified incorrectly the writer will be opened using the default
system encoding (an error message will be printed to the loglog. */
WriterPtr WriterAppender::createWriter(OutputStreamPtr& os)
WriterPtr WriterAppender::createWriter(LOG4CXX_16_CONST OutputStreamPtr& os)
{

LogString enc(getEncoding());
Expand Down Expand Up @@ -213,7 +221,7 @@ WriterPtr WriterAppender::createWriter(OutputStreamPtr& os)
}
}

return WriterPtr(new OutputStreamWriter(os, encoder));
return std::make_shared<OutputStreamWriter>(os, encoder);
}

LogString WriterAppender::getEncoding() const
Expand Down
4 changes: 2 additions & 2 deletions src/main/include/log4cxx/fileappender.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ class LOG4CXX_EXPORT FileAppender : public WriterAppender
static LogString stripDuplicateBackslashes(const LogString& name);

protected:
void activateOptionsInternal(LOG4CXX_NS::helpers::Pool& p);
void activateOptionsInternal(helpers::Pool& p);

/**
Sets and <i>opens</i> the file where the log output will
Expand All @@ -243,7 +243,7 @@ class LOG4CXX_EXPORT FileAppender : public WriterAppender
*/
void setFileInternal(const LogString& file, bool append,
bool bufferedIO, size_t bufferSize,
LOG4CXX_NS::helpers::Pool& p);
helpers::Pool& p);

void setFileInternal(const LogString& file);

Expand Down
10 changes: 8 additions & 2 deletions src/main/include/log4cxx/helpers/outputstreamwriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@
#include <log4cxx/helpers/outputstream.h>
#include <log4cxx/helpers/charsetencoder.h>

#if 15 < LOG4CXX_ABI_VERSION
#define LOG4CXX_16_CONST const
#else
#define LOG4CXX_16_CONST
#endif

namespace LOG4CXX_NS
{

Expand All @@ -43,8 +49,8 @@ class LOG4CXX_EXPORT OutputStreamWriter : public Writer
LOG4CXX_CAST_ENTRY_CHAIN(Writer)
END_LOG4CXX_CAST_MAP()

OutputStreamWriter(OutputStreamPtr& out);
OutputStreamWriter(OutputStreamPtr& out, CharsetEncoderPtr& enc);
OutputStreamWriter(LOG4CXX_16_CONST OutputStreamPtr& out);
OutputStreamWriter(LOG4CXX_16_CONST OutputStreamPtr& out, LOG4CXX_16_CONST CharsetEncoderPtr& enc);
~OutputStreamWriter();

void close(Pool& p) override;
Expand Down
23 changes: 5 additions & 18 deletions src/main/include/log4cxx/private/writerappender_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,24 +42,11 @@ struct WriterAppender::WriterAppenderPriv : public AppenderSkeleton::AppenderSke
{
}

WriterAppenderPriv(const LayoutPtr& layout1,
LOG4CXX_NS::helpers::WriterPtr& writer1) :
AppenderSkeletonPrivate(layout1),
immediateFlush(true),
writer(writer1)
#if LOG4CXX_EVENTS_AT_EXIT
, atExitRegistryRaii{ [this]{flush();} }
#endif
{
}

WriterAppenderPriv(const LayoutPtr& layout1) :
AppenderSkeletonPrivate(layout1),
immediateFlush(true)
#if LOG4CXX_EVENTS_AT_EXIT
, atExitRegistryRaii{ [this]{flush();} }
#endif
WriterAppenderPriv(const LayoutPtr& layout1, const helpers::WriterPtr& writer1 = helpers::WriterPtr())
: WriterAppenderPriv()
{
this->layout = layout1;
this->writer = writer1;
}

void flush()
Expand Down Expand Up @@ -94,7 +81,7 @@ struct WriterAppender::WriterAppenderPriv : public AppenderSkeleton::AppenderSke
/**
* This is the {@link Writer Writer} where we will write to.
*/
LOG4CXX_NS::helpers::WriterPtr writer;
helpers::WriterPtr writer;

#if LOG4CXX_EVENTS_AT_EXIT
helpers::AtExitRegistry::Raii atExitRegistryRaii;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class LOG4CXX_EXPORT MultiprocessRollingFileAppender : public RollingFileAppende
@param os output stream, may not be null.
@return new writer.
*/
helpers::WriterPtr createWriter(helpers::OutputStreamPtr& os) override;
helpers::WriterPtr createWriter(LOG4CXX_16_CONST helpers::OutputStreamPtr& os) override;

private:
/**
Expand Down
2 changes: 1 addition & 1 deletion src/main/include/log4cxx/rolling/rollingfileappender.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ class LOG4CXX_EXPORT RollingFileAppender : public FileAppender
@param os output stream, may not be null.
@return new writer.
*/
helpers::WriterPtr createWriter(helpers::OutputStreamPtr& os) override;
helpers::WriterPtr createWriter(LOG4CXX_16_CONST helpers::OutputStreamPtr& os) override;

public:
/**
Expand Down
26 changes: 12 additions & 14 deletions src/main/include/log4cxx/writerappender.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,6 @@
namespace LOG4CXX_NS
{

namespace helpers
{
class Transcoder;
}

/**
WriterAppender appends log events to a standard output stream
*/
Expand All @@ -48,9 +43,12 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
This default constructor does nothing.*/
WriterAppender();
protected:
WriterAppender(const LayoutPtr& layout,
LOG4CXX_NS::helpers::WriterPtr& writer);
#if LOG4CXX_ABI_VERSION <= 15
WriterAppender(const LayoutPtr& layout, helpers::WriterPtr& writer);
WriterAppender(const LayoutPtr& layout);
#else
WriterAppender(const LayoutPtr& layout, const helpers::WriterPtr& writer = helpers::WriterPtr());
#endif
WriterAppender(std::unique_ptr<WriterAppenderPriv> priv);

public:
Expand Down Expand Up @@ -128,7 +126,7 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
<code>encoding</code> property. If the encoding value is
specified incorrectly the writer will be opened using the default
system encoding (an error message will be printed to the loglog. */
virtual helpers::WriterPtr createWriter(helpers::OutputStreamPtr& os);
virtual helpers::WriterPtr createWriter(LOG4CXX_16_CONST helpers::OutputStreamPtr& os);

public:
/**
Expand Down Expand Up @@ -165,33 +163,33 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton

@param writer An already opened Writer.
*/
void setWriter(const LOG4CXX_NS::helpers::WriterPtr& writer);
void setWriter(const helpers::WriterPtr& writer);

const LOG4CXX_NS::helpers::WriterPtr getWriter() const;
const helpers::WriterPtr getWriter() const;

bool requiresLayout() const override;

protected:
/**
Actual writing occurs here.
*/
virtual void subAppend(const spi::LoggingEventPtr& event, LOG4CXX_NS::helpers::Pool& p);
virtual void subAppend(const spi::LoggingEventPtr& event, helpers::Pool& p);


/**
Write a footer as produced by the embedded layout's
Layout#appendFooter method. */
virtual void writeFooter(LOG4CXX_NS::helpers::Pool& p);
virtual void writeFooter(helpers::Pool& p);

/**
Write a header as produced by the embedded layout's
Layout#appendHeader method. */
virtual void writeHeader(LOG4CXX_NS::helpers::Pool& p);
virtual void writeHeader(helpers::Pool& p);

/**
* Set the writer. Mutex must already be held.
*/
void setWriterInternal(const LOG4CXX_NS::helpers::WriterPtr& writer);
void setWriterInternal(const helpers::WriterPtr& writer);

private:
//
Expand Down