In the original post, there seem to be some misunderstandings about what the purpose of the LogEntry event is, and how it works. I will try to explain this.
Try to think about the QuickOPC (OPCData) as a kind of service - because it is, in fact. It is not a "computational" library where a call from your side would always cause a precise sequence of downstream effects. The service does some things even your code does nothing - e.g. manages the connections/reconnections/disconnections. Conversely, if your code makes a call, what precisely happens depends on the state of the service (we call it "the engine" internally) - so for example, calling a Read may cause the engine to connect to the server, if it is not connected yet; but it may not do it, because the connection already exists; or it may return an error right away, because the server has failed just recently and the reconnection period has not yet passed.
For the reasons just described, it is misleading to think that the events produced by the LogEntry event would be directly tied to readings/writing you perform. There will be *some* correspondence, but not precise. For example, when you instantiate the first EasyUAClient, multiple things will happen that relate to setting up the engine, and they will not be repeated when the second instance is created. Similarly, when you perform a first Read, there will be many things related to creating the connection, and even some application-wide tasks (also related to certificates!) that will not necessarily be repeated for the second Read, because the connection and other supporting will already be there, ready to use. On the other "end", the operations of the engine may survive some time over the lifetime of the last EasyUAClient instance - for example, a connection to the OPC server might be held open, for optimization purposes, for some time. That's why it is more appropriate to think about the component as a "service".
This also explains why the event is a static event, and not an instance event - it is not a design mistake, it has to be that way.
In addition, the LogEntry mechanism is not (at least currently) meant as detailed troubleshooting tool for low-level communications between the OPC server and the OPC client. One reason for it is the performance impact it could have. As such, it will *not* actually log anything about the actual Read or Write call to the OPC server, unless there is some kind of problem that the OPC UA compliance requires be logged.
Going back to the specifics of your questions:
- Breaking up the events by instance: Given the principles I explained, I am afraid that this cannot be done.
- "When we encounter an error with a read or write..." - be aware that "normal" errors (such as when the server returns a "Bad" status code for the operation) will *not* show up through LogEntry at all. But connection-related problems, and also the certificate-related info (which you were mostly after) will be there, yes.
- "is there a good place that you recommend that we register for the LogEntry event?" I will need to know the kind of application we are talking about (e.g. a desktop app/Windows service/Web service etc.). But the general recommendation would be to hook the event as soon as possible, and unhook as late as possible, in relation to the global lifetime your app - not to tie it to anything that goes in and out. It seems that you try to avoid doing it this way - if so, please describe the reasons for it, I can then comment (or provide some alternative suggestion).
Best regards