Issues
- Make the Rolling File Appender rotator task timer configurable: rotatorSchedulerMinutes propertyLOGBOX-81Resolved issue: LOGBOX-81Luis Majano
- LogBox Rolling file threads rotator running on an insane millisecond timer instead of minutesLOGBOX-82Resolved issue: LOGBOX-82Luis Majano
- Dupe log entries with LogBox 7.2+LOGBOX-80Luis Majano
- new rolling appender property archiveLayout which is a closure that returns the pattern of the archive layoutLOGBOX-79Resolved issue: LOGBOX-79Luis Majano
- Change fileMaxArchives default from 2 to 10LOGBOX-78Resolved issue: LOGBOX-78Luis Majano
- log rotator was not checking for file existence and 1000s of errors could be producedLOGBOX-77Resolved issue: LOGBOX-77Luis Majano
- Add the queue as an argument to the processQueueElement() methodLOGBOX-76Resolved issue: LOGBOX-76Luis Majano
- New listeners for all appenders: preProcessQueue() postProcessQueue()LOGBOX-75Resolved issue: LOGBOX-75Luis Majano
- shutdown the appenders first instead of the executors to avoid chicken and egg issuesLOGBOX-74Resolved issue: LOGBOX-74Luis Majano
- Unhandled race conditions in FileRotator lead to errors and potential log data lossLOGBOX-73Resolved issue: LOGBOX-73Luis Majano
- Removal of instance approach in preferences to accessors for the LogBoxConfigLOGBOX-72Resolved issue: LOGBOX-72Luis Majano
- LogBox stand-alone doesn't ship with required dependency (cbproxies)LOGBOX-71Resolved issue: LOGBOX-71Luis Majano
- Add `Exclude` key to Logbox Categories to Easily Exclude AppendersLOGBOX-70Resolved issue: LOGBOX-70Luis Majano
- LogEvents in JSON are now prettifiedLOGBOX-69Resolved issue: LOGBOX-69Luis Majano
- Remove the usage of identity hash codes, they are no longer relevant and can cause contention under loadLOGBOX-68Resolved issue: LOGBOX-68Luis Majano
- Come up with better default serialization for exception objects on LogEventsLOGBOX-67Resolved issue: LOGBOX-67Luis Majano
- Make Appender Name available to Custom LayoutLOGBOX-66Resolved issue: LOGBOX-66Luis Majano
- File Appender missing text "ExtraInfo: "LOGBOX-65Resolved issue: LOGBOX-65Luis Majano
- Ability to add new appenders after config has been registered alreadyLOGBOX-64Resolved issue: LOGBOX-64Luis Majano
- Allow for dbappender to have default column maps instead of strict maps and allow for all methods to use the mapsLOGBOX-63Resolved issue: LOGBOX-63Luis Majano
- Support ad-hoc struct literal of LogBox DSL to configure LogBoxLOGBOX-62Resolved issue: LOGBOX-62Luis Majano
- Allow for closure for all logging messages in the logger, this way, we can verify the logging level automatically.LOGBOX-61Resolved issue: LOGBOX-61Luis Majano
- Ignore interrupted exceptions from appenders' scheduler poolLOGBOX-60Resolved issue: LOGBOX-60Brad Wood
- New shutdown() method can be now used in appenders that will be called when LogBox is shutdownLOGBOX-59Resolved issue: LOGBOX-59Luis Majano
- New logbox config onShutdown() callback, which is called when LogBox has been shutdownLOGBOX-58Resolved issue: LOGBOX-58Luis Majano
- new shutdown() method to process graceful shutdown of LogBoxLOGBOX-57Resolved issue: LOGBOX-57Luis Majano
- Missing line break on file appender control stringLOGBOX-56Resolved issue: LOGBOX-56Luis Majano
- Improved exception handling when dealing with shutdowns for appenders and scheduled executorsLOGBOX-55Resolved issue: LOGBOX-55Luis Majano
- Defining a category with no explicit list of appenders, should use the root logger, not all appendersLOGBOX-54Luis Majano
- Direct console debugging is left in the AbstractAppender and FileAppenderLOGBOX-53Resolved issue: LOGBOX-53Luis Majano
- Migrations to script and more fluent programmingLOGBOX-51Resolved issue: LOGBOX-51Luis Majano
- Rolling file appender inserting tabs on first lineLOGBOX-50Resolved issue: LOGBOX-50Luis Majano
- Rolling File Appender now uses the async scheduler for log rotation checksLOGBOX-49Resolved issue: LOGBOX-49Luis Majano
- DB Appender now uses a queueing approach to sending log messagesLOGBOX-48Resolved issue: LOGBOX-48Luis Majano
- AbstractAppender log listener and queueing facilities are now available for all appendersLOGBOX-47Resolved issue: LOGBOX-47Luis Majano
- Update ConsoleAppender to use TaskSchedulerLOGBOX-46Resolved issue: LOGBOX-46John Berquist
- Work around for adobe bug CF-4204874 where closures are holding on to tak contextsLOGBOX-45Resolved issue: LOGBOX-45Luis Majano
- Rolling appender now uses the new async schedulers to stream data to filesLOGBOX-44Resolved issue: LOGBOX-44Luis Majano
- LogBox has a scheduler executor and the asyncmanager attached to it for standalone and ColdBox mode.LOGBOX-43Resolved issue: LOGBOX-43Luis Majano
- All appenders get a reference to the running LogBox instanceLOGBOX-42Resolved issue: LOGBOX-42Luis Majano
- refactoring of internal utility closures to udfs to avoid ACF memory leaks: CF-4204874LOGBOX-41Resolved issue: LOGBOX-41Luis Majano
- localScopeMode="modern" causing issue with Logbox appenders in ColdBoxLOGBOX-40
- Implicit level categories logging to all appendersLOGBOX-39Luis Majano
- Rotate property is defined but never usedLOGBOX-38Resolved issue: LOGBOX-38Stephen Condon
- Improvements to threading for logging to avoid dumb Adobe duplicatesLOGBOX-37Resolved issue: LOGBOX-37Luis Majano
- Added an `err()` to abstract appenders for reporting to the error streamsLOGBOX-36Resolved issue: LOGBOX-36Luis Majano
- FileAppender: if logging happens in a thread, queue never gets processed and, potentially, you run out of heap spaceLOGBOX-35Resolved issue: LOGBOX-35Luis Majano
- Console appender completely rewritten to support asynchronous streamingLOGBOX-34Resolved issue: LOGBOX-34Luis Majano
- Improve file exists usage on file appenders to avoid i/o operationsLOGBOX-33Resolved issue: LOGBOX-33Luis Majano
- Add test and fix for adding a LogBox category after the factLOGBOX-32Resolved issue: LOGBOX-32Eric Peterson
Please add new high-order function partitionBy()/separate()/whateveryouwanttocallit()
Description
Attachments
Details
Details
Details
Sentry
Sentry
Sentry
Activity
John WilsonJuly 18, 2024 at 8:02 PM
Nice. Very fast compilation now, too!
Brad WoodJuly 18, 2024 at 7:55 PMEdited
Note, Java’s stream partitioning does not separate contiguous values like Clojure, which makes it work the same as a binary group by. Here is some example BoxLang code you can run right now, showcasing how easy streams are to use. Note our BoxLang lambda gets coerced into a Predicate functional interface.
and here’s an example of using Java’s stream grouping in BoxLang. Note a parallel stream doesn’t guarantee encounter order will be maintained in the final result.
You can paste either of those examples into try.boxlang.io
Brad WoodJuly 18, 2024 at 7:22 PM
Great suggestions guys. You could prolly dip into Java streams to do this pretty easy, but I can see a use case for a built in BIF as well. We’ll discuss.
Sean CorfieldJuly 18, 2024 at 4:43 PM
CF-specific (or at least CF-peculiar) solutions would belong in bx-compat
– and CFCollection is a grab bag of all sorts of things that should not be built-in to the language itself.
Adding groupBy
feels borderline to me but sufficiently useful that having it in BoxLang is probably reasonable.
John WilsonJuly 18, 2024 at 4:09 PM
I would like a groupBy function, too, and use it regularly from CFCollection, many of which functions should be added as native members. ( Chunk is another favorite, as is unique, and I like the shortcuts offered by pluck, sum, avg, count, etc. vs map/reduce… ) Your example does make sense. Maybe something could be done using signatures, simple-value vs closure? Simple values should work as the CFCollection version does.
Filter is great, but sometimes you need to process both sides of the operation. It would be handy to have a bif like the bad-practice
filter()
example below that returned a struct with two arrays - pass/fail, true/false, succeeded/failed w/e. Maybeseparate()
orpartitionBy()
. In the example below, see the filter function itself populating a top-level struct withsucceeded
andfailed
elements in one pass, rather than running the filter operation twice. The rest of the code is just for context. This is processing the results from importing a number of disparate spreadsheets, and both those that failed and those that succeeded need to be dealt with, though the handling and messaging are different for each category.So we don’t get hung up on the example, the reason for the top-level struct is that getResults() can be called randomly from different channel providers in megaphone, based on user preferences, but they all need to process the same results.