В комментариях к прошлой статье про log4net задал мне товарищ следующий вопрос:
Вопрос: ты знаешь, как заставить log4net создавать лог-файлы для каждого экземпляра интерфейса ILog? Т.е. есть у меня static log4net.ILog log = log4net.LogManager.GetLogger("My_mega_logger"); Теперь я хочу, чтобы лог-файл назывался "log_My_mega_logger.log".
Я подумала-подумала, да и придумала решение. Заодно, кажется, разгадала секрет, зачем в конфиге нужен элемент logger
. Итак, вот что получилось.
Для примера я создаю консольное приложение, и цепляю в References библиотеку log4net.
App.config
Добавляем в проект конфигурационный файл и пишем в нем, например, такое
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net debug="true"> <appender name="SomeAppender" type="log4net.Appender.RollingFileAppender"> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <file value="Logs\some.log" /> ... <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-5p [%d] [%M] %m%n" /> </layout> </appender> <appender name="OtherAppender" type="log4net.Appender.RollingFileAppender"> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <file value="Logs\other.log" /> ... <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-5p [%d] [%M] %m%n" /> </layout> </appender> <root> <level value="ALL" /> </root> <logger name="SomeLogger"> <level value="ALL" /> <appender-ref ref="SomeAppender" /> </logger> <logger name="OtherLogger"> <level value="ALL" /> <appender-ref ref="OtherAppender" /> </logger> </log4net> <appSettings> <add key="log4net.Internal.Quiet" value="true" /> </appSettings> </configuration>
Т.е. мы определили два Appender-а, которые завязаны на разные файлы, и два Logger-а, которые по-разному называются и завязаны на соответствующие Appender-ы.
В приложении
Класс нашего консольного приложения может выглядеть так:
class Program { private static readonly ILog someLog = LogManager.GetLogger("SomeLogger"); private static readonly ILog otherLog = LogManager.GetLogger("OtherLogger"); static void Main(string[] args) { XmlConfigurator.Configure(); someLog.Debug("Some message"); otherLog.Debug("Other message"); } }
Немного по-индийски, но, в общем, работает. Когда программа отработает, одно сообщение запишется в один файл, другое - в другой.