log4net - ведение журнала для библиотеки dll, вызываемой через COM-взаимодействие
-
05-07-2019 - |
Вопрос
Я написал .NET DLL, которая вызывается из другого приложения с использованием COM-взаимодействия.Я бы хотел использовать log4net, но мне нужно указать расположение файла журнала во время выполнения из другого приложения.
Я всегда использовал log4net самым простым из возможных способов для проекта WinForms, но поскольку у проекта DLL нет app.config, и у моего вызывающего приложения также его нет (это даже не .NET), я попытался немного почитать о том, как работает log4net, и попытался установить его вообще без использования файла .config.
Я довел его до стадии, когда он компилируется и вроде как соответствует моему крошечному пониманию log4net, но он не записывает данные в файл журнала.
Вот что у меня есть на данный момент, может кто-нибудь указать на мои вопиющие ошибки / заблуждения или же подсказать мне лучший способ входа в систему из моей dll?
private log4net.Core.ILogger _ilogger;
private ILog _logger;
public void Initialize(String LogFileName)
{
log4net.Repository.ILoggerRepository Repo = null;
try {
Repo = log4net.LogManager.GetRepository(Assembly.GetExecutingAssembly().FullName);
} catch (log4net.Core.LogException) {
//ignore, domain not yet created
}
if (Repo == null) {
Repo = log4net.LogManager.CreateRepository(Assembly.GetExecutingAssembly().FullName);
log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender();
appender.Layout = new log4net.Layout.PatternLayout("%d - %m%n");
appender.File = LogFileName;
appender.MaxSizeRollBackups = 10;
appender.MaximumFileSize = "100MB";
appender.AppendToFile = true;
appender.Threshold = log4net.Core.Level.Debug; //NEW: set level to Debug
appender.ActivateOptions();
Repo.Threshold = log4net.Core.Level.Debug; //NEW: set level to Debug
log4net.Config.BasicConfigurator.Configure(Repo, appender);
}
// This doesn't seem to create the interface I need for logging
_ilogger = Repo.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName);
// This doesn't seem to write to the log file for some reason.
_logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName);
_logger.Debug("Application started");
}
Спасибо!
Решение
Редактировать- Обновить.Перечитайте вопрос.Похоже, тебе просто нужно вызовите перегруженную версию этого (передавая подробную информацию о файле конфигурации) - вы в основном просто хотите настроить ведение журнала из COM DLL?
В шутку я загуглил log4com и нашел это.Я им не пользовался, но, возможно, оно того стоит посмотрите!
Другие советы
Я думаю, ответ был в том, что мне вообще не нужен был новый репозиторий.Я просто слишком все усложнял.Эта сокращенная версия, кажется, работает нормально:
public void Initialize(String LogFileName)
{
log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender();
appender.Layout = new log4net.Layout.PatternLayout("%d - %m%n");
appender.File = LogFileName;
appender.MaxSizeRollBackups = 10;
appender.MaximumFileSize = "100MB";
appender.AppendToFile = true;
appender.Threshold = log4net.Core.Level.Debug;
appender.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(appender);
_logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName);
_logger.Debug("Application started");
}
Попробуйте явно установить уровень для ОТЛАДКИ как в вашем регистраторе, так и в приложении.