My Application is using logging in two manner….1) programatic 2) log4j.xml
I have to create the logs files in two ( 1 using programatic and other using log4j.xml ) locations.
Programatic way ( have one more properties file in which all the things are mention like log level and all….lets say..thorugh this…file is getting created..name as “SAS_VP.log”) :
Enumeration loggers = Logger.getRootLogger().getLoggerRepository().getCurrentLoggers();
......
Logger temp = (Logger)iter.next();
temp.setLevel(level);
log4j.xml
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/LOGS/SAM/SAM_VJ.log"/>
<param name="Threshold" value="DEBUG"/>
<param name="MaxFileSize" value="10000KB"/>
<param name="MaxBackupIndex" value="10"/>
<param name="Append" value="false"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %5p [%F(% M):%L] %m%n"/>
</layout>
</appender>
<root>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
ISSUE :
Log level which i set programatically overwrite the log level of log4j.xml.Like in log4j.xml is have set the level “Debug” and Programatically I have set the level as “ERROR” then the file (SAM_VJ.log) which is created by log4j.xml only contains ERROR level logs.
How to solve this issue…I want that…my both logging ( programmatic and log4j ) should be indepedent.
Is there anything in log4j in which…if i have set the log level of package “com.sas” is “Debug” then nobody can modify that…something like mutable type
<logger name="com.sam">
<priority value="DEBUG"/>
</logger>
Looking for your suggesstion….
I’m not sure you should really ask for such a functionality.
You’re talking about a way to configure the log4j framework, and yes, it supports 3 different ways of configuration:
Its ok to me that the programmatic configuration allows to change the configured state of log4j loggers/appenders whatsoever.
Your xml configuration should be loaded during the system startup, and then you apply your java code that overrides the configuration.
If you have a logic of supplying a configuration in Java, why don’t you improve your logic and define an error level (from your example) only if you really wish to do it.
Its impossible to configure the same logger to work both with DEBUG level (and up) AND ERROR level (and up).
This is a feature in fact, and not a drawback, since it allows to change the behavior of LOG4j on the running system (without a restart) which is useful for issue tracking.
Of course you can WRAP your loggers so that they won’t allow setLevel, but, I really don’t see why would you do that.
Hope, this helps