Log4Net Message log - c#

I am trying to use log4net for my web service. the problem that I am facing is that, when I try to send multiple messages at the same time, it's only creating the log for the first message.
The log is working fine when we send only one message at a time and wait until the message has reached the listener. But when we shoot multiple messages at the same time (without waiting for the response at the listener), it's only logging the first message that I sent.
Here is my configuration. Can anyone please let me know what I am missing:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="ArchiveRollingFileAppender" />
<appender-ref ref="LogRollingFileAppender" />
</root>
<appender name="LogRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.PropertyFilter">
<key value="Source" />
<stringToMatch value="Log" />
</filter>
<threshold value="OFF"/>
<!--<lockingModel type="dndn.ebl.framework.logging.FileLock" />-->
<filter type="log4net.Filter.DenyAllFilter" />
<file type="log4net.Util.PatternString">
<conversionPattern value="{LogFileName}"/>
</file>
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} [%thread] %-5level [%property{method}] - %message%newline" />
</layout>
</appender>
<appender name="ArchiveRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.PropertyFilter">
<key value="Source" />
<stringToMatch value="Archive" />
</filter>
<threshold value="OFF"/>
<!--<lockingModel type="dndn.ebl.framework.logging.FileLock" />-->
<filter type="log4net.Filter.DenyAllFilter" />
<file type="log4net.Util.PatternString">
<conversionPattern value="{ArchiveFileName}"/>
</file>
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
</appender>
</log4net>
</configuration>

Did you try setting your lock model to
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

Related

In Log4Net all specified log folders are created but logging is not working for File Appender

I'm using Castle with Log4Net. All folders were created but logging information is not written to a text file.
Here is the config:
<add key="log4net.Internal.Debug" value="true"/>
<add key="log4net.Internal.Error" value="true"/>
<add key="log4net.Internal.Info" value="true"/>
<add key="log4net.Internal.Fatal" value="true"/>
<add key="log4net.Internal.Warn" value="true"/>
<appender name="debugAppender" type="log4net.Appender.RollingFileAppender,log4net">
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="DEBUG" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<file value="..\\..\\LOGS\\DEBUG\\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<staticLogFileName value="false" />
<DatePattern value="yyyy\\\\MM\\\\dd\\\\yyyyMMdd'_debug.txt'" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="50MB" />
<countDirection value="1" />
<preserveLogFileNameExtension value="true" />
<encoding value="utf-8" />
<!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
<layout type="log4net.Layout.PatternLayout,log4net">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>`
<logger name="Log">
<appender-ref ref="errorAppender" />
<appender-ref ref="infoAppender" />
<appender-ref ref="debugAppender" />
<appender-ref ref="warningAppender" />
<appender-ref ref="fatalAppender" />
</logger>`
I'm using console application for this, and the Main method will start like this:
XmlConfigurator.Configure(new FileInfo("log4net.config"));
And everyone has permission to write, read all files in LOGS folders.
I used your same configuration of course with little modification which you can try
I created a console application as yours:
Here is my Entry point:
public class Program
{
private static readonly log4net.ILog log
= log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
static void Main(string[] args)
{
XmlConfigurator.Configure(new FileInfo("..\\..\\log4net.config"));
log.Debug("Hi this is DEBUG from logging");
log.Info("This is information from logger");
log.Error("This is Error from logger");
Console.ReadLine();
}
}
And here is the configuration I used:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,
log4net"/>
</configSections>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ABSOLUTE}
[%thread] %level %logger - %message%newline"/>
</layout>
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="DEBUG" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
<appender name="debugAppender" type="log4net.Appender.RollingFileAppender,log4net">
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="DEBUG" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<file value="..\\..\\LOGS\\DEBUG\\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<staticLogFileName value="false" />
<DatePattern value="yyyy\\\\MM\\\\dd\\\\yyyyMMdd'_debug.txt'" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="50MB" />
<countDirection value="1" />
<preserveLogFileNameExtension value="true" />
<encoding value="utf-8" />
<!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
<layout type="log4net.Layout.PatternLayout,log4net">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
<!--<appender-ref ref="DebugOutputAppender" />-->
<appender-ref ref="debugAppender" />
</root>
</log4net>
</configuration>
You can notice I have added Console appender to check whether the logging is working as expected on the console before checking the log file.
Note: With the same configuration as yours I was not able to log any information in Console as well as file although the folder and the file were getting created without any issues.
The change I did is, added a root level element as pasted in the above configuration snippet.
You need to have one root section to house your top-level logger references. These are the loggers that inherit information from your base logger (root).
I have removed the additional loggers which you have used.
Sometimes you will want to know more about a particular part of your application. log4net anticipated this by allowing you to specify additional logger references beyond just the root logger. For example, here is an additional logger to log to the console messages that occur inside the OtherClass class object:
<logger name="Log4NetTest.OtherClass">
<level value="DEBUG"/>
<appender-ref ref="ConsoleAppender"/>
</logger>
Use it if you are really sure on this.
Good tutorial to start with log4net is here.
Let me know if you face any issues.

log4net not logging errors and fatal in separate file

I tried to separate the errors and fatal into separate log file not i dont see it logging in separate file. here is my config file. can you point what mistake i made?
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="C:\NinjaTraderLogs\NinjaLogs.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level (%property{method}) (%property{state}) (%property{instrument}) - %message%newline" />
</layout>
<level value="All" />
</appender>
<appender name="FatalError" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="C:\NinjaTraderLogs\NinjaLogs_Fatal.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level (%property{method}) (%property{state}) (%property{instrument}) - %message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<root>
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</configuration>
Create one more appender ref as below under <root>
<root>
<appender-ref ref="RollingFileAppender" />
<appender-ref ref="FatalError" />
</root>
Before you call your logging in code make sure to call the XmlConfigurator function Configure (call it globally) like
log4net.Config.XmlConfigurator.Configure();
Last but not least, make sure you have write permission to the directory you are trying to create log file. I would suggest you to check windows event log once Application log to see if any error has happened.

Log4net not writing logs to specified path

I am working with log for net i have below LOg4Net.config file code.But It is not writing logs to defined path .Am i doing anything wrong.Shall i miss anything??
Config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net debug="true">
<appender name="InfoRollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Temp\Logs\FileTransferService\Info.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="2MB" />
<staticLogFileName value="true" />
<!--<threshold value="INFO" />-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO"></levelMin>
<levelMax value="WARN"></levelMax>
</filter>
<filter class="log4net.Filter.DenyAllFilter"/>
</appender>
<appender name="ErrorRollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Temp\Logs\FileTransferService\Error.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="2MB" />
<staticLogFileName value="true" />
<!--<threshold value="ERROR" />-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR"></levelMin>
<levelMax value="FATAL"></levelMax>
</filter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="InfoRollingLogFileAppender" />
<appender-ref ref="ErrorRollingLogFileAppender" />
<appender-ref ref="trace" />
</root>
<!--<logger name="CustomLogger">
<level value="ALL" />
<appender-ref ref="InfoRollingLogFileAppender" />
<appender-ref ref="ErrorRollingLogFileAppender" />
<appender-ref ref="trace" />
</logger>-->
</log4net>
</configuration>
Assembly Info Code:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
Output Directory :
Copy always

Load only one appender instead of all

I'm currently working on a console C# app and I have to log two type of data :
All steps of the app in general (AppLog)
All information that I get from a service (MachineLog)
MachineLog needs 2 propeties, but when I start the app I do not define them I have some work to do before. But I need to log from start whith AppLog so at le beginning I use :
log4net.Config.XmlConfigurator.Configure();
And it create me the C:\DNC\Suivi\Logs.txt but also C:\DNC\Suivi\(null)\(null)-logs.txt
Is there any way to only load/configure AppLog and later MachineLog ?
I tried to add parameters to Configure() and all failed.
My App.config is :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="AppLog" />
</root>
<logger name="Machine" additivity="false">
<level value="ALL" />
<appender-ref ref="MachineLog" />
</logger>
<appender name="AppLog" type="log4net.Appender.RollingFileAppender">
<file value="C:\DNC\Suivi\Logs.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<appender name="MachineLog" type="log4net.Appender.RollingFileAppender" >
<file type="log4net.Util.PatternString" value="C:\DNC\Suivi\%property{Machine}\%property{ID}-logs.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
With your current configuration, you can't do it. As you have seen, log4net will create the log files when XmlConfigurator.Configure() is called.
In order to this, you will have to do at least some work programmatically, once you know where the file will be - it's quite easy to set the file name at runtime so you can have a placeholder file name in the config, then set the correct name at runtime when the values are known. This does mean that the empty placeholder file will exist - the only way around that would be to create the whole appender at runtime.

log4net is not creating log file to log

log4net is not creating any text file to log. I tried like this
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="EpinovaADSyncJob.log" />
<appendToFile value="false" />
<rollingStyle value="Composite" />
<staticLogFileName value="false" />
<datePattern value="yyyy-MM-dd" />
<preserveLogFileNameExtension value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" />
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="RollingFileAppender"/>
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
</configuration>
In assembly file:
[assembly: log4net.Config.XmlConfigurator(
ConfigFile = "Log4Net.config", Watch = true)]
Declared as class variable
private static readonly ILog Log = LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
In a method, called the Log like this
BasicConfigurator.Configure();
Log.Debug("Myjob");
Log.Error("newlkjasdf");
Log.Info("lkjlkjasdfasdf");
Try this appender :
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="false" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="10MB" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
</layout>

Categories