Seitenhistorie
...
Ab 4.19.0 und 4.18.2: Im Webclient kann der Super-User das Logging während des Betriebs an- und ausschalten, rechts unter dem Zahnrad-Dropdown Menüpunkt "Server Info". Log level für den gewünschten Logger auf "DEBUG" setzen:
Allgemeines zum Logging
Nuclos verwendet intern log4j Version 1.2.x für das Logging. Wenn Sie in Ihrer Installation die Datei <nuclos_home>/conf/log4j.properties
anpassen, können Sie das Log Verhalten des Servers in weiten Bereichen konfigurieren. Auf diese Seite finden Sie verschiedene Beispielkonfigurationen, die
- bestimmte Log Events in eine separate Datei schreiben,
- bestimmte Log Events statt in einer Datei in der Datenbank loggen und
- die Ausführlichkeit des Loggings für verschiedene Log Bereiche (z.B. Java Klassen) anpassen.
Weitergehende Informationen zu log4j finden Sie z.B. unter
- http://www.benmccann.com/dev-blog/sample-log4j-properties-file/
- https://logging.apache.org/log4j/1.2/manual.html
- http://www.torsten-horn.de/techdocs/java-log4j.htm
Info |
---|
Die hier vorgestellte Methode, unterschiedliche Log Dateien zu erzeugen und/oder das Logging in eine Datenbank umzuleiten, funktionieren auch in weiteren Fällen. Beispielsweise ist es möglich, das client lifecycle logging auf dem Server entsprechend zu konfigurieren. Das zu konfigurierende Log Handle ist hierbei |
Separate Log Datei für Client Lifecycle Events
Standard SQL Logging
Um alle SQL Statements zu loggen: Für log4j2 sieht die Konfiguration der log4j2.xml aus wie folgt:
Codeblock | ||
---|---|---|
| ||
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %p [%c] - %m%n"/>
</Console>
<RollingFile name="Logfile" fileName="<Nuclos-Log-Verzeichnis>/server.log"
filePattern="<Nuclos-Log-Verzeichnis>/server-%i.log"
append="true">
<PatternLayout pattern=" | ||
Codeblock | ||
# standard log stuff log4j.appender.logfile=org.apache.log4j.RollingFileAppender log4j.appender.logfile.File=/home/tpasch2/nuclos4/logs/server.log log4j.appender.logfile.MaxBackupIndex=1000 log4j.appender.logfile.MaxFileSize=1GB log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.rootLogger=INFO, stdout, logfile # create another log file log4j.appender.clientlifecycle=org.apache.log4j.RollingFileAppender log4j.appender.clientlifecycle.File=/home/tpasch2/nuclos4/logs/clientlifecycle.log log4j.appender.clientlifecycle.MaxBackupIndex=1000 log4j.appender.clientlifecycle.MaxFileSize=1GB log4j.appender.clientlifecycle.layout=org.apache.log4j.PatternLayout log4j.appender.clientlifecycle.layout.ConversionPattern=%d %p [%c] - %m%n # use the file for a certain category log4j.category.org.nuclos.server.web.ClientLifecycle=INFO, clientlifecycle log4j.additivty.org.nuclos.server.web.ClientLifecycle=false log4j.logger.org.nuclos.server.web.ClientLifecycle=INFO |
Standard SQL Logging
Um alle SQL Statements zu loggen: Für log4j2 sieht die Konfiguration der log4j2.xml aus wie folgt:
"/>
<Policies>
<SizeBasedTriggeringPolicy size="5 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.apache.log4j.xml" level="info"/>
<Logger name="SQLLogger" level="debug"/>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="Logfile"/>
</Root>
</Loggers>
</Configuration> |
Um alle SQL Statements in alten Log4J-Konfiguration zu loggen, müssen folgende Zeilen in der log4j.properties hinzugefügt werden:
Codeblock | ||
---|---|---|
| ||
#SQL logging
log4j.logger.SQLLogger=DEBUG |
Das SQL-Logging lässt sich auch in einem eigenen Log-File ausgeben. Dafür müsste dann ein eigener Appender definiert, und im SQL-Logger referenziert werden:
Codeblock | ||
---|---|---|
| ||
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %p [%c] - %m%n"/>
</Console>
<RollingFile name="Logfile" fileName="<Nuclos-Log-Verzeichnis>/server.log"
| ||
Codeblock | ||
| ||
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d %p [%c] - %m%n"/> </Console> <RollingFile name="Logfile" fileName="<Nuclos-Log-Verzeichnis>/server.log" filePattern="<Nuclos-Log-Verzeichnis>/server-%i.log" append="true"> <PatternLayout pattern="%d %p [%c] - %m%n"/> <Policies> <SizeBasedTriggeringPolicy sizefilePattern="5 MB"/><Nuclos-Log-Verzeichnis>/server-%i.log" </Policies> append="true"> <PatternLayout pattern="%d %p [%c] <DefaultRolloverStrategy max="20- %m%n"/> </RollingFile><Policies> </Appenders> <Loggers> <Logger<SizeBasedTriggeringPolicy namesize="org.apache.log4j.xml" level="info5 MB"/> <Logger name="SQLLogger" level="debug"/> <Root level="info"> <AppenderRef ref="Console"/> </Policies> <AppenderRef<DefaultRolloverStrategy refmax="Logfile20"/> </Root>RollingFile> </Loggers> </Configuration> |
Um alle SQL Statements in alten Log4J-Konfiguration zu loggen, müssen folgende Zeilen in der log4j.properties hinzugefügt werden:
Codeblock | ||
---|---|---|
| ||
#SQL logging
log4j.logger.SQLLogger=DEBUG |
...
Codeblock | ||
---|---|---|
| ||
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT <RollingFile name="SQLLog" fileName="<Nuclos-Log-Verzeichnis>/sql.log" filePattern="<Nuclos-Log-Verzeichnis>/sql-%i.log" append="true"> <PatternLayout pattern="%d %p [%c] - %m%n"/> </Console> <Policies> <RollingFile<SizeBasedTriggeringPolicy namesize="Logfile"5 fileName="<Nuclos-Log-Verzeichnis>/server.log" MB"/> </Policies> <DefaultRolloverStrategy max="20"/> filePattern="<Nuclos-Log-Verzeichnis>/server-%i.log" </RollingFile> </Appenders> <Loggers> <Logger name="org.apache.log4j.xml" level="info"/> <Logger appendname="SQLLogger" level="truedebug"> <PatternLayout<AppenderRef patternref="%d %p [%c] - %m%nSQLLog"/> </Logger> <Policies> <Root level="info"> <SizeBasedTriggeringPolicy<AppenderRef sizeref="5 MBConsole"/> <AppenderRef ref="Logfile"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="SQLLog" fileName="<Nuclos-Log-Verzeichnis>/sql.log" filePattern="<Nuclos-Log-Verzeichnis>/sql-%i.log" append="true"> <PatternLayout pattern="%d %p [%c] - %m%n"/> <Policies> <SizeBasedTriggeringPolicy size="5 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> </Appenders> <Loggers> <Logger name="org.apache.log4j.xml" level="info"/> <Logger name="SQLLogger" level="debug"> <AppenderRef ref="SQLLog"/> </Logger> <Root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="Logfile"/> </Root> </Loggers> </Configuration> |
Die Datei log4j.propierties ist im "conf" Verzeichnis des Servers zu finden, zusammen mit den Dateien jdbc.properties und server.properties. Dabei werden mit folgenden Einstellungen des log4j-Loggers alle relevanten Informationen ausgegeben:
Codeblock |
---|
log4j.appender.stdout.layout.ConversionPattern=%d %-5p %-9t [%c{3}] - %m%n
log4j.rootLogger=INFO, stdout, logfile |
Die Ausgabe des SQL Statements vor der Ausführung erscheint dann in der Datei server.log im Verzeichnis logs und sieht z.B. folgendermaßen aus:
Codeblock |
---|
2013-06-27 14:44:09,567 DEBUG pool-2-thread-1 [SQLLogger] - SELECT t.INTID, t.DATCREATED, t.STRCREATED, t.DATCHANGED, t.STRCHANGED, t.INTVERSION, t.INTNUCLETVERSION, t.STRPACKAGE, t.STRNAMESPACE, t.DESCRIPTION, t.NAME FROM T_AD_APPLICATION t WHERE (1=1 AND t.INTID IN (?))
=[40013466] |
SQL Performance Logging
Zusätzlich kann noch die Zeit der einzelnen SQL-Statmens gemessen werden. Dazu muss der SQLTimer aktiviert werden:
Codeblock |
---|
#SQL logging
log4j.logger.SQLTimer=DEBUG |
Damit wird das SQL Statement nach der Ausführung zusammen mit der Dauer ausgegeben:
Codeblock |
---|
2013-06-27 14:44:09,599 DEBUG pool-2-thread-1 [SQLTimer] - SELECT t.INTID, t.DATCREATED, t.STRCREATED, t.DATCHANGED, t.STRCHANGED, t.INTVERSION, t.INTNUCLETVERSION, t.STRPACKAGE, t.STRNAMESPACE, t.DESCRIPTION, t.NAME FROM T_AD_APPLICATION t WHERE (1=1 AND t.INTID IN (?))
=[40013466]=(32 ms)
|
Hinweis: Es kann hilfreich sein, sowohl das Statement vor, als auch nach der Ausführung zu loggen. Insbesondere wenn Statements besonders lange dauern. Dafür werden einfach die beiden Zeilen kombiniert:
Codeblock |
---|
#SQL logging
log4j.logger.SQLLogger=DEBUG
log4j.logger.SQLTimer=DEBUG |
SQL StackTrace Logging
Dies funktioniert ab Nuclos 3.14.9.
Es kann zusätzlich noch der StackTrace, sowohl vom Server, als auch vom Client, bis zur Ausführung des SQL-Statements geloggt werden. Das ist möglich für bestimmte SQL-Statements oder für alle SQL-Statements. Für bestimmte Statements kann in der ersten Methode der Klasse "DataSourceExecuter" ein String-Suchbegriff eingegeben werden (auch zur Laufzeit, wenn der Server im Debug-Modus gestertet wurde):
Codeblock |
---|
private static boolean testForFullDebug(final ConnectionRunner<?> runner) {
final String debugSQL = "FROM T_MD_STATE";
....
} |
Außerdem lässt sich das StackTrace-Logging ganz allgemein für alle SQL-Statments in der log4j.propertier steuern:
Codeblock |
---|
#SQL logging
log4j.logger.SQLLogger=DEBUG
log4j.logger.ClientStackTrace=DEBUG
log4j.logger.ServerStackTrace=DEBUG |
Mit der Option "DEBUG" werden nur StackTrace Elemente, welche mit "org.nuclos" beginnen geloggt. Wenn alle Element ausgegeben werden sollen, dann sollte die Option "TRACE" verwenden werden:
Root>
</Loggers>
</Configuration> |
Die Datei log4j.propierties ist im "conf" Verzeichnis des Servers zu finden, zusammen mit den Dateien jdbc.properties und server.properties. Dabei werden mit folgenden Einstellungen des log4j-Loggers alle relevanten Informationen ausgegeben:
Codeblock |
---|
log4j.appender.stdout.layout.ConversionPattern=%d %-5p %-9t [%c{3}] - %m%n
log4j.rootLogger=INFO, stdout, logfile |
Die Ausgabe des SQL Statements vor der Ausführung erscheint dann in der Datei server.log im Verzeichnis logs und sieht z.B. folgendermaßen aus:
Codeblock |
---|
2013-06-27 14:44:09,567 DEBUG pool-2-thread-1 [SQLLogger] - SELECT t.INTID, t.DATCREATED, t.STRCREATED, t.DATCHANGED, t.STRCHANGED, t.INTVERSION, t.INTNUCLETVERSION, t.STRPACKAGE, t.STRNAMESPACE, t.DESCRIPTION, t.NAME FROM T_AD_APPLICATION t WHERE (1=1 AND t.INTID IN (?))
=[40013466] |
SQL Performance Logging
Zusätzlich kann noch die Zeit der einzelnen SQL-Statmens gemessen werden. Dazu muss der SQLTimer aktiviert werden:
Codeblock |
---|
#SQL logging
log4j.logger.SQLTimer=DEBUG |
Damit wird das SQL Statement nach der Ausführung zusammen mit der Dauer ausgegeben:
Codeblock |
---|
2013-06-27 14:44:09,599 DEBUG pool-2-thread-1 [SQLTimer] - SELECT t.INTID, t.DATCREATED, t.STRCREATED, t.DATCHANGED, t.STRCHANGED, t.INTVERSION, t.INTNUCLETVERSION, t.STRPACKAGE, t.STRNAMESPACE, t.DESCRIPTION, t.NAME FROM T_AD_APPLICATION t WHERE (1=1 AND t.INTID IN (?))
=[40013466]=(32 ms)
|
Hinweis: Es kann hilfreich sein, sowohl das Statement vor, als auch nach der Ausführung zu loggen. Insbesondere wenn Statements besonders lange dauern. Dafür werden einfach die beiden Zeilen kombiniert:
Codeblock |
---|
#SQL logging
log4j.logger.SQLLogger=DEBUG
log4j.logger.SQLTimer=DEBUG |
SQL StackTrace Logging
Dies funktioniert ab Nuclos 3.14.9.
Es kann zusätzlich noch der StackTrace, sowohl vom Server, als auch vom Client, bis zur Ausführung des SQL-Statements geloggt werden. Das ist möglich für bestimmte SQL-Statements oder für alle SQL-Statements. Für bestimmte Statements kann in der ersten Methode der Klasse "DataSourceExecuter" ein String-Suchbegriff eingegeben werden (auch zur Laufzeit, wenn der Server im Debug-Modus gestertet wurde):
Codeblock |
---|
private static boolean testForFullDebug(final ConnectionRunner<?> runner) {
final String debugSQL = "FROM T_MD_STATE";
....
} |
Außerdem lässt sich das StackTrace-Logging ganz allgemein für alle SQL-Statments in der log4j.propertier steuern:
Codeblock |
---|
#SQL logging
log4j.logger.SQLLogger=DEBUG
log4j.logger.ClientStackTrace=DEBUG
log4j.logger.ServerStackTrace=DEBUG |
Mit der Option "DEBUG" werden nur StackTrace Elemente, welche mit "org.nuclos" beginnen geloggt. Wenn alle Element ausgegeben werden sollen, dann sollte die Option "TRACE" verwenden werden:
Codeblock |
---|
#SQL logging
log4j.logger.SQLLogger=DEBUG
log4j.logger.ClientStackTrace=TRACE
log4j.logger.ServerStackTrace=TRACE |
Allgemeines zum Logging
Nuclos verwendete intern log4j Version 1.2.x für das Logging. Wenn Sie in Ihrer Installation die Datei <nuclos_home>/conf/log4j.properties
anpassen, können Sie das Log Verhalten des Servers in weiten Bereichen konfigurieren. Auf diese Seite finden Sie verschiedene Beispielkonfigurationen, die
- bestimmte Log Events in eine separate Datei schreiben,
- bestimmte Log Events statt in einer Datei in der Datenbank loggen und
- die Ausführlichkeit des Loggings für verschiedene Log Bereiche (z.B. Java Klassen) anpassen.
Weitergehende Informationen zu log4j finden Sie z.B. unter
- http://www.benmccann.com/dev-blog/sample-log4j-properties-file/
- https://logging.apache.org/log4j/1.2/manual.html
- http://www.torsten-horn.de/techdocs/java-log4j.htm
Info |
---|
Die hier vorgestellte Methode, unterschiedliche Log Dateien zu erzeugen und/oder das Logging in eine Datenbank umzuleiten, funktionieren auch in weiteren Fällen. Beispielsweise ist es möglich, das client lifecycle logging auf dem Server entsprechend zu konfigurieren. Das zu konfigurierende Log Handle ist hierbei |
Separate Log Datei für Client Lifecycle Events
Codeblock |
---|
# standard log stuff
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=/home/tpasch2/nuclos4/logs/server.log
log4j.appender.logfile.MaxBackupIndex=1000
log4j.appender.logfile.MaxFileSize=1GB
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.rootLogger=INFO, stdout, logfile
# create another log file
log4j.appender.clientlifecycle=org.apache.log4j.RollingFileAppender
log4j.appender.clientlifecycle.File=/home/tpasch2/nuclos4/logs/clientlifecycle.log
log4j.appender.clientlifecycle.MaxBackupIndex=1000
log4j.appender.clientlifecycle.MaxFileSize=1GB
log4j.appender.clientlifecycle.layout=org.apache.log4j.PatternLayout
log4j.appender.clientlifecycle.layout.ConversionPattern=%d %p [%c] - %m%n
# use the file for a certain category
log4j.category.org.nuclos.server.web.ClientLifecycle=INFO, clientlifecycle
log4j.additivty.org.nuclos.server.web.ClientLifecycle=false
log4j.logger.org.nuclos.server.web.ClientLifecycle=INFO |
Codeblock |
#SQL logging
log4j.logger.SQLLogger=DEBUG
log4j.logger.ClientStackTrace=TRACE
log4j.logger.ServerStackTrace=TRACE |
JDBCAppender SQL Logging
Zusätzlich (oder alternativ) lassen sich die SELECT SQL Statements direkt in eine Datenbank schreiben. Dies erledigt das Apache log4j-Framework. Dazu braucht man eine Datenbank, die nicht notwendigerweise identisch mit der Nuclos-DB sein muss. Dort muss eine Tabelle angelegt werden, z.B. für PostgreSQL (bei Oracle sollte die Spalte "MESSAGE" ein CLOB sein):
...