Too bad that Java lacks named parameters to methods and constructors (as
languages like Python and Scala have).

On Wed, Aug 12, 2015 at 3:32 AM, Ralph Goers <ralph.go...@dslextreme.com>
wrote:

> One of the principals Log4j 2 tries to follow is to create immutable
> objects as much as possible as it reduces issues with multi- threading.
> This means not having setter methods. So you are left with builders, or
> factory methods and/or constructors with a lot of parameters.
>
> Ralph
>
> > On Aug 11, 2015, at 2:27 PM, Xen <x...@dds.nl> wrote:
> >
> > Op 11-8-2015 om 21:07 schreef Gary Gregory:
> >> Some appenders use the builder patten, for example
> org.apache.logging.log4j.core.appender.ConsoleAppender.Builder. I'm not
> sure why this appender has both a builder and a create method. Does anyone?
> Gary
> >
> > Builders are nice, I guess. I don't really like that Builder thing from
> the Apache Commons but in general it is called a fluid API I believe. Heh,
> I just don't like "patterns" when I'm doing the exact same thing except as
> a creative endeavour and not something dry as a "pattern". There is a FSM
> (state machine) implementation/library that uses the fluid API very well
> and very nicely. I try to incorporate it into my own devices as well.
> >
> > Because you don't need to end a fluid API with "build" or .build(), the
> first method can initialize the construction and any other method just adds
> to the complex. Of course any mandatory parameters must be present in the
> first method call then and the rest is optional. I think a good constructor
> together with appender methods is a better choice:
> >
> > conf.addAppender(
> >    new org.apache.logging.log4j.core.appender.ConsoleAppender.Builder().
> >        setName("ConsoleOwn").setLayout(
> > org.apache.logging.log4j.core.layout.PatternLayout.createLayout(
> >               myPattern, conf, null,
> java.nio.charset.Charset.forName("UTF-8"),
> >               true, false, null, null)).build()
> > );
> >
> > would become
> >
> > conf.addAppender(
> >    new
> org.apache.logging.log4j.core.appender.ConsoleAppender("ConsoleOwn").setLayout(
> >            new
> org.apache.logging.log4j.core.layout.PatternLayout(conf).setPattern(myPattern).
> >               setCharSet(java.nio.charset.Charset.forName("UTF-8")
> >    )
> > );
> >
> > of course it would mean those methods remain available for changing the
> object and the cost is that default values are used and subsequently
> overwritten. Regardless, the Builder version seems to be nicer than the
> createXXXX version.
> >
> > But now I realise there is also a PatternLayout.Builder :D. I was even
> beginning to assume that I could offer to write one :P.
> >
> > Here it goes.
> >
> >        conf.addAppender(
> > org.apache.logging.log4j.core.appender.ConsoleAppender.newBuilder().
> >                setName("ConsoleOwn").
> >                setLayout(
> > org.apache.logging.log4j.core.layout.PatternLayout.newBuilder().
> >                        withPattern(myPattern).
> > withCharset(java.nio.charset.Charset.forName("UTF-8")).
> >                        withConfiguration(conf).
> >                        build()).
> >                build()
> >        );
> >
> > So thank you for the suggestion Gary. If you guys want any Builder
> written for any class in return, let me know. I'd be happy to contribute a
> class. In return, I guess.
> >
> > Just let me know which class would need a builder, and what the style of
> the methods should be (set or with).
> >
> > Regards, kudos.
> >
> > Bart.
> >
> >
> >>> - appenders need to be added twice
> >>> - if you create an appender with the same name it will not add it but
> give
> >>> no error
> >>> - various static methods from different classes do important things,
> but
> >>> it is not centralized.
> >>> - maybe there is too much static in any case, but yeah.
> >>>
> >>> JAnsi works. I'm doing stuff JAnsi does, and there is already an entire
> >>> package that does everything I would want or need to do :P. Go figure.
> Now
> >>> it is even included with my application just to make it work on
> Windows,
> >>> and I don't really want to use it with my default application ;-).
> (Maybe
> >>> I'll have to, given that). Ooh but it doesn't do input
> >>> processing/filtering, I might even use it. (My library parses ANSI
> tokens).
> >>>
> >>> Anyway to cut it short now, here is a screenshot of what I've been
> doing:
> >>>
> >>> http://www.xen.dds.nl/f/i/screenshots/thunderbolt-log4j-reward.png
> >>>
> >>> The first field is the thread in blue, there are three threads (thread
> >>> types): main, server and client. Every client thread gets numbered
> from a
> >>> pool that gets refilled when a thread exits (just a Set I take numbers
> out
> >>> of and I always take the first one (SortedSet/TreeSet)). After that is
> the
> >>> logger name. I don't name my loggers anymore by class but by subsystem.
> >>> Essentially, by package, I guess. There are only two packages /
> subsystems
> >>> at the moment that are being shown a third is called "telnet.file" and
> I
> >>> haven't tested it yet.
> >>>
> >>> It's just that my FileAppender doesn't yet work. However since it
> >>> "additives" from "telnet" it also outputs to the console:
> >>>
> >>>
> http://www.xen.dds.nl/f/i/screenshots/thunderbolt-log4j-reward2.smaller.png
> >>>
> >>> Fixed.
> >>>
> >>> So I have 3 loggerconfigs now:
> >>> - "server" --> outputs to root logger
> >>> - "telnet" --> outputs to root logger
> >>> - "telnet.file" --> additionally outputs to a log file.
> >>>
> >>> Regards, and enjoy :p.
> >>>
> >>> Bart.
> >>>
> >>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
> >>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
> > For additional commands, e-mail: log4j-user-h...@logging.apache.org
> >
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>
>


-- 
[image: MagineTV]

*Mikael Ståldal*
Senior backend developer

*Magine TV*
mikael.stal...@magine.com
Regeringsgatan 25  | 111 53 Stockholm, Sweden  |   www.magine.com

Privileged and/or Confidential Information may be contained in this
message. If you are not the addressee indicated in this message
(or responsible for delivery of the message to such a person), you may not
copy or deliver this message to anyone. In such case,
you should destroy this message and kindly notify the sender by reply
email.

Reply via email to