Log4net не работает - asp.net mvc
Моя конфигурация log4net такая,
<?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:\my_logs/my_web_logs/my_log_%date{ddMMyyyy}.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="30MB" />
<datePattern value="yyyyMMdd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%4t %d{ABSOLUTE} %-5p %m%n"/>
<!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />-->
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</log4netConfiguration>
У меня есть класс помощника Logger, как,
public static class Logger
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static log4net.ILog Log
{
get { return log; }
}
}
В моей информации о сборке у меня есть эта запись,
// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
log4net.config - это файл конфигурации, добавленный в веб-проект.
В коде, который я регистрирую, используя класс logger,
Logger.Log.Info("User visits Sign In Page.");
Регистрация работала, когда я установил вышеупомянутую настройку. Но вдруг регистрация перестала работать. Но когда я создал новый веб-сайт asp.net mvc с указанными выше настройками, регистрация работала для этого. Я пробовал с IIS Express и локальным IIS. В обоих случаях ведение журнала работает для тестового приложения, которое я создал.
Я не могу понять, почему это не логи? Как я могу диагностировать это? Каковы возможные проблемы?
3 ответа
Решил сам, причина была "по какой-то причине", конфигурация log4net не была загружена из информации о сборке. Тем не менее я не знаю, почему это происходит.
Я перепробовал так много исправлений, предложенных разными постами. Наконец-то исправили проблему. Решение, упомянутое в этом посте, помогло мне решить проблему.
Я добавил следующую конфигурацию,
<!--These settings load the log4net configuration.-->
<add key="log4net.Config" value="log4net.config"/>
<add key="log4net.Config.Watch" value="True"/>
Начинается регистрация!
Затем я удалил следующую строку из информации о сборке,
// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
Я обнаружил, что log4net не будет загружать конфигурацию webconfig, если вы не вызовете log4net.Config.XmlConfigurator.Configure(); на старте.
protected void Application_Start()
{
// your other codes
log4net.Config.XmlConfigurator.Configure(); // must have this line
Logger = log4net.LogManager.GetLogger(typeof(MvcApplication));
}
Причина в том, что Log4Net пытается загрузить конфигурацию из сборки, которая сначала использует LogManager.GetLogger()
, Если это одна из ваших библиотек классов, она просто проигнорирует атрибут во всех других сборках.
Самый простой способ исправить это - вызвать LogManager
в вашем стартовом файле (как Program.cs
или же Global.asax
):
var logger = LogManager.GetLogger(typeof(Program));
logger.Info("Application started.");
//rest of app init.
Делая это, вы получите ожидаемое поведение с атрибутом сборки.
У меня была аналогичная проблема: я не получал никаких журналов, когда запускал свою сборку из IIS или IISExpress.
Однако ни один из приведенных выше ответов не помог мне.
В моем случае решение заключалось в том, чтобы указать путь к файлу конфигурации как абсолютный путь. Оказалось, что IISExpress не устанавливает текущий каталог в папку bin, и log4net не может найти файл конфигурации, поэтому мне пришлось использовать этот обходной путь:
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
// remove file:// part from uri
UriBuilder ub = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(ub.Path);
var fi = new FileInfo(Path.Combine(Path.GetDirectoryName(path), "Logging.config.xml"));
if (fi.Exists)
{
log4net.Config.XmlConfigurator.ConfigureAndWatch(fi);
var logger = log4net.LogManager.GetLogger(typeof(WebApiApplication));
logger.Info("Application started.");
}
else
{
throw new FileNotFoundException("log4net config file not found", fi.FullName);
}