1

I have Log4net configuration in app.config file with the file name set as a property as shown below. But On loading the application, files with name '(null)' are getting created.

I have removed [assembly: log4net.Config.XmlConfigurator(Watch = true)] from AssemblyInfo.cs file also. Still I am facing the issue.

<logger name="ReportLogger">
  <appender-ref ref="RollingFileAppender2" />
  <level value="ALL" />
</logger>
<appender name="RollingFileAppender2" 
type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" 
 value="C:\MyApplicationLogs\%property{ReportName}.log" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <!--<datePattern value="yyyyMMdd-HHmm" />-->
  <maxSizeRollBackups value="10000" />
  <maximumFileSize value="1MB" />
  <countDirection value="1"/>
  <immediateFlush value="true" />
  <appendToFile value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%message%n" />
  </layout>
  </appender>

And my code is as follows:

    public void LogReport(object msg, string filename, string date)
    {
        ReportMsglogger = LogManager.GetLogger("ReportLogger");

        string AppLogFileName = GetTextReportFileName(filename, date);

        try
        {
            if (!String.IsNullOrEmpty(AppLogFileName))
            {
                log4net.Repository.ILoggerRepository loggerRepository2 = LogManager.CreateRepository(AppLogFileName + "Repository");
                ThreadContext.Properties["ReportName"] = AppLogFileName;
                log4net.Config.XmlConfigurator.Configure(loggerRepository2);
            }
        }
        catch (Exception ex) { }

        ReportMsglogger = LogManager.GetLogger(AppLogFileName + "Repository", "ReportLogger");

        ReportMsglogger.Info(msg);
    }

Can someone tell me what is wrong here.

Cherylaksh
  • 248
  • 5
  • 20
  • Did you add this ? `private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);` – taktak Jul 30 '19 at 11:40

2 Answers2

1

Make sure to assign a value to ThreadContext.Properties["ReportName"] before you make any Log4net related call.

The code in your question makes a call to ReportMsglogger = LogManager.GetLogger("ReportLogger"); before initializing ThreadContext.Properties["ReportName"].
Because of this, the name of the file will be (null).

Also ensure to initialize Log4net only once. log4net.Config.XmlConfigurator.Configure(loggerRepository2); must not be called multiple times.

The code below shows the correct order about how to set the file name, initialize Log4net and log a message.

// Set log file name.
string AppLogFileName = "MyLogFile"; // Retrieve from GetTextReportFileName(...)
ThreadContext.Properties["ReportName"] = AppLogFileName;

// Set up Log4net.
ILoggerRepository repository = log4net.LogManager.GetRepository(Assembly.GetCallingAssembly());
XmlConfigurator.Configure(repository);

// Log a message.
var logger = LogManager.GetLogger("ReportLogger");
logger.Info("Hello world");
pfx
  • 20,323
  • 43
  • 37
  • 57
0

Your log4net config appears to be not well configured. Here is my config (web.config) :

<log4net debug="true">
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="\\Path\\To\\Your\\File.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
      </layout>
    </appender>

    <root>
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
  </log4net>

Then add this on your code files :

private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Now, you'll have to call Log in your methods like this :

Log.Info(MethodBase.GetCurrentMethod().Name);

Try this and tell me if it works

taktak
  • 90
  • 10
  • Tried this. Its not working. Still null files are being created when application loads. – Cherylaksh Jul 30 '19 at 11:58
  • Also, My problem is when I dynamically create file using 'property' like in here - this problem happens. When the application loads, my reportname string is not assigned any value. – Cherylaksh Jul 30 '19 at 12:02
  • you can also refer to this : https://stackoverflow.com/questions/19116854/log4net-c4-0-null-in-output/19117013 – taktak Jul 30 '19 at 12:07