1

My MVC application uses log4net for server logging and I just added jsnlog.log4net for javascript logging. I followed the official guide to configure it and it's working perfectly. And I didn't do any changes to log4net.config file.

Now both log4net and jsnlog use same txt file to log their logs. I need to separate there logs to two different files. So that I can easily identify server logs and javascript logs.

Here is my log4net.config file.

<?xml version="1.0" encoding="utf-8" ?>
<log4netConfiguration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <appSettings>
    <add key="log4net.Config" value="log4net.config" />
  </appSettings>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="C:\buttonwood_logs\buttonwood_web_log\buttonwood_log_%date{ddMMyyyy}.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="5MB" />
      <datePattern value="yyyyMMdd" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%4t %d{ABSOLUTE} %-5p %m%n"/> 
      </layout>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>
</log4netConfiguration>
stuartd
  • 70,509
  • 14
  • 132
  • 163
cp100
  • 1,463
  • 6
  • 20
  • 35

3 Answers3

1

To log to two files you need to have two appenders, and a logger for each one.

As you've got a root element defined in your config, the easiest way is to set up a specific logger for your JavaScript code, and let everything else go to the existing appender:

<!-- additivity=false means "don't inherit appenders from the root logger" -->
<logger name="JSLogger" additivity="false"> 
  <level value="INFO" />
  <appender-ref ref="JSFileAppender" />
</logger>

Then set up the appender:

<appender name="JSFileAppender" type="log4net.Appender.RollingFileAppender">
        <file type="log4net.Util.PatternString" 
             value="C:\buttonwood_logs\jslog\buttonwood_log_%date{ddMMyyyy}.log" />
        … etc.

When you create the logger in jsnlog then you must then reference it by name, e.g. GetLogger("JSLogger")

stuartd
  • 70,509
  • 14
  • 132
  • 163
0

In your webconfig.

<jsnlog  serverSideLogger="ClientLog">

In your log4net tag

<log4net>
<appender name="JSFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="..\Log\Client.log" />
  <appendToFile value="true" />
  <maximumFileSize value="100MB" />
  <maxSizeRollBackups value="5" />
  <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d %level %thread - %message%newline" />
  </layout>
</appender> 


<logger name="ClientLog" additivity="false"> 
    <level value="DEBUG" />
    <appender-ref ref="JSFileAppender" />
</logger>
</log4net>

The logger name must have the same value as jsnlog serverSideLogger config

-1

Try something like this: (for more info see codeproject article - Use Multiple log4net Outputs from One Application)

<log4net>
    <appender type="log4net.Appender.RollingFileAppender" name="classApp1">
      <file value="c:\\Library1.txt" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionpattern value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>

    <appender type="log4net.Appender.RollingFileAppender" name="classApp2">
      <file value="c:\\Library2.txt" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionpattern value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>

    <appender type="log4net.Appender.RollingFileAppender" name="application">
      <file value="c:\\Application.txt" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionpattern value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>

    <logger name="ClassLibrary1">
      <level value="ERROR" />
      <maximumfilesize value="256KB" />
      <param value="ERROR" name="Threshold" />

      <appender-ref ref="classApp1" />
    </logger>

    <logger name="ClassLibrary2">
      <level value="WARN" />
      <maximumfilesize value="256KB" />
      <param value="WARN" name="Threshold" />

      <appender-ref ref="classApp2" />
    </logger>

    <logger name="WindowsApplication1">
      <level value="WARN" />
      <maximumfilesize value="256KB" />
      <param value="WARN" name="Threshold" />

      <appender-ref ref="application" />
    </logger>

  </log4net>
Alexander V.
  • 1,518
  • 14
  • 14
  • Loggers don't have a `maximumfilesize` property, and you wouldn't really want to use the `param` syntax when you can set properties directly. Perhaps in 2007 when the article was written it was different. – stuartd Mar 18 '16 at 15:35
  • Perhaps, but blindly pasting invalid config which mixes properties from loggers and appenders is not helpful (loggers don't have a `Threshold` property either). – stuartd Mar 18 '16 at 16:00