Question

My root logger catches all levels of log except off. My level is set to INFO. I searched if the level was changed somewhere, but I found nothing.

When I put the logger IBatisNet.DataMapper.Commands.DefaultPreparedCommand to DEBUG, the log is created in a text file by SpecificAppender. But, the log also appears in the console even if the root is set to INFO.

This is my code:

<?xml version="1.0" encoding="utf-8" ?>
<!-- This section contains the log4net configuration settings -->
<configuration>
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,     log4net" />
</configSections>
<log4net>
    <!-- Define some output appenders -->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="d:/logs/vol/vol.log" />
        <param name="AppendToFile" value="true" />
        <param name="MaxSizeRollBackups" value="3" />
        <param name="MaximumFileSize" value="500KB" />
        <param name="RollingStyle" value="Size" />
        <param name="StaticLogFileName" value="true" />

        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%d{HH:mm:ss,fff} [%t] %-5p %c{1} - %m%n" />
        </layout>
    </appender>

    <appender name="IBatisAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="d:/logs/vol/IBatis.log" />
        <param name="AppendToFile" value="true" />
        <param name="MaxSizeRollBackups" value="3" />
        <param name="MaximumFileSize" value="1000KB" />
        <param name="RollingStyle" value="Size" />
        <param name="StaticLogFileName" value="true" />

        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%d{HH:mm:ss,fff} [%t] %-5p %c{1} - %m%n" />
        </layout>
    </appender>

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%d{HH:mm:ss,fff} [%t] %-5p %c{1} - %m%n" />
        </layout>
    </appender>

    <appender name="IBatisBufferingAppender" type="log4net.Appender.BufferingForwardingAppender" >
        <bufferSize value="60"/>
        <appender-ref ref="IBatisAppender" />
    </appender>

    <appender name="LogBufferingAppender" type="log4net.Appender.BufferingForwardingAppender" >
        <bufferSize value="60"/>
        <appender-ref ref="RollingLogFileAppender" />
    </appender>

    <appender name="SpecificAppender" type="log4net.Appender.RollingFileAppender">
        <file value="d:/logs/vol/" />
        <appendToFile value="true"/>
        <datePattern value="Volu\me\trieSpeci\fic_yyyy-MM-dd.lo\g"/>
        <rollingStyle value="Date"/>
        <maxSizeRollBackups value="30"/>
        <appendToFile value="true"/>
        <staticLogFileName value="false"/>
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%d{HH:mm:SS,fff} [%t] %-5p %c{1} - %m%n" />
        </layout>
        <filter type="log4net.Filter.StringMatchFilter">
            <stringToMatch value="No -->"/>
            <acceptOnMatch value ="true" />
        </filter>
        <filter type="log4net.Filter.StringMatchFilter">
            <stringToMatch value="Statement Id: [vol.Delete"/>
            <acceptOnMatch value ="false" />
        </filter>
        <filter type="log4net.Filter.StringMatchFilter">
            <stringToMatch value="] Types: ["/>
            <acceptOnMatch value ="false" />
        </filter>
        <filter type="log4net.Filter.StringMatchFilter">
            <stringToMatch value="Statement Id: [vol."/>
            <acceptOnMatch value ="true" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter"/>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="ConsoleAppender" />
        <appender-ref ref="LogBufferingAppender" />
    </root>

    <logger name="PROGvolBatch.Services.CIService">
        <level value="INFO" />
        <appender-ref ref="SpecificAppender"/>
    </logger>

    <logger name="IBatisNet.DataMapper.Commands.DefaultPreparedCommand">
        <level value="DEBUG" />
        <appender-ref ref="SpecificAppender"/>
    </logger>

    <logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel">
        <level value="OFF" />
        <appender-ref ref="IBatisBufferingAppender" />
    </logger>
    <logger name="IBatisNet.DataMapper.LazyLoadList">
        <level value="OFF" />
        <appender-ref ref="IBatisBufferingAppender" />
    </logger>
    <logger name="IBatisNet.DataMapper.SqlMapSession">
        <level value="OFF" />
        <appender-ref ref="IBatisBufferingAppender" />
    </logger>
    <logger name="IBatisNet.Common.Transaction.TransactionScope">
        <level value="OFF" />
        <appender-ref ref="IBatisBufferingAppender" />
    </logger>
    <logger name="IBatisNet.DataAccess.DaoSession">
        <level value="OFF" />
        <appender-ref ref="IBatisBufferingAppender" />
    </logger>
    <logger name="IBatisNet.DataAccess.Configuration.DaoProxy">
        <level value="OFF" />
        <appender-ref ref="IBatisBufferingAppender" />
    </logger>
    <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory">
        <level value="OFF" />
        <appender-ref ref="IBatisBufferingAppender" />
    </logger>
    <logger name="IBatisNet.DataMapper.Commands.IPreparedCommand">
        <level value="OFF" />
        <appender-ref ref="IBatisBufferingAppender" />
    </logger>
</log4net>

I tried changing the level of the root to something else, but I always got the same result.

Was it helpful?

Solution

This appears to be the way log4net works. When your config file is processed it behaves as if it has been configured like:

<logger name="IBatisNet.DataMapper.Commands.DefaultPreparedCommand" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="SpecificAppender"/>
    <appender-ref ref="ConsoleAppender" />
    <appender-ref ref="LogBufferingAppender" />
</logger>

Fortunately there is a workaround and that is to set a level filter on your appenders, e.g. for the ConsoleAppender:

 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%d{HH:mm:ss,fff} [%t] %-5p %c{1} - %m%n" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="INFO" />
    <acceptOnMatch value="true" />
  </filter>    
</appender>

It might also be better to rename the appender to something more descriptive like InfoConsoleAppender. Also, if you want to be able to log some loggers to console at debug level, then you may need another un-filtered ConsoleAppender.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top