log4j truncates stacktrace - java

I'm having a problem printing the stacktrace to my log file.
Log4j.properties:
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/app/application.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n
log4j.rootLogger=warn, file
log4j.logger.com.app=info, file
log4j.additivity.com.app=false
when I log an exception like this in my class UserGuard.java:
} catch (Exception e) {
log.error("Uncaught error", e);
response.setEntity(new StringRepresentation(" "));
response.setStatus(Status.SERVER_ERROR_INTERNAL);
}
This results in my application.log :
2011-12-28 07:30:03 UserGuard [ERROR] Uncaught error
java.lang.NullPointerException
No stack trace shown. This is really annoying.
Thanks!
Tried with same pom.xml and same log4j.properties on another machine and works ok. Should I think that the problem is my java version?

Your stack traces are most likely getting truncated due to an optimization in Hotspot. The optimization only builds the identical stacktrace a limited number of times, and then future instances of the exception from the same exact place don't build it.
You can either turn off this optimization using the -XX:-OmitStackTraceInFastThrow flag, or go back to earlier logs to find the first instance of this exception occuring (it's logged once, then optimized away later).
See this related StackOverflow question, and this one, and this blog post over here.

There is an enhancement to log4j:
http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html

Related

Issue with log4j.properties on the command propmt

I'm trying to create a batch file for Windows (*.bat) for executing a Java application. I've set up everything but the logger. I have made the call to BasicConfigurator.configure() and put the file log4j.properties on the root of the project which works fine in the IDE (Eclipse) but when I try to do the same through a batch file, it doesn't work.
I've already tried to move the file to other path but it didn't work and I don't know what else to try.
eInvoice.bat (CLASSPATH is suppose to be defined previously)
java -Xmx500m -cp %CLASSPATH% com.mycompany.einvoice.InvoiceSender -Dlog4j.configuration=log4j.properties
log4j.properties
# Root logger option
log4j.rootLogger=INFO, file
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=AplFacturae.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
I'm not sure if this is useful for someone, but I found the source of the problem and It was related with the order of the parameters. The main class has to be the last parameter unless it has parameters. So I just swapped the last two parametes and it started to work
java -Xmx500m -cp %CLASSPATH% -Dlog4j.configuration=log4j.properties com.mycompany.einvoice.InvoiceSender
In the moment I fix the problem I realized the reason. The main class can have paramentes, so, every parameter I use before of the main class, belongs to the main class instead of Java.
public static void main (String[] args){
...
}

Running java application from batch with flags

I hava jar with class my.package.Foo inside, containing main method.
What is more i have Log4j configurated as a logging system.
I want to print full stack trace while exception is catched, however i read this topic: log4j not printing the stacktrace for exceptions
and i think that i need to use a -XX:-OmitStackTraceInFastThrow flag.
So i'm trying to call my app with command line like this:
java -XX:-OmitStackTraceInFastThrow -cp %JAR_LOCATION:% my.package.Foo
However i'm still missing stacktrace, i get only short exception message.
Here is my log4j config:
log4j.rootLogger=INFO, CONSOLE, FILE
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=log.txt
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%d{HH:mm:ss.SSS} %-4p %c{2}.%m%n
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss.SSS} %-4p %c{2}.%m%n
What i'm missing?
Try it like this:
set JAR_LOCATION=c:\any folder with spaces\jar
java -XX:-OmitStackTraceInFastThrow -cp "%JAR_LOCATION:~%" my.package.Foo
You have to remove the ":" char from %JAR_LOCATION:%, or use %JAR_LOCATION:~% to de-quote it, and quote it directly at the JAVA command, because the path probably contains spaces.

Jar file ran by cron doesn't write his own log

I have a simple java program (Java version 1.7), which is an email sender, and I want to log some events during its running. So I decided to use org.apache.log4j.Logger for this. I created the log4j.properties file which contains the following:
log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=Autoemail.log
log4j.appender.file.MaxFileSize=2MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
log4j.appender.file.encoding=UTF-8
This is how I load the configuration:
PropertyConfigurator.configure(cl.getResource("resources/log4j.properties"));
logger = Logger.getLogger("");
logger.info("Auto email sending started...");
where cl is the classloader. When I run this from Eclipse on my localhost, everything works as desired, the log file has been created if didn't exist, and on next run it is appended.
Then I wanted to run this email sender program automatically every day at 7 am. I created the scheduled cron job, which executes the following:
java -jar /var/projects/Autoemail/Autoemail.jar 2>> /var/projects/Autoemail/Autoemail.err
On first run it worked fine, the log file had been created and info or error had been inserted, but since then the program doesn't write any event into it. The jar file runs, because I can see the sent emails. When I started searching for the reason, and ran the command, it showed me a Permission denied error. I checked the rights of the log file, and it was: rw-rw-r--. So I modified, at last to rwxrwxrwx, but still doesn't write the log, and I can't see any error message in the syslog file. The owner doesn't need sudo right, I think. BTW the server is Ubuntu 13/04.
Does anyone have any idea of what can be wrong, what is still needed, or what do I have to do?

cassandra reinstallation not working on ubuntu

It was wroking fine some days before all though i changed the size from Xss:168k to 256k and now I am facing this error while starting cassandra,although i have gone through existing solution but that are saying to compare existing file of cassandra.yaml and copy-paste the difference between them but not working for me, i am working on ubntu-13.0.4 getting an error ExceptionInInitializerError ,HeapDumpOnOutOfMemoryError
cassandra -f
xss = -ea -javaagent:/usr/share/cassandra/lib/jamm-0.2.5.jar -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms1024M -Xmx1024M -Xmn256M -XX:+HeapDumpOnOutOfMemoryError -Xss256k
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: Couldn't figure out log4j configuration: log4j- server.properties
at org.apache.cassandra.service.CassandraDaemon.initLog4j(CassandraDaemon.java:103)
at org.apache.cassandra.service.CassandraDaemon.<clinit>(CassandraDaemon.java:69)
any help and solution that work out,thanks.what changes do i have to make after reinstallation.
Edit
i have my log file in /etc/cassandra/log4j-tools.properties
# output messages into a rolling log file as well as stdout
log4j.rootLogger=WARN,stderr
# stderr
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.target=System.err
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern=%5p %d{HH:mm:ss,SSS} %m%n
Couldn't figure out log4j configuration: log4j- server.properties
This makes me thing that there is something wrong with your log4j config. The file is located in /test/conf/log4j-server.properties, or maybe its missing. Check this question out, I'd say its very closely related.
This is what the default looks like:
log4j.rootLogger=DEBUG,R
# rolling log file ("system.log
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%5p [%t] %d{ISO8601} %F (line %L) %m%n
log4j.appender.R.File=build/test/logs/system.log

configuring log4j to display errors

I've configured my log4j.properties so that it puts all the info and debug messages in a separate log file in tomcat. However, when the application fails, say bad sql command then the errors don't show up in that file but instead show up in the regular localhost log file.
How can I configure the properties such that the errors show up in that file as well?
log4j.rootCategory=INFO, logfile
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n
log4j.appender.logfile.File=${catalina.home}/logs/myapplog.log
log4j.category.org.springframework.web=INFO
log4j.category.com.package.app=DEBUG
log4j.category.org.springframework.samples.mvc31=INFO
log4j.logger.org.springframework.jdbc.core=DEBUG
The type of errors I want to see in my log file are like these:
com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name...
If you are catching the exceptions/errors(Throwable) and putting log.error statements in your catch blocks then only you will be able to see the exception messages in your log file. For all the exceptions that are not caught in your code will be basically pushed to the console logger of tomcat and hence you are seeing the exception traces in tomcat out log file.
So try to catch all the possible exceptions in your code and log them properly so that they appear in your log files.

Categories