oh... what about our own 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> 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 > [2]: 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 > > Remko > > Sent from my iPhone > > On 2016/09/27, at 5:57, Gary Gregory <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> > 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> >> 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> >> 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> >>> 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) >>> >>> 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 | 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 >>> Home: http://garygregory.com/ >>> Tweet! http://twitter.com/GaryGregory >>> >>> >>> >> >> >> -- >> E-Mail: garydgreg...@gmail.com | 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 >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> >> >> > > > -- > E-Mail: garydgreg...@gmail.com | 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 > Home: http://garygregory.com/ > Tweet! http://twitter.com/GaryGregory > > -- E-Mail: garydgreg...@gmail.com | 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 Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory