Well, I cant speak for the entire test suite, but we having been running
log4net in production on dotnet core since it was released and my ELK stack
seems to be getting lots of logs :) I'll reach out to Nick at SE and see if
he can expound upon his previous message.

On Thu, May 10, 2018 at 5:55 PM, Dominik Psenner <dpsen...@gmail.com> wrote:

> Interesting discussion in that pull request, yet it's missing links to hard
> facts what these functionalities, new features, smaller install area, no
> downsides etc actually are. Have you links to that information?
>
> I've said numerous times now that we don't even run the test suite against
> netstandard-1.3. It's no point to add netstandard-2.0 if we don't even know
> whether netstandard-1.3 actually works. And there's an issue somewhere -
> sorry, no link at the moment - that appears to be a regression related to
> that target.
>
> 2018-05-10 23:09 GMT+02:00 William Davis <william.j.dav...@gmail.com>:
>
> > Not a bad conversation to have. I would direct you to read this PR from
> the
> > SE.Redis library where I argued against netstandard 2.0 inclusion at one
> > point.
> > https://github.com/StackExchange/StackExchange.Redis/pull/767
> >
> > It would probably be worth while to provide explicit support for it.
> (with
> > out any additional effort)
> >
> > On Thu, May 10, 2018 at 2:42 PM, Dominik Psenner <dpsen...@gmail.com>
> > wrote:
> >
> > > Sure. This will however block by itself and take care of preserving
> > > compatibility with the ancient frameworks. With this mentioned, today
> > might
> > > be a good day to start a poll on what frameworks log4net should
> continue
> > to
> > > support. In the last days I once more spent numerous hours with the
> build
> > > infrastructure and am fed up by the insane build process caused by the
> > > numerous supported frameworks. If we focus on netstandard-1.3 as the
> base
> > > framework almost every recent framework can reference log4net. There
> was
> > > also a proposal to support netstandard-2.0 but thinking about it I see
> no
> > > reason to add another framework if we do not need any of the apis that
> > the
> > > framework provides. If we need netstandard-2.0 functionality we might
> as
> > > well provide that functionality as a separate nuget library. Yes,
> > splitting
> > > up log4net into several smaller assemblies sounds like a plan to me.
> > >
> > > 2018-05-10 18:00 GMT+02:00 William Davis <william.j.dav...@gmail.com>:
> > >
> > > > Perhaps, but looking at that implementation I see that it is locking
> > in a
> > > > few places on append. Could this be made a little better by using
> built
> > > in
> > > > ConcurrentCollection types like the ConcurrentQueue?
> > > >
> > > > On Thu, May 10, 2018 at 1:23 AM, Dominik Psenner <dpsen...@gmail.com
> >
> > > > wrote:
> > > >
> > > > > This proposal sounds like the bufferingforwardingappender.
> > > > >
> > > > > On Thu, 10 May 2018, 04:48 William Davis, <
> > william.j.dav...@gmail.com>
> > > > > wrote:
> > > > >
> > > > > > Agreed, this is what ill be submitting next.
> > > > > >
> > > > > > On Wed, May 9, 2018, 9:47 PM Remko Popma <remko.po...@gmail.com>
> > > > wrote:
> > > > > >
> > > > > > > Perhaps a reasonable approach would be to work like log4j‘s
> > > > > > AsyncAppender:
> > > > > > >
> > > > > > > This is a class that implements the appender interface by
> simply
> > > > adding
> > > > > > > log events to a ConcurrentQueue and returning immediately. When
> > > this
> > > > > > > appender is started it starts a background thread that blocks
> > until
> > > > > > events
> > > > > > > become available in the queue. When the queue contains an
> event,
> > > the
> > > > > > > background thread pops it off the queue and appends it to one
> or
> > > more
> > > > > > > underlying appenders.
> > > > > > >
> > > > > > > Note that on the producer (application) side, this looks like
> any
> > > > other
> > > > > > > appender. The consumer side (the background thread) is likely
> > where
> > > > the
> > > > > > > async/await api would be used.
> > > > > > >
> > > > > > > An AsyncAppender must be configured with one or more underlying
> > > > > > appenders.
> > > > > > > (In log4j these appenders must precede the AsyncAppender in the
> > > > > > > configuration so the list of underlying appenders can be
> > > immutable).
> > > > > > >
> > > > > > > Hope this helps,
> > > > > > > Remko
> > > > > > >
> > > > > > > (Shameless plug) Every java main() method deserves
> > > > http://picocli.info
> > > > > > >
> > > > > > > > On May 10, 2018, at 4:04, Matt Sicker <boa...@gmail.com>
> > wrote:
> > > > > > > >
> > > > > > > > One resource I have about fibers is this Java library:
> > > > > > > > https://github.com/puniverse/quasar
> > > > > > > >
> > > > > > > > And the future Java feature: http://openjdk.java.net/
> > > > projects/loom/
> > > > > > > >
> > > > > > > > As for continuations, if you're familiar with functional
> > > > programming,
> > > > > > are
> > > > > > > > essentially deferred functions to be executed along with any
> > > > curried
> > > > > > > state.
> > > > > > > > It essentially allows you to pause a computation, but you
> can't
> > > use
> > > > > > > things
> > > > > > > > like locks and notifications since those are implemented via
> > > > threads,
> > > > > > and
> > > > > > > > fibers don't get their own execution context like threads do
> > > (hence
> > > > > why
> > > > > > > > they're much faster where applicable due to less context
> > > switching
> > > > > and
> > > > > > > data
> > > > > > > > copying needed).
> > > > > > > >
> > > > > > > >
> > > > > > > >> On 9 May 2018 at 13:41, Dominik Psenner <dpsen...@gmail.com
> >
> > > > wrote:
> > > > > > > >>
> > > > > > > >> Btw, here is an example of async file io, note that this is
> a
> > > wpf
> > > > > > client
> > > > > > > >> application that stays responsive even though there is a
> > > > "blocking"
> > > > > > > await
> > > > > > > >> in the button handler:
> > > > > > > >>
> > > > > > > >>
> > > > > > >
> > > > > > https://docs.microsoft.com/en-us/dotnet/standard/io/
> > > > > asynchronous-file-i-o
> > > > > > > >>
> > > > > > > >> and here is an example of async network io which also
> explains
> > > > more
> > > > > > > >> in-depth details of how it works:
> > > > > > > >>
> > > > > > > >> https://docs.microsoft.com/en-us/dotnet/csharp/programming-
> > > > > > > >> guide/concepts/async/
> > > > > > > >>
> > > > > > > >> As a starting point it surely takes time to grasp and caused
> > me
> > > > some
> > > > > > > >> headache. :-)
> > > > > > > >>
> > > > > > > >> 2018-05-09 20:33 GMT+02:00 Dominik Psenner <
> > dpsen...@gmail.com
> > > >:
> > > > > > > >>
> > > > > > > >>> I don't know about fibers or continuations but am
> interested.
> > > Can
> > > > > you
> > > > > > > >>> provide me with some link?
> > > > > > > >>>
> > > > > > > >>> AFAIK, LMAX disruptor intelligently uses hot spins on the
> cpu
> > > > where
> > > > > > it
> > > > > > > >>> estimates that hot spinning pays off because an async
> > operation
> > > > > will
> > > > > > > >> finish
> > > > > > > >>> soon. When this is not the case after a few hot spins it
> will
> > > > yield
> > > > > > and
> > > > > > > >>> cause a context switch. When I read this up I quickly came
> to
> > > the
> > > > > > > >>> conclusion that such a way makes it very hard to implement
> > > > > something
> > > > > > > >> that's
> > > > > > > >>> reliably fast and stable at the same time.
> > > > > > > >>>
> > > > > > > >>> I can't provide the following with backup information, but
> as
> > > far
> > > > > as
> > > > > > I
> > > > > > > >>> understood the async/await approach it works so well
> because
> > > the
> > > > > > > hardware
> > > > > > > >>> provides interrupts to the operating system when data
> arrives
> > > > which
> > > > > > in
> > > > > > > >> turn
> > > > > > > >>> is published to an application via events. As noticed
> > earlier,
> > > > > libuv
> > > > > > > is a
> > > > > > > >>> cross platform library that provides these event api's to
> an
> > > > > > > application.
> > > > > > > >>> In the dotnet world since the invention of Task and
> > > async/await a
> > > > > > libuv
> > > > > > > >> has
> > > > > > > >>> mostly become futile. The kestrel web server, as far as I
> > know,
> > > > > uses
> > > > > > > >> libuv
> > > > > > > >>> under the hoods and is used by some microsoft devs as
> > > playground
> > > > to
> > > > > > > >>> improve the performance of implementations of the async
> api's
> > > > > > provided
> > > > > > > by
> > > > > > > >>> netstandard. Future versions of asp.netcore will probably
> no
> > > > longer
> > > > > > > >> feature
> > > > > > > >>> the kestrel webserver with libuv transports but transports
> > that
> > > > are
> > > > > > > based
> > > > > > > >>> upon .netstandard System.Net.Sockets.
> > > > > > > >>>
> > > > > > > >>> 2018-05-09 20:17 GMT+02:00 Matt Sicker <boa...@gmail.com>:
> > > > > > > >>>
> > > > > > > >>>> I'm not too familiar with how it's implemented, but that
> > > sounds
> > > > > > > similar
> > > > > > > >> to
> > > > > > > >>>> the problems that LMAX was fixing in lock-free queues. The
> > > > problem
> > > > > > > with
> > > > > > > >>>> typical async/await is lock contention which is addressed
> > in a
> > > > > lower
> > > > > > > >> level
> > > > > > > >>>> fashion in disruptor queues. I think this would all be far
> > > > easier
> > > > > > with
> > > > > > > >>>> something like fibers or continuations, but I didn't
> design
> > > > Java.
> > > > > :)
> > > > > > > >>>>
> > > > > > > >>>>> On 9 May 2018 at 13:09, Dominik Psenner <
> > dpsen...@gmail.com>
> > > > > > wrote:
> > > > > > > >>>>>
> > > > > > > >>>>> Disclaimer: so far I never had to use a library like LMAX
> > > > > > disruptor.
> > > > > > > >>>> After
> > > > > > > >>>>> a lot of brain that I spent into the new async/await
> > approach
> > > > > > that's
> > > > > > > >>>>> available today I even think that a truely high
> performance
> > > > .net
> > > > > > > >>>>> application has no need for such library. The following
> > > > hopefully
> > > > > > > >>>> explains
> > > > > > > >>>>> the why's.
> > > > > > > >>>>>
> > > > > > > >>>>> To me there are mainly two aspects of asynch operations.
> > One
> > > is
> > > > > the
> > > > > > > >>>> asynch
> > > > > > > >>>>> nature of multithreading where computational expensive
> > > > operations
> > > > > > are
> > > > > > > >>>>> offloaded to background threads. The other is async io
> > which
> > > > > allows
> > > > > > > >> the
> > > > > > > >>>> cpu
> > > > > > > >>>>> to continue doing other tasks when the, compared to the
> cpu
> > > > > cycling
> > > > > > > on
> > > > > > > >>>> its
> > > > > > > >>>>> calculations, veeeery slooooow io like networking is
> > > involved.
> > > > > > > >>>>>
> > > > > > > >>>>> Asyc/await with tasks provides, from an api point of
> view,
> > > > both.
> > > > > > > >>>>> Traditionally an io operation would either block the cpu
> > > while
> > > > > > > waiting
> > > > > > > >>>> for
> > > > > > > >>>>> the io to complete or be buffered/offloaded to a
> background
> > > > > thread
> > > > > > > and
> > > > > > > >>>>> finished there. The downside of such an approach is that
> > this
> > > > > > > involves
> > > > > > > >>>>> cross thread synchronization points. The actual problem
> we
> > > need
> > > > > to
> > > > > > > >>>> solve is
> > > > > > > >>>>> that we do want the cpu to wait for the slow io. This is
> > > where
> > > > > the
> > > > > > > >>>>> async/await comes into play. async/await allows the io
> > > > operation
> > > > > to
> > > > > > > >>>> start
> > > > > > > >>>>> and the cpu to continue its task. When the async io is
> > > complete
> > > > > an
> > > > > > > >> event
> > > > > > > >>>>> fired by the io will trigger the cpu to continue its work
> > on
> > > a
> > > > > > > >>>>> synchronization point that is chosen with an await. While
> > > this
> > > > > > works
> > > > > > > >>>> best
> > > > > > > >>>>> with io, it also works with cpu intensive tasks that need
> > to
> > > be
> > > > > run
> > > > > > > on
> > > > > > > >>>>> background threads. But using this for computational
> > > expensive
> > > > > cpu
> > > > > > > >> tasks
> > > > > > > >>>>> only pays off it the costs of synchronization and context
> > > > > switches
> > > > > > is
> > > > > > > >>>>> insignificant with respect to the actual task.
> > > > > > > >>>>>
> > > > > > > >>>>> This said, if an appender involves IO, a client
> application
> > > > could
> > > > > > > >>>>> ultimately choose to either fire and forget, wait for the
> > io
> > > or
> > > > > > > >> continue
> > > > > > > >>>>> and synchronize later if we provided an async api. This
> > > however
> > > > > > > >>>> requires us
> > > > > > > >>>>> to provide both a "normal" api and an async api. But
> doing
> > so
> > > > > > rewards
> > > > > > > >>>> with
> > > > > > > >>>>> a truely async io.
> > > > > > > >>>>>
> > > > > > > >>>>> Note that this is something what nginx makes heavy use
> of.
> > > > libuv
> > > > > > is a
> > > > > > > >>>>> library that provides a few aspects of io as an event
> based
> > > > api.
> > > > > > > >>>>>
> > > > > > > >>>>>> On Wed, 9 May 2018, 16:56 Matt Sicker, <
> boa...@gmail.com>
> > > > > wrote:
> > > > > > > >>>>>>
> > > > > > > >>>>>> I'd be interesting in hearing about high performant .NET
> > > > > > > >> applications
> > > > > > > >>>>> that
> > > > > > > >>>>>> would necessitate the creation of libraries like LMAX
> > > > Disruptor.
> > > > > > > >>>> AFAIK,
> > > > > > > >>>>>> that's generally a C++ and Java world.
> > > > > > > >>>>>>
> > > > > > > >>>>>>> On 9 May 2018 at 08:47, Remko Popma <
> > remko.po...@gmail.com
> > > >
> > > > > > wrote:
> > > > > > > >>>>>>>
> > > > > > > >>>>>>> In the log4j world, async logging means adding the
> > > > information
> > > > > to
> > > > > > > >> be
> > > > > > > >>>>>>> logged to some data structure, whereupon the
> application
> > > > thread
> > > > > > > >>>> returns
> > > > > > > >>>>>>> immediately to do other work.
> > > > > > > >>>>>>> In the background, another thread reads the information
> > to
> > > be
> > > > > > > >> logged
> > > > > > > >>>>> from
> > > > > > > >>>>>>> the data structure, potentially transforms it, then
> > renders
> > > > it
> > > > > to
> > > > > > > >>>> the
> > > > > > > >>>>>>> configured layout format and writes it to the
> configured
> > > > > > > >>>> appender(s).
> > > > > > > >>>>>>>
> > > > > > > >>>>>>> The data structure may be a standard queue, in which
> case
> > > the
> > > > > > > >>>>>> “information
> > > > > > > >>>>>>> to be logged” is often a LogEvent instance, or it could
> > be
> > > a
> > > > > data
> > > > > > > >>>>>> structure
> > > > > > > >>>>>>> that is optimized for non-blocking inter-thread
> > handovers,
> > > > like
> > > > > > > >> the
> > > > > > > >>>>> LMAX
> > > > > > > >>>>>>> Disruptor. I don’t know what the equivalent of the
> latter
> > > is
> > > > in
> > > > > > > >> the
> > > > > > > >>>>> .NET
> > > > > > > >>>>>>> world.
> > > > > > > >>>>>>>
> > > > > > > >>>>>>> It seems that concurrent queues in .net may use
> > Async/await
> > > > > under
> > > > > > > >>>> the
> > > > > > > >>>>>>> hood. (Based on what I see on SO, like
> > > > > > https://stackoverflow.com/
> > > > > > > >>>>>>> questions/7863573/awaitable-task-based-queue)
> > > > > > > >>>>>>>
> > > > > > > >>>>>>> Not sure if lock-free mechanisms like the lmax
> disruptor
> > > > exist.
> > > > > > Be
> > > > > > > >>>>> aware
> > > > > > > >>>>>>> that the background thread needs to employ some waiting
> > > > > strategy
> > > > > > > >>>> until
> > > > > > > >>>>>> work
> > > > > > > >>>>>>> arrives. The simplest thing is to use some block-notify
> > > > > > mechanism:
> > > > > > > >>>> the
> > > > > > > >>>>>>> background thread is suspended and woken up by the
> > > operating
> > > > > > > >> system
> > > > > > > >>>>> when
> > > > > > > >>>>>>> notified. I assume this is what async/await uses. To be
> > > > > > completely
> > > > > > > >>>>>>> lock-free, an alternative wait strategy is to busy-spin
> > but
> > > > > this
> > > > > > > >>>> means
> > > > > > > >>>>>>> dedicating a core to logging which is a hefty price. In
> > the
> > > > > > > >>>> disruptor
> > > > > > > >>>>>> this
> > > > > > > >>>>>>> is configurable so if log4j users really want to they
> can
> > > > have
> > > > > > > >>>>> lock-free
> > > > > > > >>>>>>> logging in return for dedicating a cpu core. You may
> not
> > > want
> > > > > or
> > > > > > > >>>> need
> > > > > > > >>>>> to
> > > > > > > >>>>>> go
> > > > > > > >>>>>>> that far.
> > > > > > > >>>>>>>
> > > > > > > >>>>>>> Remko
> > > > > > > >>>>>>>
> > > > > > > >>>>>>> (Shameless plug) Every java main() method deserves
> > > > > > > >>>> http://picocli.info
> > > > > > > >>>>>>>
> > > > > > > >>>>>>>> On May 9, 2018, at 22:06, Dominik Psenner <
> > > > dpsen...@gmail.com
> > > > > >
> > > > > > > >>>>> wrote:
> > > > > > > >>>>>>>>
> > > > > > > >>>>>>>> When implementing the async/await paradigm it would
> have
> > > to
> > > > be
> > > > > > > >>>>> provided
> > > > > > > >>>>>>> as a logging event api and continuously invoked with
> > async
> > > > down
> > > > > > to
> > > > > > > >>>> the
> > > > > > > >>>>>>> appender implementations in order for the application
> > code
> > > to
> > > > > > > >>>> benefit
> > > > > > > >>>>>> from
> > > > > > > >>>>>>> true async behavior. Or am I wrong here?
> > > > > > > >>>>>>>>
> > > > > > > >>>>>>>>
> > > > > > > >>>>>>>>> On 2018-05-09 13:48, William Davis wrote:
> > > > > > > >>>>>>>>> Jochen, I dont believe that appender has been ported
> to
> > > > > > > >> Log4Net.
> > > > > > > >>>>> Maybe
> > > > > > > >>>>>>>>> thats what we should do first? Im sure there are
> other
> > > uses
> > > > > > > >> cases
> > > > > > > >>>>> out
> > > > > > > >>>>>>> there
> > > > > > > >>>>>>>>> though, which is why we've seen several people roll
> > async
> > > > > > > >>>> appenders
> > > > > > > >>>>> in
> > > > > > > >>>>>>> the
> > > > > > > >>>>>>>>> first place (although it could be a fundamental lack
> of
> > > > > > > >>>>> understanding)
> > > > > > > >>>>>>>>>
> > > > > > > >>>>>>>>> On Wed, May 9, 2018 at 7:00 AM, Jochen Wiedmann <
> > > > > > > >>>>>>> jochen.wiedm...@gmail.com>
> > > > > > > >>>>>>>>> wrote:
> > > > > > > >>>>>>>>>
> > > > > > > >>>>>>>>>> On Mon, May 7, 2018 at 2:15 PM William Davis <
> > > > > > > >>>>>>> william.j.dav...@gmail.com>
> > > > > > > >>>>>>>>>> wrote:
> > > > > > > >>>>>>>>>>
> > > > > > > >>>>>>>>>>> I've noticed that there are several Async
> > > implementations
> > > > > of
> > > > > > > >>>>>> standard
> > > > > > > >>>>>>>>>>> appenders out in the wild. Is there a reason none
> of
> > > > these
> > > > > > > >> have
> > > > > > > >>>>> made
> > > > > > > >>>>>>>>>> there
> > > > > > > >>>>>>>>>>> way into the core product? Is it just b/c no one
> has
> > > > taken
> > > > > > > >> the
> > > > > > > >>>>> time
> > > > > > > >>>>>>> to do
> > > > > > > >>>>>>>>>> a
> > > > > > > >>>>>>>>>>> pull request, or is there some other reason?
> > > > > > > >>>>>>>>>> I wonder, why one would create a special async
> > version,
> > > > when
> > > > > > > >> all
> > > > > > > >>>>> you
> > > > > > > >>>>>>> need
> > > > > > > >>>>>>>>>> to do is to put a standard async logger in front of
> > the
> > > > sync
> > > > > > > >>>> logger
> > > > > > > >>>>>>> [1]?
> > > > > > > >>>>>>>>>>
> > > > > > > >>>>>>>>>> Jochen
> > > > > > > >>>>>>>>>>
> > > > > > > >>>>>>>>>> 1: https://logging.apache.org/
> > > > log4j/2.x/manual/async.html#
> > > > > > > >>>>>>> MixedSync-Async
> > > > > > > >>>>>>>>>>
> > > > > > > >>>>>>>>
> > > > > > > >>>>>>>
> > > > > > > >>>>>>
> > > > > > > >>>>>>
> > > > > > > >>>>>>
> > > > > > > >>>>>> --
> > > > > > > >>>>>> Matt Sicker <boa...@gmail.com>
> > > > > > > >>>>>>
> > > > > > > >>>>>
> > > > > > > >>>>
> > > > > > > >>>>
> > > > > > > >>>>
> > > > > > > >>>> --
> > > > > > > >>>> Matt Sicker <boa...@gmail.com>
> > > > > > > >>>>
> > > > > > > >>>
> > > > > > > >>>
> > > > > > > >>>
> > > > > > > >>> --
> > > > > > > >>> Dominik Psenner
> > > > > > > >>>
> > > > > > > >>
> > > > > > > >>
> > > > > > > >>
> > > > > > > >> --
> > > > > > > >> Dominik Psenner
> > > > > > > >>
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > --
> > > > > > > > Matt Sicker <boa...@gmail.com>
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> > >
> > >
> > > --
> > > Dominik Psenner
> > >
> >
>
>
>
> --
> Dominik Psenner
>

Reply via email to