configuring log4j to display errors - java

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.

Related

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.

how to stop printing the log details in command prompt in netbeans?

i log the messages in the log file using filehandler in xml format. log messages are stored successfully in the log file. but the log messages are still displaying in the netbeans command prompt.
how to stop displaying those log messages?
Review Your logger configuration and disable ConsoleAppender (if using log4j)
logger.setUseParentHandlers(false);
made me to stop the default root handlers and stops the logging in the console.

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?

log4j truncates stacktrace

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

log4j file appender not working

am using log4j-1.2.15.jar for enable logging .and its writing all logs to a file.
this is what in my log4j.properties.
log4j.rootLogger = DEBUG, fileout
log4j.appender.fileout = log.NewLogForEachRunFileAppender
log4j.appender.fileout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c - %m%n
log4j.appender.fileout.layout = org.apache.log4j.PatternLayout
log4j.appender.fileout.File = D:/log/logs.log
It was working fine when am trying to run this from my local server configured in eclipse.
But the same is not working when i had deployed that into the production development enviornment.This is what am getting in the console.
no output stream or file set for the appender named [fileout]
Can anyone give a solution.?
Your configuration looks ok. I assume the D:/log/logs.log is available in production environment.
You might want to try log4j configuration debugging by setting -Dlog4j.debug on the command line. It often points out useful configuration errors.

Categories