On 2/13/15 3:36 AM, Alessandro Manzoni wrote:
Il 12.02.2015 22.20, Rick Hillegas ha scritto:
Thank you Rick,

Hi Alessandro,

The simplest way to achieve your goal is to provide a public static method which returns a custom java.io.OutputStream or java.io.Writer. Then point to that method using the system property derby.stream.error.field as described in the Reference Manual: http://db.apache.org/derby/docs/10.11/ref/rrefproper33027.html Your custom OutputStream/Writer can filter and reformat the Derby diagnostics as you wish.
Well, I created my own PrinterWriter, I got one goal: derby.log is no more used, output goes into System.err. I suspect that's because Derby dislikes my writer!
I put into derby.properties:
derby.stream.error.field=it.qteam.udf.DbLogger.derbyLogger
when Derby starts it logs correctly my properties, then it logs that classloader is using my jar, that's the same jar used for UDFs, that's correctly loaded as UDFs run correctly. I tried setting derby.database.classpath property with my jar, also with a path relative to derby install directory, but log shows "java.lang.ClassNotFoundException: it.qteam.udf.DbLogger" I tried to add my jar to the same classpath that starts Derby, now the class is found and is used to logout messages.
But Derby fails to start due to the exception:
org.apache.derby.impl.drda.DRDAProtocolException: Execution failed because of Permanent Agent Error: SVRCOD = 40; RDBNAM = mydb;autocommit=false;currentschema=mydb; diagnostic msg = Driver not loaded Reversing boot classpath Derby starts normally again, but my logger class is not found again, as logs are written to stderr.
I suspect that I should load my jar in a different way. Which way?
Hi Alessandro,

I have never tried running a custom diagnostic logger from a jar file stored in the database. I doubt that approach would work. The reason is that the diagnostic logger needs to be shared by all databases booted on the JVM. A diagnostic logger which lives in a jar file in a database would only be accessible to that database and, crucially, would not be available when the Derby engine comes up and performs system-wide housekeeping before actually booting any databases.

I recommend that you leave your UDFs in the jar file stored in the database. I also recommend that you put your diagnostic logger in a separate jar file which is wired into the JVM classpath.

Let me know how that works out. I will be on the road for the next week, so I apologize that my responses may come slowly.

Hope this helps,
-Rick

On 2/12/15 2:43 AM, Alessandro Manzoni wrote:
I need to log statements to derby.log. I already put derby.language.logStatementText=true propertiy into derby.properties file, and restarted te network server.
Now derby.log is growing as expected.
I didn't find a way to change the log format, Iwould like to change the date format and log also the name of the user that executed a statement. Then I would like to log only statement that change the db, delete update and insert, and avoid to log sysprocs calls.

Is there some way to achieve my goals?

Further more, even if the server is stopped, I cannot open derby.log file because of an access denied error (it's windows). The only way I found to browse derby.log is from a dos prompt opened as Administrator, so it appear as an authorization problem.
That's not comfortable at all.

Is there a way to have Derby create derby.log with different authorizations?
Maybe someone with more Windows experience can offer some advice here. It sounds as though the server is being run from the Administrator account. You could try running the server from some less restricted account. You might be able to get around this problem by directing derby.log to a less secure part of the file system. See http://db.apache.org/derby/docs/10.11/ref/rrefproper18151.html. Otherwise, you should be able to adjust the permissions on the diagnostic log file if you pursue the derby.stream.error.field approach described above.
I lack enough experience on windows too. It seems that only malwares do!
The problem is that Derby is running as a service with System account. If I try to run the service as a local account the service do not start, due to lack of autorizations on databases folder. If I try to change folder authorization, windows (8.1) refuse to change permissions on some files inside, and the service keeps fail to start. Changing permissions on log file is not an option, when the file is created again it will be restricted again.

Hope this helps,
-Rick





.


Reply via email to