I thought CronTriggeringPolicy would handle this but it is based on Quartz’ CronExpression which doesn’t support randomizing fields. I was confused because Jenkins supports this and I had thought it was using Quartz. Apparently not.
Ralph > On Mar 24, 2017, at 10:15 AM, Anthony Maire <maire.anth...@gmail.com> wrote: > > Basically we are hosting distributed systems for our clients. So we have > several dozens of JVM per physical host, and several dozens of physical > hosts. Moreover some clients are sometimes moved from one machine to > another so having a single configuration file is a very huge requirement. > > Having the file that rolls precisely at midnight is a nice to have. Having > the rolling that happen a little later because of randomization can be > accepted if it solve the performance issue (which stay pretty short, it's > about 15 seconds during which we can experience a few hundreds of > milliseconds long stalls but this is already too much in our industry ) > > Randomization is a common technique for that kind of issue, used in > congestion avoidance in some network protocols for example (including > Ethernet ). Having 2 or 3 jvm that roll at the same time is not a big deal, > we have enough free cpu cycles for that. That's why randomization during a > few minutes seems OK to me : we don't need to annihilate collisions, > greatly reduce them is OK > > Basically I'm open to any solution as long as it can be deployed everywhere > without any OS/shell dependant trick and it does not involve any kind of > per JVM configuration. The patch I submitted is an option, but I'd be glad > to use another option that match these requirements. > > Regards, > Anthony > > > Le 24 mars 2017 15:20, "Remko Popma" <remko.po...@gmail.com> a écrit : > > Actually, there is already something like this because Log4j2 configuration > has some support for scripting. I would prefer to enhance that over > building conditional constructs in the configuration. > > However, having to specify the exact rollover time for individual servers > would result in a much more lengthy and involved configuration. > Randomization is a commonly used technique to get roughly the same result > without the inconvenience of precise configuration. I don't think it is > such a bad idea. > > Sent from my iPhone > >> On Mar 24, 2017, at 19:35, Dominik Psenner <dpsen...@apache.org> wrote: >> >> What if a configuration could contain conditional statements? For > instance: >> >> <Config> >> <Define EnvironmentVariable="Hour" Value="12" /> >> <Define EnvironmentVariable="Minute" Value="0" /> >> <If EnvironmentVariable="JVM" Equals="JVM1"> >> <Define EnvironmentVariable="Minute" Value="0" /> >> </If> >> <If EnvironmentVariable="JVM" Equals="JVM2"> >> <Define EnvironmentVariable="Minute" Value="1" /> >> </If> >> <RollingFileAppender> >> <RollingCondition> >> <Cron Minute="$Minute" Hour="$Hour" DayOfMonth="*" Month="*" > DayOfWeek="*" /> >> </RollingCondition> >> </RollingFileAppender> >> </Config> >> >> Cheers >> >>> On 2017-03-24 11:08, Remko Popma wrote: >>> I see what you are saying, but the use case is to have a single > configuration, that is what drives the request. >>> >>> Sent from my iPhone >>> >>>> On Mar 24, 2017, at 17:22, Dominik Psenner <dpsen...@apache.org> wrote: >>>> >>>> Hi there, >>>> >>>> Cron proved itself very to be stable and usable over the past years. > FWIW, I would not recommend to introduce a randomization algorithm. An > application that does things random means that the application does things > when nobody expects it to do so. Further it does not solve the problem. One > just needs enough JVMs to roll around at the same time with a randomizer > does not produce large enough values to spread the rolling over a larger > amount of time. The available CPU is then quickly drain out. In my opinion, > it's better to configure the several rollings to be delayed, meaning that > JVM1 rolls at 12:00, JVM2 rolls at 12:01, ... >>>> >>>> Cheers, Dominik >>>> >>>>> On 2017-03-23 15:04, Anthony Maire wrote: >>>>> https://issues.apache.org/jira/browse/LOG4J2-1855 >>>>> https://github.com/apache/logging-log4j2/pull/68 >>>>> >>>>> Let me know if you want me to do some changes >>>>> >>>>> Regards, >>>>> Anthony >>>>> >>>>> >>>>> 2017-03-23 13:15 GMT+01:00 Anthony Maire <maire.anth...@gmail.com>: >>>>> >>>>>> Ok, I will open a jira ticket and provide a PR. >>>>>> >>>>>> Thanks for your input. >>>>>> >>>>>> Le 23 mars 2017 13:08, "Remko Popma" <remko.po...@gmail.com> a écrit : >>>>>> >>>>>>> I see what you mean now. I agree it's better to keep the rollover > concept >>>>>>> to mean file rename and compression that happen in sequence > together. So >>>>>>> the randomization affects when the _sequence_ is triggered, not just > one >>>>>>> part of the sequence. Makes sense. >>>>>>> >>>>>>> Sent from my iPhone >>>>>>> >>>>>>>> On Mar 23, 2017, at 16:28, Anthony Maire <maire.anth...@gmail.com> >>>>>>> wrote: >>>>>>>> Hi Remko >>>>>>>> >>>>>>>> My first idea was to have the rolling that triggers at the expected >>>>>>> time, >>>>>>>> and the compression that will be delayed. That's why I wanted the >>>>>>> delayed >>>>>>>> compression to occur before shutdown since the rolling already > occurred. >>>>>>>> >>>>>>>> But I think that's a bad idea. First, it will lead to "fancy code" > and I >>>>>>>> would like to avoid it too. But the main issue is that this behavior >>>>>>> should >>>>>>>> impact only the time based triggering when combining several > policy. So >>>>>>> the >>>>>>>> code should be related to the triggering policy and not to the > rolling >>>>>>>> strategy. >>>>>>>> >>>>>>>> So the best thing to do is to add some property on the timed base >>>>>>>> triggering policy and let that class handle all the logic and delay > the >>>>>>>> triggering itself instead of the compression. >>>>>>>> >>>>>>>> Are you OK with that? >>>>>>>> >>>>>>>> Anthony >>>>>>>> >>>>>>>> Le 23 mars 2017 00:24, "Remko Popma" <remko.po...@gmail.com> a > écrit : >>>>>>>> >>>>>>>> >>>>>>>>> On Mar 23, 2017, at 1:06, Anthony Maire <maire.anth...@gmail.com> >>>>>>> wrote: >>>>>>>>> Thanks for these answers >>>>>>>>> >>>>>>>>> @Ralph : that was the kind of idea I had in mind : changing the >>>>>>>>> RollingFileManager.asyncExecutor to be a > ScheduledThreadPoolExecutor, >>>>>>> and >>>>>>>>> based on some configuration, submitting task to be executed after a >>>>>>> random >>>>>>>>> delay. However with this kind of approach, special treatment > should be >>>>>>>> made >>>>>>>>> if the manager is stopped with some pending delayed tasks in it. >>>>>>>> I'm okay with randomization except for this last bit about "special >>>>>>>> treatment...". Let's not make it too fancy. If the manager is > stopped >>>>>>>> before it rolled over, then it didn't roll over, just like it works >>>>>>>> currently. I don't see the point of adding extra logic to trigger a >>>>>>>> rollover when the manager is stopped within the randomized time > window. >>>>>>>> >>>>>>>>> @Matt : Cron policy can be a solution, but I don't know how to > inject >>>>>>> some >>>>>>>>> random element in this to make the file roll at midnight + X random >>>>>>>>> seconds. Since there is a lot of JVM to manage and some of them > can be >>>>>>>>> moved from a machine to another, I need to have a single log4j2.xml >>>>>>> file >>>>>>>>> for all environments. Moreover, our system administrators are >>>>>>> reluctant to >>>>>>>>> have something based on a shell-specific feature (such has the > $RANDOM >>>>>>>>> variable from bash) >>>>>>>>> >>>>>>>>> Anthony >>>>>>>>> >>>>>>>>> 2017-03-22 16:31 GMT+01:00 Ralph Goers <ralph.go...@dslextreme.com >> : >>>>>>>>> >>>>>>>>>> These are separate JVMs, so having a single executor would be of > no >>>>>>> help. >>>>>>>>>> I believe the only way to do what you are asking for is to add >>>>>>>>>> configuration so that the asynchronous thread has a semi-random > delay >>>>>>>> when >>>>>>>>>> it starts. >>>>>>>>>> >>>>>>>>>> Ralph >>>>>>>>>> >>>>>>>>>>> On Mar 22, 2017, at 7:58 AM, Greg Thomas <greg.d.tho...@gmail.com >> >>>>>>>>>> wrote: >>>>>>>>>>>> One common issue we have with that framework (and I assume we > can >>>>>>> have >>>>>>>>>> the >>>>>>>>>>>> same with log4j2) is that all of our JVMs (we can have more > than 50 >>>>>>>>>> JVMs on >>>>>>>>>>>> the same server in production) roll their file at midnight. >>>>>>>>>>>> >>>>>>>>>>>> When this happens, the system became often not usable for a few >>>>>>> seconds >>>>>>>>>>>> because of the simultaneous zipping of all the rolled files that >>>>>>>>>> overload >>>>>>>>>>>> the CPU (although zipping is done in a specific background > thread). >>>>>>>>>>> ISTR that with the most recent versions of log4j, these threads > are >>>>>>> in a >>>>>>>>>>> thread pool so that they are properly shutdown at the right > time. I >>>>>>>>>> wonder >>>>>>>>>>> if it's possible (or could be possible) to somehow inject a > thread >>>>>>> pool >>>>>>>>>> in >>>>>>>>>>> to log4j for this rollover, so that for you use case you could >>>>>>> inject a >>>>>>>>>>> single thread executor, so only one thread is ever compressing > at a >>>>>>>> time. >>>>>>>>>>> Just a thought, anyway, >>>>>>>>>>> >>>>>>>>>>> Greg >>>>>>>>>>> >>>>>>>>>>> On 22 March 2017 at 13:47, Anthony Maire <maire.anth...@gmail.com >> >>>>>>>>>> wrote: >>>>>>>>>>>> Hi >>>>>>>>>>>> >>>>>>>>>>>> We are currently using another logging framework in production, > but >>>>>>> I'm >>>>>>>>>>>> pushing to change it for log4j2. >>>>>>>>>>>> >>>>>>>>>>>> One common issue we have with that framework (and I assume we > can >>>>>>> have >>>>>>>>>> the >>>>>>>>>>>> same with log4j2) is that all of our JVMs (we can have more > than 50 >>>>>>>>>> JVMs on >>>>>>>>>>>> the same server in production) roll their file at midnight. >>>>>>>>>>>> >>>>>>>>>>>> When this happens, the system became often not usable for a few >>>>>>> seconds >>>>>>>>>>>> because of the simultaneous zipping of all the rolled files that >>>>>>>>>> overload >>>>>>>>>>>> the CPU (although zipping is done in a specific background > thread). >>>>>>> To >>>>>>>>>>>> reduce this effect, we are combining a time based rolling policy >>>>>>> with a >>>>>>>>>>>> sized based policy to zip smaller files, but this is not enough > to >>>>>>> make >>>>>>>>>> the >>>>>>>>>>>> system fully responsive at midnight. >>>>>>>>>>>> >>>>>>>>>>>> A pretty cool feature for us to avoid this issue is to have the >>>>>>>>>> possibility >>>>>>>>>>>> when a rolling is triggered because of a time based policy to > change >>>>>>>>>> file >>>>>>>>>>>> immediately, but to wait for a random amount of time (within a >>>>>>>>>> configurable >>>>>>>>>>>> limit) before starting the compression. This random delay should >>>>>>> help a >>>>>>>>>> lot >>>>>>>>>>>> to avoid contention on CPU cycles. >>>>>>>>>>>> >>>>>>>>>>>> Does log4j2 have something to solve this kind of issue ? If not, >>>>>>> would >>>>>>>>>> you >>>>>>>>>>>> accept a pull request for this (I will open a Jira if needed) ? >>>>>>>>>>>> >>>>>>>>>>>> Regards, >>>>>>>>>>>> Anthony >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ------------------------------------------------------------ > --------- >>>>>>>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org >>>>>>>>>> For additional commands, e-mail: log4j-user-help@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 >>>>>>> >>>>>>> >>>> >>>> --------------------------------------------------------------------- >>>> 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 >> > > --------------------------------------------------------------------- > 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