I am using c3p0-0.9.2.1 jar and i have this jar in my class path and lib folder.
Whenever i connect for the first Time i get this Error:
com.mchange.v2.cfg.DelayedLogItem [ level -> FINE, text -> "The configuration file for resource identifier '/mchange-commons.properties' could not be found. Skipping.", exception -> java.io.FileNotFoundException: Resource not found at path '/mchange-commons.properties'.]
com.mchange.v2.cfg.DelayedLogItem [ level -> FINE, text -> "The configuration file for resource identifier 'hocon:/reference,/application,/' could not be found. Skipping.", exception -> java.io.FileNotFoundException: HOCON lib (typesafe-config) is not available. Also, no resource available at '/reference,/application,/' for HOCON identifier 'hocon:/reference,/application,/'.]
My application is running fine though.i am not able to gauge what is this error and should i be worried about this error?If yes, how to remove this error.What am i doing wrong.
These are DEBUG level messages, basically documenting c3p0's checking all the various places configuration information can be placed, and usually not finding anything in most of those places. The FileNotFoundExceptions are how c3p0 sees there is nothing there.
c3p0 and libraries under com.mchange in general are intended to log at INFO level for normal use. If you log at DEBUG or FINE, you may see more stuff than you'd like, including things like these perfectly harmless an expected FileNotFoundExceptions during the search for config files.
I looked at the DelayedLogItem class in the cp30 package and also debugged the code.
It seems this class doesn't use logback or any logger for that matter. Actually it does something similar as most loggers, it defines its own log levels etc. The log message is actually the result of the toString() method.
During debugging I found that the BasicMultiPropertiesConfig class is trying to find some configuration files and when it doesn't it calls a method dumpToSysErr which outputs the log lines to standard error.
So it looks like there is no way to use any logger to 'catch' these log message and show it based on your logger configuration.
By the way, if you configure e.g. logback to do TRACE logging on com.mchange, then it also logs using logback (including stacktraces).
Related
the log file is generated when I run the code within IDE (Intellij IDEA).
as soon as I create runnable jar of the code and then try to run the jar then the logs are not generating.
I have made sure the log4j2.xml file is a part of classpath.
is there anything extra I have to do while creating jar in the Intellij IDEA?
Taken from the FAQ: How do I debug my configuration?
First, make sure you have the right jar files on your classpath. You need at least log4j-api and log4j-core.
Next, check the name of your configuration file. By default, log4j2 will look for a configuration file named log4j2.xml on the classpath. Note the “2” in the file name! (See the configuration manual page for more details.)
From log4j-2.9 onward
From log4j-2.9 onward, log4j2 will print all internal logging to the console if system property log4j2.debug is either defined empty or its value equals to true (ignoring case).
Prior to log4j-2.9
Prior to log4j-2.9, there are two places where internal logging can be controlled:
If the configuration file is found correctly, log4j2 internal status logging can be controlled by setting in the configuration file. This will display detailed log4j2-internal log statements on the console about what happens during the configuration process. This may be useful to trouble-shoot configuration issues. By default the status logger level is WARN, so you only see notifications when there is a problem.
If the configuration file is not found correctly, you can still enable log4j2 internal status logging by setting system property -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE.
I am new to SLF4j and I don't know if the logback.xml file has loaded properly or not. The logback.xml file is in PROJECTNAME/src/main/java where all my packages are found.
My questions are:
How can I know if the configuration file has properly loaded or not
?
How can restrict the logging only from an explicit set of class,
only to avoid logging from libraries
You can add the debug="true" attribute to the <configuration> element to enable debug of the logback configuration. It will print the configuration to the console. See https://logback.qos.ch/manual/configuration.html#dumpingStatusData.
Simple answer, if the configuration file is loaded properly, you will see results in log file or console, depending on your configuration.
By default, logback searches file in src/main/resources instead of src/main/java if I remember correctly.
In the configuration file, you can define log lever on a specific logger. Normally you'll still want to see logs of the libraries, but maybe only WARN or ERROR, so you could set the root level to WARN/ERROR, and add a logger of your root package with DEBUG/INFO level.
Also, use a logback-test file (under src/test/resources) for your own dev environment.
I am required to write logs for jaxb-impl.jar. When I searched online (https://java.net/projects/jaxb/lists/users/archive/2007-01/message/5), I found that we need to enable logs in JDK i.e logging.properties (C:\Program Files (x86)\IBM\WMBT700\jdk\jre\lib). Based on my further search I found that we need to enable logs and trace in Java control panel, I even specified the jre inside the control panel.
Now to see the logs in the file, I have configured the file handler in logging.properties
java -Djava.util.logging.config.file=myfile.log
Handler used is specified as file handler
handlers= java.util.logging.FileHandler
and the process is specified as
com.sun.xml.bind = FINEST
I am still not getting the logs.
I checked the class files using decompiler. To my surprise I found no code as java.util.log..., Is that the reason why logs are not getting generated.
-Djava.util.logging.config.file=myfile
Here, myfile should be custom configuration file.
So try by either specifying your own configuration file or without specifying this system property in case if you have modified logging.properties
Also level could be changed to,
.level = ALL (default is INFO).
This may not be an answer but as i am new and i do not have that much reputation to comment so added it as answer if it may help :)
I have a few Maven dependencies in my Java project that clutter the console output with redundant log info. I want to disable such logging.
Setting the additivity property to false might help. But could not use it properly.
I am looking for a log4j.xml config that will only print log output (warn, error, ...) from my project and not from any dependencies.
Redirect all the third party lib logs in a target appender, use another appender for your app
log4j.rootLogger=debug,thirdPartyLibAppender
log4j.logger.com.yourapp=debug, yourAppAppender
log4j.additivity.com.yourapp=false
# define where do you want third party lib logs to land : in a file
log4j.appender.thirdPartyLibAppender=org.apache.log4j.FileAppender
log4j.appender.thirdPartyLibAppender.append=true
log4j.appender.thirdPartyLibAppender.file=/tmp/app.log
log4j.appender.thirdPartyLibAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.thirdPartyLibAppender.layout.ConversionPattern=[%p] %c:%m%n
# define where do you want your app logs to land : stdout
log4j.appender.yourAppAppender=org.apache.log4j.ConsoleAppender
log4j.appender.yourAppAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.yourAppAppender.layout.ConversionPattern=[%p] %c:%m%n
Setting additivity to false will prevent that your app logs end in the thirdPartyLibAppender
In those 2 lines, don't forget to replace com.yourapp by the top level package name
log4j.logger.com.yourapp=debug, yourAppAppender
log4j.additivity.com.yourapp=false
It looks like the log4j2.xml was overriding all other configs. As of now, I have switched that dependency off. Maybe log4j2 > log4j hence the issue. Also, XML gets a higher priority over properties as I have seen somewhere.
As far as i understand log4j can handle system property -Dlog4j.debug. If you run your app with it you will get log4j's debug output.
Example: java -Dlog4j.debug -jar test.jar
Is there something similar for log4j 2?
Update January 2018:
From Log4j 2.10, this is easy: just run your program with system property log4j2.debug (no value needed; an empty string is fine).
The current (log4j-2.1) documentation on the status logger is a bit confusing.
Basically:
Until a configuration is found, status logger level can be controlled with system property org.apache.logging.log4j.simplelog.StatusLogger.level.
After a configuration is found, status logger level can be controlled in the configuration file with the "status" attribute, for example: <Configuration status="trace">.
UPDATE: the documentation was improved in log4j-2.2.
It can be confusing, the nearest equivilent of the Log4J 1.x command line argument -Dlog4j.debug is -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=trace which sets the Log4J 2.x "status logger" level to trace and provides detailed output about the logging configuration.
Log4J 1.x allows you to manually specify the location of the configuration file on the command line using -Dlog4j.configuration=file:///var/lib/tomcat7/log4j.xml where the configuration file is located at /var/lib/tomcat7/log4j.xml. In Log4J 2.x there is a subtle difference in the argument -Dlog4j.configurationFile=file:///var/lib/tomcat7/log4j.xml, 'configurationFile' rather than 'configuration'.
Obviously you need to ensure that your configuration file is suitible for the version of Log4J being used, the XML structure differs between 1.x and 2.x.
I've had a frustrating amount of difficulty getting Log4J2 up and running, and printing the StatusLogger is no exception. In theory you can set it in the config file with the status field, however I've not been able to make that work thusfar.
You can run the following at the beginning of your main method however:
StatusConsoleListener listener = new StatusConsoleListener(Level.ALL);
StatusLogger.getLogger().registerListener(listener);
LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); // initialize logger
Note your main() class cannot have any static Loggers, or they'll be initialized before this is called, meaning the loading status messages won't print.
In case someone needs to set DEBUG level programmatically
// for your custom logger
Configurator.setLevel("com.name.of.logger", Level.DEBUG);
// for root logger
Configurator.setRootLevel(Level.DEBUG);
OR without imports
org.apache.logging.log4j.core.config.Configurator.setLevel(
"com.name.of.logger",
org.apache.logging.log4j.Level.DEBUG
);