在學習log4net之后,想搭建一個簡單的向控制台程序輸入日志的log4net配置。沒有創建新的config或xml配置Log4net,而是使用控制台生成的App.config中進行配置。配置信息如下:
<configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <!-- Set default logging level to DEBUG --> <root> <level value="DEBUG" /> <appender-ref ref="ConsoleAppender" /> </root> <!-- Set logging for Spring to INFO. Logger names in Spring correspond to the namespace --> <logger name="Spring"> <level value="INFO" /> </logger> </log4net> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
如貼圖代碼,我在configSections節點中,添加了一個section節點,名字是log4net.,來配置Logger.同時在下面配置了對應的log4net節點。為了將配置數據嵌入到.config文件中,必須使用configSectins元素將節點名稱標識到.NET配置文件解析器中。該部分必須指定log4net.Config.Log4NetConfigurationSectionHandler 將用於解析配置部分。此類型必須完全符合組裝要求,因為它是由.NET配置文件解析器而不是log4net加載的。必須為log4net程序集指定正確的程序集名稱。根據以上配置,我在Main中直接加載配置,獲取一個logger日志寫入器。但是,就出現了標題所說的問題,查閱很多資料,和查看log4net 網站,始終無法解決。
public static void Main(string[] args) { XmlConfigurator.Configure(); ILog log = LogManager.GetLogger(typeof(Program)); IApplicationContext context = ContextRegistry.GetContext(); Person per = (Person)context.GetObject("MyFirstNetIOC"); per.setMethod("林"); MovieLister ls = (MovieLister)context.GetObject("MyMoveList"); log.Debug("開始"); ls.GetMoves(1); }
於是我決定換一種寫法,重新寫入一個log4net.config配置。在原app.config文件中,使用應用程序文件配置文件的appSettings部分的設置,來覆蓋程序集屬性中給出的值。帶有鍵log.Config的設置將覆蓋配置文件名(並且被認為是相對於應用程序的基本目錄)。帶有log.Config.Watch的設置,確定是否監視文件的修改。看代碼:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="log4net.Config" value="Config/log4net.config"/> <add key="log4net.Config.Watch" value="True"/> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
顯然,帶有鍵log4net.Config覆蓋了程序集屬性中給出的值,value值覆蓋了配置文件名。新的Log4net配置文件是:Config目錄下的log4net.config文件。看log4net.config文件中的代碼。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <root> <level value="DEBUG"/> <appender-ref ref="ConsoleAppender" /> </root> </log4net> </configuration>
上述代碼中。使用configSectins元素將節點名稱標識到.NET配置文件解析器中。該部分必須指定log4net.Config.Log4NetConfigurationSectionHandler 將用於解析配置部分。此類型必須完全符合組裝要求,因為它是由.NET配置文件解析器而不是log4net加載的。實現了簡單的向控制台打印日志功能,
控制台應用程序:
namespace SpringNetIOC { class Program { private readonly static ILog log = LogManager.GetLogger(typeof(Program)); public static void Main(string[] args) { log.Debug("測試"); Console.ReadKey(); } } }
運行結果:
2020-07-08 11:39:51,661 [1] DEBUG SpringNetIOC.Program - 測試
總結:
坑點一:新添加的lof4net.config的屬性如果沒有做設置,使用的默認的運行,也會出現IsErrorEnabled = false等情況。設置如下:
默認情況如圖一:
需要將不復制修改成如下圖,否在出現標題所述情況。