ASP.NET Core 2.1 + Log4Net - log4net

I'm using log4net in ASP.NET Core 2.1 project, I don't know why I'm getting log messages duplicated, here is my log4net.config configuration
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="app_data/log/%property{LogName}" />
<rollingStyle value="Date" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<datePattern value="yyyyMMdd" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10000KB" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value=" %-5level %date{dd-mm-yyyy HH:mm:ss} %logger [%thread] - %message %exception%newline" />
</layout>
</appender>
<root>
<appender-ref ref="RollingFileAppender" />
<level value="All" />
</root>
</log4net>
here is my service where i create the log name dynamicaly
fileName = "/" + DateTime.Today.Year + "-" + ((DateTime.Today.Month.ToString().Length == 1) ? "0" : "") + DateTime.Today.Month + "-" +
((DateTime.Today.Day.ToString().Length == 1) ? "0" : "") + DateTime.Today.Day + "/"
+ society + "/" + fileName + ".log";
log4net.GlobalContext.Properties["LogName"] = fileName;
_loggerFactory.AddLog4Net(_configuration.GetValue<string>("Log4NetConfigFile:Name"));
I dont know where is the problem exactly

Related

Back up Log file with different extension

I am using below config file for log generation
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
<log4net>
<appender name="TestLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="${ALLUSERSPROFILE}////Logs//Test.log" />
<appendToFile value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="5MB" />
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="TestLogFileAppender"/>
</root>
<logger additivity="false" name="TestLogger">
<appender-ref ref="TestLogFileAppender"/>
</logger>
</log4net>
</configuration>
My expectation is to get the log file in below format
Current Log file name Test.log.
When it reaches to 5MB, expecting back up file name as below
Test_1.bak
:
"
:
:
Test_10.bak

log4net with asp.net core 2

i'm using log4net to create log files dynamicaly , i tried the following steps here http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx but i'm getting (null).txt file , Here is my log4net.config file
`<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="app_data/log/%date{yyyy-MM-dd}/%property{LogName}.txt" />
<rollingStyle value="Date" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<datePattern value="yyyyMMdd" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value=" %-5level %date{dd-mm-yyyy HH:mm:ss} %logger [%thread] - %message %exception%newline%property{LogName}" />
</layout>
</appender>
<root>
<appender-ref ref="RollingFileAppender" />
<level value="All" />
</root>
</log4net>`
and this is my test code
log4net.GlobalContext.Properties["LogName"] = "xx#xx.xx";
As i said i'm getting (null).txt FileName instead of xx#xx.xx.txt , thanks for helping
I just tested your code and its working just fine, so I can only assume, that you are assigning your GlobalContext property to late. Remember, to set it before you call XmlConfigurator.Configure method. Set it up in your Program.cs file like this:
public static class Program
{
public static void Main(string[] args)
{
// ...
GlobalContext.Properties["LogName"] = "xx#xx.xx";
XmlConfigurator.Configure(new FileInfo("log4net.config"));
// ...
}
}

Why my initialized object of Log4Net have all levels properties as false?

I use Castle.Windsor and Log4Net for initialize my Logger.
My log4net.config:
<?xml version="1.0"?>
<configuration>
<log4net>
<appender name="AllMessagesFile" type="log4net.Appender.RollingFileAppender,log4net">
<file value="Logs/Log.log" />
<level value="ALL" />
<encoding value="utf-8" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maximumFileSize value="100000KB" />
<maxSizeRollBackups value="-1" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d %identity [%t] %-5p %c{1}.%M %m%n" />
<IgnoresException value="False" />
</layout>
</appender>
<appender name="ErrorsOnlyFile" type="log4net.Appender.RollingFileAppender,log4net">
<file value="Logs/Error.log" />
<level value="ERROR" />
<encoding value="utf-8" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maximumFileSize value="100000KB" />
<maxSizeRollBackups value="-1" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d %identity [%t] %-5p %c{1}.%M %m%n" />
</layout>
</appender>
<root>
<priority value="ALL" />
<appender-ref ref="AllMessagesFile" />
<appender-ref ref="ErrorsOnlyFile" />
</root>
</log4net>
</configuration>
My AssamblyInfo.cs have foolow row:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
In constructor of class I got object via Winsdor:
public class ACIStart
{
private ILogger Logger { get; set; }
public ACIStart(ILogger logger)
{
Logger = logger;
}
I don't have any exceptions, I just got a logger with all properties (IsDebbugEnabled, IsErrorEnabled ... ) as false.
My log no write anything to log file.
What could be the problem?
It could be that you need to add the loglevel in you root node:
<root>
<level value="DEBUG" />
...

date in the log file name

I want my logfile to end up like this :
2015-04-23.log (YYMMDD.log)
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</root>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="logs\CTI\ServiceName" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="20MB" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" />
</layout>
</appender>
After running the code, the log file comes up as ServiceName_2015-04-23.log.2015-04-23.
What is the issue?
The appender should look like this:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\CTI\ServiceName\" />
<datePattern value="yyyy-MM-dd'.log'" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="20MB" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" />
</layout>
</appender>
The key is the datePattern where we add '.log' to the pattern.
Two years later... Better late than never.
You use rollingStyle=date, so log4net adds date in the end of file name.
You can find useful config examples for RollingFileAppender class here.

how to configure static log file name with compositely named roll backups

I used this config but a date is always added to the current file ('log.20130805.0.log').
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs/logFile.log" />
<appendToFile value="true" />
<preserveLogFileNameExtension value="true" />
<rollingStyle value="Composite" />
<datePattern value=".yyyyMMdd" />
<maximumFileSize value="10MB" />
<countDirection value="1"/>
<maxSizeRollBackups value="-1" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
The result of that config is :
log.20130805.0.log
log.20130805.1.log
log.20130805.2.log
log.20130805.3.log
What I get with staticLogFileName = true is :
log.log
log.1.log
log.2.log
log.3.log
What I want is :
log.log
log.20130805.1.log
log.20130805.2.log
log.20130805.3.log
I know I'm late to the party, but I believe I have figured out how to use a composite RollingFileAppender properly. I'm posting it here for posterity, in case anyone stumbles upon this in a search:
<appender name="rollingfileappender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\logfile.log" />
<datePattern value=".yyyyMMdd" />
<preserveLogFileNameExtension value="true" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100Kb" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.DynamicPatternLayout">
<conversionPattern value="%[level] - %date - %message" />
</layout>
</appender>
The key here is:
<preserveLogFileNameExtension value="true" />
and
<staticLogFileName value="true" />
When your current log files are being appended, you'll see:
logfile.log
logfile.1.log
logfile.2.log
etc...
Once the new day hits, those should be renamed to:
logfile.20200623.log
logfile.20200623.1.log
logfile.20200623.2.log
etc...
and you'll have a new logfile.log, still catching your current logs.
You can use the function below.
This function first gets the file location that you set in web.config and after that you can add any path that you want! (like Date or Customer or...)
WebConfig:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\\t4\\"/>
<appendToFile value="true"/>
<rollingStyle value="Composite"/>
<datePattern value="_yyyy-MM-dd.lo'g'"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/>
</layout>
</appender>
Function:
public static void ChangeFileLocation(string _CustomerName,string _Project)
{
XmlConfigurator.Configure();
log4net.Repository.Hierarchy.Hierarchy h =(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
foreach (IAppender a in h.Root.Appenders)
{
if (a is FileAppender)
{
FileAppender fa = (FileAppender)a;
string sNowDate= DateTime.Now.ToLongDateString();
// Programmatically set this to the desired location here
string FileLocationinWebConfig = fa.File;
string logFileLocation = FileLocationinWebConfig + _Project + "\\" + CustomerName + "\\" + sNowDate + ".log";
fa.File = logFileLocation;
fa.ActivateOptions();
break;
}
}
}
and result is like this: C:\t4\TestProject\Customer1\Saturday, August 31, 2013.log
Based on these tips I guess it isn't possible, unfortunately (with the current implementation of RollingFileAppender):
http://geekswithblogs.net/rgupta/archive/2009/03/03/tips-on-using-log4net-rollingfileappender.aspx

Resources