I guess I can. 90 lines isn't too big for an email, is it?
***** start code *****
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Writer;
import org.apache.logging.log4j.core.appender.FileAppender;
import org.apache.logging.log4j.status.StatusLogger;
public class LazyFileAppender extends FileAppender {
/**
* Override FileAppender.setFile to avoid creating an empty log file
before
* the code has a chance to customize the file name.
*/
public synchronized void setFile(String fileName, boolean append,
boolean bufferedIO, int bufferSize)
throws IOException {
StatusLogger.debug("setFile called: {}, {}", fileName, append);
if (this.qw != null) {
return;
}
// set a stdout writer just in case
reset();
Writer fw = createWriter(System.out);
this.setQWForFiles(fw);
this.fileName = fileName;
this.fileAppend = append;
this.bufferedIO = bufferedIO;
this.bufferSize = bufferSize;
StatusLogger.debug("setFile ended");
}
/**
* Calling this method will signal this class that the log file name
* has been configured and that the file can now be opened.
* @throws IOException
*/
public void fileNameConfigured() throws IOException {
StatusLogger.debug("fileNameConfigured called");
// It does not make sense to have immediate flush and bufferedIO.
if (this.bufferedIO) {
setImmediateFlush(false);
}
// Save file name since reset() sets it to null
String fileName = this.fileName;
// Set to null to prevent parent class from closing System.out
this.qw = null;
reset();
this.fileName = fileName;
FileOutputStream ostream = null;
try {
//
// attempt to create file
//
ostream = new FileOutputStream(this.fileName, this.fileAppend);
}
catch (FileNotFoundException ex) {
//
// if parent directory does not exist then
// attempt to create it and try to create file
// see bug 9150
//
String parentName = new File(this.fileName).getParent();
if (parentName != null) {
File parentDir = new File(parentName);
if (!parentDir.exists() && parentDir.mkdirs()) {
ostream = new FileOutputStream(this.fileName,
this.fileAppend);
}
else {
throw ex;
}
}
else {
throw ex;
}
}
Writer fw = createWriter(ostream);
if (this.bufferedIO) {
fw = new BufferedWriter(fw, this.bufferSize);
}
this.setQWForFiles(fw);
writeHeader();
StatusLogger.debug("fileNameConfigured ended");
}
}
***** end code *****
Joel
On Mon, Aug 15, 2022 at 11:33 AM Ralph Goers <[email protected]>
wrote:
> This is a problem. Log4j supports Lookups, which usually eliminate the
> need
> to override things like setFile since you can create a custom lookup to do
> whatever needs to be done.
>
> Is there any chance you can post the code so we can figure out what it
> does?
>
> Ralph
>
> > On Aug 15, 2022, at 8:21 AM, Joel Griffith <[email protected]> wrote:
> >
> > I don't know what the old appender does, in part because I'm not a good
> > enough programmer to interpret it, and in part because the bulk of what
> it
> > does is contained in the source code of the classes that it subclasses,
> and
> > I don't have that v1 source code.
> >
> > One thing I've figured out that it does is override the v1 FileAppender's
> > setFile() method. I've also figured out that the v2 FileAppender doesn't
> > have that method. So... I don't know what to do about that.
> >
> > Joel
> >
> > On Fri, Aug 12, 2022 at 7:18 PM Gary Gregory <[email protected]>
> wrote:
> >
> >> Joel,
> >>
> >> Is it possible to use Log4j 2's much richer feature set as is? Perhaps
> you
> >> could explain what is it your old appender does that requires custom
> code.
> >>
> >> Gary
> >>
> >> On Fri, Aug 12, 2022, 15:35 Joel Griffith <[email protected]> wrote:
> >>
> >>> I have a Java application containing a package written to use Log4j v1.
> >> I
> >>> am struggling to update this package to use Log4j v2 to remediate its
> >>> security vulnerabilities.
> >>>
> >>> The package contains a custom Appender that subclasses Log4j v1's
> >>> FileAppender. I am stumped at how to convert this file to Log4j v2.
> In
> >>> Log4j v2, the FileAppender class is 'final' and cannot be subclassed,
> so
> >> I
> >>> cannot create a new version of the custom Appender that mirrors the
> >> first.
> >>> More importantly, perhaps, is that the Log4j v2 FileAppender is a
> Plugin
> >>> and completely different in structure from the Log4j v1 FileAppender.
> >>>
> >>> I found this page that ostensibly explains how to extend Log4j:
> >>> https://logging.apache.org/log4j/2.x/manual/extending.html#Appenders
> >>> but it contains no information about actually extending Appenders or
> >>> procedures for accomplishing an equivalent goal.
> >>>
> >>> Is there any reasonable way of converting this custom Appender from
> Log4j
> >>> v1 to v2?
> >>>
> >>> Thanks,
> >>> Joel
> >>>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>