Chronicle seems similar to Apache Ignite in that it is a distributed cache except that Ignite looks like it does a lot more. It does implement a distributed queue - http://apacheignite.gridgain.org/v1.1/docs/queue-and-set <http://apacheignite.gridgain.org/v1.1/docs/queue-and-set>.
Ralph > On Sep 26, 2016, at 5:21 PM, Ralph Goers <ralph.go...@dslextreme.com> wrote: > > I thought you didn’t want to write to a file? > > The Chronicle stuff Remko is linking to is also worth exploring. > > Ralph > > > >> On Sep 26, 2016, at 5:04 PM, Gary Gregory <garydgreg...@gmail.com >> <mailto:garydgreg...@gmail.com>> wrote: >> >> oh... what about our own >> http://logging.apache.org/log4j/2.x/manual/appenders.html#MemoryMappedFileAppender >> >> <http://logging.apache.org/log4j/2.x/manual/appenders.html#MemoryMappedFileAppender> >> >> ? >> >> Gary >> >> On Mon, Sep 26, 2016 at 4:59 PM, Remko Popma <remko.po...@gmail.com >> <mailto:remko.po...@gmail.com>> wrote: >> In addition to the Flume based solution, here is another alternative idea: >> use Peter Lawrey's Chronicle[1] library to store log events in a memory >> mapped file. >> >> The appender can just keep adding events without worrying about overflowing >> the memory. >> >> The client that reads from this file can be in a separate thread (even a >> separate process by the way) and can read as much as it wants, and send it >> to the server. >> >> Serialization: You can either serialize log events to the target format >> before storing them in Chronicle (so you have binary blobs in each Chronicle >> excerpt), client reads these blobs and sends them to the server as is. Or >> you can use the Chronicle Log4j2 appender[2] to store the events in >> Chronicle format. The tests[3] show how to read LogEvent objects from the >> memory mapped file, and the client would be responsible for serializing >> these log events to the target format before sending data to the server. >> >> [1]: https://github.com/peter-lawrey/Java-Chronicle >> <https://github.com/peter-lawrey/Java-Chronicle> >> [2]: https://github.com/OpenHFT/Chronicle-Logger >> <https://github.com/OpenHFT/Chronicle-Logger> >> [3]: >> https://github.com/OpenHFT/Chronicle-Logger/blob/master/logger-log4j-2/src/test/java/net/openhft/chronicle/logger/log4j2/Log4j2IndexedChronicleTest.java >> >> <https://github.com/OpenHFT/Chronicle-Logger/blob/master/logger-log4j-2/src/test/java/net/openhft/chronicle/logger/log4j2/Log4j2IndexedChronicleTest.java> >> >> Remko >> >> Sent from my iPhone >> >> On 2016/09/27, at 5:57, Gary Gregory <garydgreg...@gmail.com >> <mailto:garydgreg...@gmail.com>> wrote: >> >>> Please allow me to restate the use case I have for the CollectionAppender, >>> which is separate from any Flume-based or Syslog-based solution, use cases >>> I also have. Well, I have a Syslog use case, and whether or not Flume is in >>> the picture will really be a larger discussion in my organization due to >>> the requirement to run a Flume Agent.) >>> >>> A program (like a JDBC driver already using Log4j) communicates with >>> another (like a DBMS, not written in Java). The client and server >>> communicate over a proprietary socket protocol. The client sends a list of >>> buffers (in one go) to the server to perform one or more operations. One >>> kind of buffer this protocol defines is a log buffer (where each log event >>> is serialized in a non-Java format.) This allows each communication from >>> the client to the server to say "This is what's happened up to now". What >>> the server does with the log buffers is not important for this discussion. >>> >>> What is important to note is that the log buffer and other buffers go to >>> the server in one BLOB; which is why I cannot (in this use case) send log >>> events by themselves anywhere. >>> >>> I see that something (a CollectionAppender) must collect log events until >>> the client is ready to serialize them and send them to the server. Once the >>> events are drained out of the Appender (in one go by just getting the >>> collection), events can collect in a new collection. A synchronous drain >>> operation would create a new collection and return the old one. >>> >>> The question becomes: What kind of temporary location can the client use to >>> buffer log event until drain time? A Log4j Appender is a natural place to >>> collect log events since the driver uses Log4j. The driver will make its >>> business to drain the appender and work with the events at the right time. >>> I am thinking that the Log4j Appender part is generic enough for inclusion >>> in Log4j. >>> >>> Further thoughts? >>> >>> Thank you all for reading this far! >>> Gary >>> >>> On Sun, Sep 25, 2016 at 1:20 PM, Ralph Goers <ralph.go...@dslextreme.com >>> <mailto:ralph.go...@dslextreme.com>> wrote: >>> I guess I am not understanding your use case quite correctly. I am thinking >>> you have a driver that is logging and you want those logs delivered to some >>> other location to actually be written. If that is your use case then the >>> driver needs a log4j2.xml that configures the FlumeAppender with either the >>> memory or file channel (depending on your needs) and points to the >>> server(s) that is/are to receive the events. The FlumeAppender handles >>> sending them in batches with whatever size you want (but will send them in >>> smaller amounts if they are in the channel too long). Of course you would >>> need the log4j-flume and flume jars. So on the driver side you wouldn’t >>> need to write anything, just configure the appender and make sure the jars >>> are there. >>> >>> For the server that receives them you would also need Flume. Normally this >>> would be a standalone component, but it really wouldn’t be hard to >>> incorporate it into some other application. The only thing you would have >>> to write would be the sink that writes the events to the database or >>> whatever. To incorporate it into an application you would have to look at >>> the main() method of flume and covert that to be a thread that you kick off. >>> >>> Ralph >>> >>> >>> >>>> On Sep 25, 2016, at 12:01 PM, Gary Gregory <garydgreg...@gmail.com >>>> <mailto:garydgreg...@gmail.com>> wrote: >>>> >>>> Hi Ralph, >>>> >>>> Thanks for your feedback. Flume is great in the scenarios that do not >>>> involve sending a log buffer from the driver itself. >>>> >>>> I can't require a Flume Agent to be running 'on the side' for the use case >>>> where the driver chains a log buffer at the end of the train of database >>>> IO buffer. For completeness talking about this Flume scenario, if I read >>>> you right, I also would need to write a custom Flume sink, which would >>>> also be in memory, until the driver is ready to drain it. Or, I could >>>> query some other 'safe' and 'reliable' Flume sink that the driver could >>>> then drain of events when it needs to. >>>> >>>> Narrowing down on the use case where the driver chains a log buffer at the >>>> end of the train of database IO buffer, I'll think I have to see about >>>> converting the Log4j ListAppender into a more robust and flexible version. >>>> I think I'll call it a CollectionAppender and allow various Collection >>>> implementations to be plugged in. >>>> >>>> Gary >>>> >>>> Gary >>>> >>>> On Sat, Sep 24, 2016 at 3:44 PM, Ralph Goers <ralph.go...@dslextreme.com >>>> <mailto:ralph.go...@dslextreme.com>> wrote: >>>> If you are buffering events in memory you run the risk of losing events if >>>> something should fail. >>>> >>>> That said, if I had your requirements I would use the FlumeAppender. It >>>> has either an in-memory option to buffer as you are suggesting or it can >>>> write to a local file to prevent data loss if that is a requirement. It >>>> already has the configuration options you are looking for and has been >>>> well tested. The only downside is that you need to have either a Flume >>>> instance receiving the messages are something that can receive Flume >>>> events over Avro, but it is easier just to use Flume and write a custom >>>> sink to do what you want with the data. >>>> >>>> Ralph >>>> >>>>> On Sep 24, 2016, at 3:13 PM, Gary Gregory <garydgreg...@gmail.com >>>>> <mailto:garydgreg...@gmail.com>> wrote: >>>>> >>>>> Hi All, >>>>> >>>>> I can't believe it, but through a convoluted use-case, I actually need an >>>>> in-memory list appender, very much like our test-only ListAppender. >>>>> >>>>> The requirement is as follows. >>>>> >>>>> We have a JDBC driver and matching proprietary database that specializes >>>>> in data virtualization of mainframe resources like DB2, VSAM, IMS, and >>>>> all sorts of non-SQL data sources >>>>> (http://www.rocketsoftware.com/products/rocket-data/rocket-data-virtualization >>>>> >>>>> <http://www.rocketsoftware.com/products/rocket-data/rocket-data-virtualization>) >>>>> >>>>> >>>>> The high level requirement is to merge the driver log into the server's >>>>> log for full-end to end tractability and debugging. >>>>> >>>>> When the driver is running on the z/OS mainframe, it can be configured >>>>> with a z/OS specific Appender that can talk to the server log module >>>>> directly. >>>>> >>>>> When the driver is running elsewhere, it can talk to the database via a >>>>> Syslog socket Appender. This requires more set up on the server side and >>>>> for the server to do special magic to know how the incoming log events >>>>> match up with server operations. Tricky. >>>>> >>>>> The customer should also be able to configure the driver such that >>>>> anytime the driver communicates to the database, it sends along whatever >>>>> log events have accumulated since the last client-server roundtrip. This >>>>> allows the server to match exactly the connection and operations the >>>>> client performed with the server's own logging. >>>>> >>>>> In order to do that I need to buffer all log events in an Appender and >>>>> when it's time, I need to get the list of events and reset the appender >>>>> to a new empty list so events can keep accumulating. >>>>> >>>>> My proposal is to either turn our ListAppender into such an appender. For >>>>> sanity, the appender could be configured with various sizing policies: >>>>> >>>>> - open: the list grows unbounded >>>>> - closed: the list grows to a given size and _new_ events are dropped on >>>>> the floor beyond that >>>>> - latest: the list grows to a given size and _old_ events are dropped on >>>>> the floor beyond that >>>>> >>>>> Thoughts? >>>>> >>>>> Gary >>>>> >>>>> -- >>>>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | >>>>> ggreg...@apache.org <mailto:ggreg...@apache.org> >>>>> Java Persistence with Hibernate, Second Edition >>>>> <http://www.manning.com/bauer3/> >>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>> Blog: http://garygregory.wordpress.com >>>>> <http://garygregory.wordpress.com/> >>>>> Home: http://garygregory.com/ <http://garygregory.com/> >>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory> >>>> >>>> >>>> >>>> -- >>>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | >>>> ggreg...@apache.org <mailto:ggreg...@apache.org> >>>> Java Persistence with Hibernate, Second Edition >>>> <http://www.manning.com/bauer3/> >>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>> Spring Batch in Action <http://www.manning.com/templier/> >>>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> >>>> Home: http://garygregory.com/ <http://garygregory.com/> >>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory> >>> >>> >>> >>> -- >>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | >>> ggreg...@apache.org <mailto:ggreg...@apache.org> >>> Java Persistence with Hibernate, Second Edition >>> <http://www.manning.com/bauer3/> >>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>> Spring Batch in Action <http://www.manning.com/templier/> >>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> >>> Home: http://garygregory.com/ <http://garygregory.com/> >>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory> >> >> >> -- >> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | >> ggreg...@apache.org <mailto:ggreg...@apache.org> >> Java Persistence with Hibernate, Second Edition >> <http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> >> Home: http://garygregory.com/ <http://garygregory.com/> >> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>