log4net 配置文件配置方法
转自:http://www.dozer.cc/2013/06/log4net-config-file-order/
最近把项目中所有的日志都改成了 log4net ,同事也蠢蠢欲动,用起了 log4net。
但是一个大坑扑面而来…
现象是这样的,同事有两个项目:
控制台引用程序:在 assembly 里配置了 log4net 的配置文件地址。
业务逻辑层:引用了 log4net 并写日志了。
然后日志始终无法输出!
之前我一直天真地以为,解决方案中任何一个项目只要加上了 [assembly: log4net.Config.XmlConfigurator(Watch=true)]就可以正确地加载配置了!
最后发现是业务逻辑层没有加上 assembly 这段代码,所以没有成功加载配置。
我自己的项目中在每个项目中都加上了,所以并没有问题。
那再进一步想想,如果多个项目中配置不同怎么办?
结果到底怎么样呢?于是便有了此文…
log4net 加载配置的几种方式
官方文档非常详细:http://logging.apache.org/log4net/release/manual/configuration.html
总结一下就是三种方式:
1、加assembly attribute
2、app.config中配置
3、显示调用
但是这三种方式之间有什么关系呢?E 文不好,也没看到官网上有详细的介绍。
所以,只能自己实践了。
Assembly Attribute
上面的三种方式并非独立,而是在隐约之中有着一些关联。
先说 assembly 方式,这个方法很简单,如果你只是一个简单的项目,那么在这个项目的 AssemblyInfo.cs文件上加上 [assembly:log4net.Config.XmlConfigurator(Watch=true)]即可。
至于上面参数的怎么用,直接参考文档即可。
上面这行的意思是直接从 app.config中读取配置即可。
但是同事的项目为什么没有生效呢?!很诡异有木有!
--------------------------------------------------------------------------------
后来经过研究后发现,当你的程序第一次调用 LogManager.GetLogger的时候,它就会从这个 dll 的 assembly 信息上读取相关的配置。
如果你的这个 dll 上没有加 assembly attribute,那么这个日志会输出失败。
更悲催的是,后面所有 dll 中的日志都会失败…
log4net 认为你根本就没想配置它…
同事的业务逻辑层没有加 assembly attribute,然后主程序虽然加了,但是主程序没有用 log4net。
---------------------------------------------------------------------------------
另外如果两个项目都加了 assembly attribute,并且配置的路径不同,那么会采用哪一个呢?
你第一次调用的 log 是哪一个 assembly 中的,就会启用哪一个,而且后面会一直用这个。
app.config 中配置
下面说说第二种方式,在配置文件中加配置:
XHTML <appSetting>
<add key="log4net.Config" value="log4net.config"/>
<add key="log4net.Config.Watch" value="True"/>
</appSetting>
官网说,如果你用了 assembly attribute 的配置方式,配置文件中的这两个节点会把 attribute 上的写死属性给覆盖。
官网这句话的意思是,一定要有了 attribute ,这两个配置才有效?但是我发现没有加 attribute 这两个配置也是有效的。
总之,这两个配置的优先级最高,如果你的各个项目中、或者引用了别人的 dll,都用了 attribute,加上这两个配置后,就可以把它们统一了,非常有用的配置!
显示调用
最后说说显示调用的方式:
C#
log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.xml"));
一般都是在程序的入口处加上这句话,这样就可以设置配置文件的位置了。
那大家肯定也会疑惑了,这种方式和上面两种方式的优先级是怎么样的?
经过实际测试后,我发现,就算已经加载了前面的配置,只要再次调用这种方式,配置都会变成新的。
也就是说,这种配置方法有绝对的控制权!
最终方案
OK,了解了他们的优先级和各种关系后,就要想想最终方案了。
我希望最终的方案可以满足一下条件:
、主程序引用子项目,子项目用了 log4net,主项目不用显示加载 log4net,只要加上配置即可,默认在 app.config 中;
、可以通过配置文件来修改 log4net 的配置位置;
、可以在程序运行中动态修改 log4net 配置(比如通过界面操作)。
嗯,如果要满足以上条件,那么就需要把上面三种方式配合起来使用了,我的建议是这样子的:
、所有用 log4net 的项目都加上 assembly attribute;
、如果配置在 app.config 中,不需要写任何而外的配置,如果配置在单独文件中,利用配置修改 log4net 配置位置;
、想要动态修改 log4net 配置路径的话,直接显示调用。
好了,最后的方案是不是很完美?
既符合“约定优于配置”的原则,也符合“灵活配置”的原则,完美了!
在类库的 assemblyInfo.cs中改为:
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
意思是:让log4net从应用程序的.config文件获取配置
假设有一个TestApp应用程序引用了上面类库,那么,按上面的修改,log4net将从TestApp.config文件获取配置。这样,你可以将原来类库app.config的内容移动到TestApp项目的app.confg中(TestApp项目编译后自动生成TestApp.config)。
log4net 配置文件配置方法的更多相关文章
- EasyPlayerPro windows播放器本地配置文件配置方法介绍
需求背景 应EasyPlayerPro某客户需求,在EasyPlayerPro启动时,自动播放指定的url源, 不需要每次都去手动填写, 且实现自动播放,不需要手动的单击播放按钮: 为响应该需求,特增 ...
- MySql互为主从配置文件及配置方法
# Example MySQL config file for medium systems. # # This is for a system with little memory (32M - 6 ...
- 将Log4net的配置配置到的独立文件中
本文转载:http://blog.csdn.net/wanzhuan2010/article/details/7587780 另外一篇博客:http://grim1980.blog.sohu.com/ ...
- 日志管理-将Log4net的配置配置到的独立文件中
转自:http://www.cnblogs.com/zfanlong1314/p/3662679.html使用log4net已经很久了.但从来没有详情了解log4的参数,及具体使用方法.看了周公的博客 ...
- shell 环境变量的相关配置文件和配置方法
shell 环境变量的相关配置文件和配置方法: bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 个人配置 ~/.bas ...
- log4net独立配置文件配置(winfrom)
log4net配置很多,具体配置步骤不细说,具体说出个人遇到的问题. 在winfrom和web应用程序中配置,在默认配置文件配置都没问题,因为EF也写在默认配置文件中,就会冲突解决办法就是将log4. ...
- Log4Net 日志配置[附带源码]
前述 园子里有许多人对log4net这款开源的日志记录控件有很多介绍.在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少查阅资料的时间.利用log4net可以方便地将日志信息记录 ...
- C# log4net 的配置
项目的日志组件是必备可少的,任何项目中都需要.这样既方便前期的开发测试也方便项目后期的项目维护.C#项目的一个不错的日志组件是log4net,下面我就把桌面应用程序.控制台程序.网站中log4net的 ...
- Log4Net.Config配置信息《转》
看了log4net的简单使用之一_log4net介绍 大家对log4net组件应该有了大概的了解,下面再近一步介绍其在项目中如何应用. 1.Logger 所有的记录器都必须实现 ILog 接口,该接口 ...
随机推荐
- fpga延时程序编写
//工匠小建 延时计数 100微妙计数 50M*0.00001-1 (个人理解:1s中50M次动作.那么100us多少次动作.做完这些动作就是延时)parameter delay_100us=16'd ...
- kubernetes之三 使用kubectl在k8s上部署应用
在上一篇中,我们学习了使用minikube来搭建k8s集群.k8s集群启动后,就可以在上面部署应用了.本篇,我们就来学习如何使用kubectl在k8s上部署应用. 学习之前,可以先从下面这篇博客上了解 ...
- 全文索引:部分词能查到,部分词查不到的bug
全文索引的概念:将存储在数据库中的整本书或整篇文章中的任意内容信息查找出来的技术.它可以根据需要获取全文中有关章,节,段,句,词等信息,也可以进行各种统计和分析. 原理是先定义一个词库,然后在文章中查 ...
- Bloom Filter的算法
Bloom Filter的算法: 为了降低冲突的概念,Bloom Filter使用了多个哈希函数,而不是一个.创建一个m位BitSet,先将所有位初始化为0,然后选择k个不同的哈希函数.第i个哈希函 ...
- HDU 5446 Unknown Treasure(lucas + 中国剩余定理 + 模拟乘法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 题目大意:求C(n, m) % M, 其中M为不同素数的乘积,即M=p1*p2*...*pk, ...
- Vue中 axios+QS 插件往后台传参
之前用Vue+element写了一个后台管理系统,在登录时使用axios请求数据传参时无法正常的获取数据.发现原因是传递参数要将参数序列化.这里使用了qs插件: 简单来说,qs 是一个增加了一些安全性 ...
- 华为云服务器centos7.3安装tomcat
1. 进入tomcat官网,复制下载地址 https://tomcat.apache.org/download-80.cgi#8.5.47 鼠标右键,复制链接地址:http://mirrors.tun ...
- WPF 远程显示原图 当前主页面 工具栏 一个Window页面的元素适用一个效果
http://www.jb51.net/article/98384.htm 1.wpf远程显示原图: Stretch="Fill" + ; 主要是因为那个950和650,据显示位置 ...
- mysql INNER JOIN关键字 语法
mysql INNER JOIN关键字 语法 作用:在表中存在至少一个匹配时,INNER JOIN 关键字返回行.大理石平台维修 语法:SELECT column_name(s) FROM table ...
- php reset()函数 语法
php reset()函数 语法 作用:将内部指针指向数组中的第一个元素,并输出.博智达 语法:reset(array) 参数: 参数 描述 array 必需.规定要使用的数组. 说明:若成功则返回 ...