log4Net的配置文章一搜一大把,配置使用还是有一些点花费了很多时间,这里整理一下,添上坑,让Developer走的更稳。
编程式配置路径
新建一个配置文件,通过写代码来动态加载log4Net的配置文件。
class Program
{
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Environment.CurrentDirectory + @"\" + "Log4Net.config"));
ILog logger = LogManager.GetLogger("loggerAX");
//logger.IsDebugEnabled
logger.Warn("Test Logger");
}
}
两点:
1. 就是在载入log的时候,路径需要小心,要么是将文件属性配置为复制到到编译路径(Copy always);如果不配置文件“copy always”,就需要调整加载的路径,使之能够加载到文件;Environment.CurrentDirectory 返回的是Debug或者release路径。
2.加载方式为:
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Environment.CurrentDirectory + @"\" + "Log4Net.config"));
系统配置文件配置
所谓系统配置文件就是利用C#中固有的配置文件(web.config,app.config)来进行配置,而不是新建一个配置文件。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"></section>
</configSections>
<log4net>
<root name="loggerAX">
…
</configuration>
代码如下:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace MonitorTester
{
class Program
{
static void Main(string[] args)
{
ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
logger.Error("Test Logger");
}
}
}
两点需要注意一下:
1.添加声明,如果没有这个声明,log对象返回的各个级别(DEBUG~OFF)都将是false;另外你在什么哪个类里面调用“LogManager.GetLogger()”,就在那个类的namespace上面添加这个声明。
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
2.代码加载的方式
ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
Log4Net的输出模式
- log4X是可以打印出函数名称的,打印模式%M就是输出函数名称;这样其实就不需要自己封装底层函数来获取当前函数名称;但是有一点:不能对log4x进行封装了,因为log4x默认输出方法名称是调用ILog接口的第一层函数,封装一层(loggerMan)将会导致%M取得是loggerMan的函数名称;
- 在配置模式匹配的时候,如果想要添加单词,可以直接写,模式匹配是以%开始,空格结束的,所以%前面的字母会被原封不动的保留下来:%d %p [TID: %t] %c(Line:%L) - [%M]%n
注:%d:日期;%p:优先级(INFO/debug/warning);%T:进程号;%L:打印发生时类文件的行数;%n:换行
以上,是配置log4Net的关注点;但是为什么不使用Enterprise Library里面的logger呢?还有可视化工具帮助配置。log4Net的优势就是小巧,需要引入就是一个dll。但是对于EL而言,关联引用的dll就是一堆了。所以如果项目中成套使用EL,那么logger还是使用EL的,否则的化,使用小巧轻便的log4Net吧。