[just changing the subject :-)]
On 2013-08-12, Dominik Psenner wrote:
> Yesterday it became quite late and I had not the mental force to write down
> my vision of the RFA reimplementation:
> The log filename should be determined dynamically to allow users including
> information like %date, %time in the filename. It has often been requested
> and up to now it is supported only marginally.
> Another issue that I just remembered now is that currently there's no way to
> roll empty files on date/time boundaries. Rolling only happens when a log
> event is generated. If there's no log event, files won't be rolled. Thus we
> should investigate if we should implement the appender as a buffering async
> appender that does the rolling in his async work cycles and whose work
> cycles do not depend on the availability of log events.
> Futher, the rolling file appender should probably receive a persistent
> storage where he can keep a set of rolled files he has rolled in the past.
> This way we eliminate the dark magic behind detecting rolled files. It
> allows the user also to modify or mix the rolling strategies and/or rolling
> filename configuration from one instance to the next. The persistence will
> have to include a set of filenames. It would probably be nice to allow
> people configuring a relative filepath that will be stripped from the
> filenames. Otherwise we would break the usecase where a user moves an
> application from, let's say, drive C: to drive D: along with all logfiles
> because the rolled filenames would no longer be found and some files would
> become zombies that pollute the drive. Thus a persistable rolling history
> class could look alike:
> Public class RollingHistory {
> Public List<string> Files { get; }
> To exchange information between the rolling strategies, rolling conditions
> and the rolling file appender itself we should probably use a data class.
> The name of it could be "RollingContext" and basically could be implemented
> like:
> public class RollingContext {
> public RollingHistory RollingHistory { get; }
> public string Logfile { get; }
> public long CurrentLogfileSize { get; }
> That means that a rolling strategy could be an interface like:
> public interface RollingStrategy {
> public void DoRolling(RollingContext context);
> which either throws exceptions on failure or returns true|false to notify
> the caller that something went wrong and log the errors into the log4net
> internal debug log.
> The next topic is the rolling condition. The rolling condition decides if
> rolling should be done right now. Thus its interface should be something
> like:
> public interface IRollingCondition {
> public bool IsRollingConditionMet(RollingContext context);
> Concrete rolling conditions could be:
> * Roll if filesize exceeds a specific limit
> * Roll if a specific date/time condition is met
> ==> this is already kind of supported with an implementation of a
> "cron"-like syntax
> Making the rolling condition pluggable would greatly benefit others to
> invent their own rolling conditions. For example an implementation of
> IRollingCondition like:
> public class ManualRollingCondition implements IRollingCondition {
> public static bool RollOnNextCycle = false;
> public bool IsRollingConditionMet(RollingContext context) {
> if(RollOnNextCycle) {
> // reset roll on next cycle
> RollOnNextCycle = false;
> return true;
> }
> return false;
> could let the application that uses log4net decide when a file should be
> rolled by a simple invoke to:
> ManualRollingCondition.RollOnNextCycle=true;
> And now we come to the disposal of old files. Since we have a persistent set
> of old files we should pass it into the disposing logic and the interface to
> it could look like:
> Public interface IDisposeStrategy {
> Public bool DoDisposal(RollingContext context);
> And a concrete implementation of it could be:
> Public class LimitNumberOfFilesDisposeStrategy implements IDisposeStrategy {
> Public int MaxNumberOfFiles { get; set; }
> Public bool DoDisposal(RollingContext context) {
> // delete all files in history
> While(MaxNumberOfFiles < Context.RollingHistory.Count) {
> If(Context.RollingHistory.Count == 0)
> Return true;
> // delete oldest file and persist the history
> // let it crash if someone has a logfile open and locked
> // and let the invoker decide if he wants to retry later
> Try {
> Delete(Context.RollingHistory.Oldest());
> Context.RollingHistory.Remove(Context.RollingHistory.Oldest());
> Context.RollingHistory.Persist();
> }
> Catch
> // internal logging
> Return false;
> }
> Return true;
> }
> Some of the ideas above are already implemented in the patch, but there are
> several things that are not yet finished.
> Von: Dominik Psenner [mailto:[email protected]]
> Gesendet: Sonntag, 11. August 2013 22:59
> An: Log4NET Dev
> Betreff: Re: Creating a development environment for resolving LOG4NET-367
> This is something that wouldn't work right now:
> <appender>
> <rollingfileappender>
> <filename>C:/fancydirectory/%processid/%username/%year/%month/mylogfile.log<
> /filename>
> <locking>inter-process</locking>
> <rollOn><date where="hour%3==0" /></rollOn>
> <rollTo>C:/fancydirectory/%processid/%username/%year/%month/%filenumber/mylo
> gfile.log</rollTo>
> <dispose><files where="filenumber > 50" /></dispose>
> </rollingfileappender>
> </appender>
> but we want it to work in the future. Of couse the syntax may be different,
> but it should be easy enough to write down how the RFA has to behave. Right
> now there are too many fancy flicks and switches that do things magically.
> Cheers
> 2013/8/11 Dominik Psenner <[email protected] <mailto:[email protected]> >
> See the inlines..
> 2013/8/10 d_k <[email protected] <mailto:[email protected]> >
> Paperizing ideas sounds good. How does the log4net project handle
> requirements? JIRA?
> Yes
> Are there any requirements other than the ones under the 'supercedes' list?
> Yes and no. It should be a rolling file appender that handles things smarter
> than the current one. If there are ideas they are welcome.
> It should roll files (obvious) on "rolling conditions" with a "rolling
> strategy" and dispose old files with a "dispose strategy".
> The rolling condition, rolling strategy and dispose strategy should be
> pluggable and configurable (i.e. they are interfaces that can be implemented
> in different ways).
> It should support dynamic filenames that may change over time
> It should support changes to the rolling strategy in respect of disposal of
> old files (i.e. between process instances).
> It should support all currently supported locking strategies.
> For now I can't think of more.
> I'm afraid I don't have a 'vision' for the RFA-NG but I think we can take
> the patch under log4net-patches, make sure to fix the 'supercedes' list and
> off we go.
> I wouldn't want to spend time on a grand design because we can't tell how
> long will it take, and I think it is better to ship a less than perfect
> RFA-NG and fix it later on when we'll know what we want than to postpone the
> next release indefinitely.
> We have a RFA that does not what we want. We don't need another one. If we
> reimplement it now and release it, we have another RFA with a public api we
> do not want to change - sounds familiar.
> BTW, no offense, but is there a chance it will be easier to fix the current
> RFA than to rewrite it?
> There are things that are unfixable with the current implementation without
> breaking the public API and that's something we dont want.
> Is there a way to measure a given implementation of any RFA to determine if
> its good enough?
> It's good enough when it boils eggs and toast my bread .. just joking. ;-)
> It's good enough when it does what we want from it.
> On Fri, Aug 9, 2013 at 8:00 PM, Dominik Psenner <[email protected]
> <mailto:[email protected]> > wrote:
> Howdie,
> the patch there is mainly a first implementation showing the road we would
> like to go. There are many things to be discussed and I would start with
> paperizing the ideas before starting the implementation. The
> reimplementation should solve all known current issues of the rolling file
> appender.
> The patches repository is nothing else than a repository that holds patches
> that can be applied to the log4net source, which is located at apache.org
> <http://apache.org> 's svn. It's there to materialize the ideas without
> requiring write permissions to the actual svn and can be used as a sandbox
> to play with ideas.
> I started off with an implementation as a patch and wanted to improve that
> patch until it is stable enough to join the log4net appenders in svn.
> Cheers
> 2013/8/9 d_k <[email protected] <mailto:[email protected]> >
> Hi,
> So I think I got a working development environment for log4net.
> I installed mercurial and forked the log4net-crew repository
> (https://bitbucket.org/NachbarsLumpi/log4net-crew) and the log4net-patches
> repository (https://bitbucket.org/NachbarsLumpi/log4net-patches) and applied
> the RFA-NG patch with 'hg import'.
> Should I prefer to use http://svn.apache.org/viewvc/logging/log4net/trunk
> over https://bitbucket.org/NachbarsLumpi/log4net-crew? Will svn and
> mercurial coexist peacefully?
> Do I need anything else to start developing?
> Should I create my own RFA-NG2 patch? Or perhaps RFA-NG-NNN for each bug in
> the supercedes list of LOG4NET-367
> (https://issues.apache.org/jira/browse/LOG4NET-367)?
> Are there any common pitfalls I should avoid?