In my current project I'm using two libraries where one is using log4net and the other NLog for its logging. I'm personally prefer NLog so it is used in my application as well.
I'm not knowing much about log4net so I'm asking what would be the best way to programmatically forward all the messages from log4net to NLog.
There is a post about a log4net forwarder at the NLog forum but it looks like no one had done this before.
create a custom log4net Appender that logs the messages to a nlog logger. this may be at least the solution if you just want to pass the log information to nlog instead of replacing all occurences of log4net logging with nlog.
look here, here and here
Basically you'll need a log4net appender (log4net.Appender.IAppender
) which would delegate all DoAppend
calls to NLogs' Logger
or Target
.
I'm trying to do this tonight. I see Commons.Logging says it has bi-directional event routing between logging libraries.
Main()
initialize log4net using log4net.Config.XmlConfigurator.Configure();
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets async="true">
<target name="file" xsi:type="File" fileName="d:\logs\app1\logging.txt"/>
<target name="console" xsi:type="ColoredConsole" />
</targets>
<rules>
<logger name="*" writeTo="file"/>
<logger name="*" writeTo="console"/>
</rules>
</nlog>
<common>
<logging>
<factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog">
<arg key="configType" value="INLINE" />
</factoryAdapter>
</logging>
</common>
<log4net>
<!-- Commons.Logging will bridge the log4net messages to NLog, required to see TopShelf log messages -->
<appender name="CommonLoggingAppender" type="Common.Logging.Log4Net.CommonLoggingAppender, Common.Logging.Log4Net">
<layout type="log4net.Layout.PatternLayout, log4net">
<param name="ConversionPattern" value="%level - %class.%method: %message" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="CommonLoggingAppender" />
</root>
</log4net>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
References: Common.Logging Bridging Logging Systems
Full bi-directional event routing support for Entlib 3.1, EntLib 4.1, log4net 1.2.9, log4net 1.2.10 and NLog logging
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With