转自: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
1
2
3
4

<appSettings>
  <add key="log4net.Config" value="log4net.config"/>
  <add key="log4net.Config.Watch" value="True"/>
</appSettings>

官网说,如果你用了 assembly attribute 的配置方式,配置文件中的这两个节点会把 attribute 上的写死属性给覆盖。

官网这句话的意思是,一定要有了 attribute ,这两个配置才有效?但是我发现没有加 attribute 这两个配置也是有效的。

总之,这两个配置的优先级最高,如果你的各个项目中、或者引用了别人的 dll,都用了 attribute,加上这两个配置后,就可以把它们统一了,非常有用的配置!

显示调用

最后说说显示调用的方式:

C#
1
log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.xml"));

一般都是在程序的入口处加上这句话,这样就可以设置配置文件的位置了。

那大家肯定也会疑惑了,这种方式和上面两种方式的优先级是怎么样的?

经过实际测试后,我发现,就算已经加载了前面的配置,只要再次调用这种方式,配置都会变成新的。

也就是说,这种配置方法有绝对的控制权!

最终方案

OK,了解了他们的优先级和各种关系后,就要想想最终方案了。

我希望最终的方案可以满足一下条件:

  1. 主程序引用子项目,子项目用了 log4net,主项目不用显示加载 log4net,只要加上配置即可,默认在 app.config 中;
  2. 可以通过配置文件来修改 log4net 的配置位置;
  3. 可以在程序运行中动态修改 log4net 配置(比如通过界面操作)。

嗯,如果要满足以上条件,那么就需要把上面三种方式配合起来使用了,我的建议是这样子的:

  1. 所有用 log4net 的项目都加上 assembly attribute;
  2. 如果配置在 app.config 中,不需要写任何而外的配置,如果配置在单独文件中,利用配置修改 log4net 配置位置;
  3. 想要动态修改 log4net 配置路径的话,直接显示调用。

好了,最后的方案是不是很完美?

既符合“约定优于配置”的原则,也符合“灵活配置”的原则,完美了!

log4net 配置文件配置方法相关推荐

  1. log4net 配置文件相对路径配置

    log4net 配置文件相对路径配置 本写主要方向为对配置文件放在相对位置,并非程序(项目)根目录下的的配置方法. 一.关于配置方法 关于log4net的使用我想大家都知道,配置也是有很多的方案,在这 ...

  2. php配置设置,PHP设置配置文件的方法

    PHP设置配置文件的方法 变量 $config 是我们所提交过来的配置信息,是以数组形式存储的.function set_config($config){ if(!is_array($config)) ...

  3. linux中apache配置文件在哪,linux网站服务Apache的安装与配置方法详解

    这篇文章介绍下linux网站服务apache的安装与配置方法,包括挂载光盘,安装http服务,管理httpd服务,httpd的配置文件几大部分.具体详情可以参考下文. 1.挂载光盘 自己习惯将光盘挂载 ...

  4. 思科服务器如何配置文件,思科服务器的配置方法

    思科服务器的配置方法 内容精选 换一换 OpenSSL版本需要升级至1.1.1a或者以上.CentOS系统自带的OpenSSL版本为1.0.2k-fips,本文以升级到1.1.1a版本为例.如果安装N ...

  5. linux显示 防火墙配置文件,怎么查看Linux防火墙配置方法

    当Linux系统的防火墙的状态和信息时候,我们可以用哪些命令查看呢.下面由学习啦小编为大家整理了查看Linux系统防火墙的命令详解,希望对大家有帮助! 查看Linux系统防火墙的命令详解 查看Linu ...

  6. Solidworks GB型材库配置方法以及配置文件

    Solidworks GB型材库配置方法以及配置文件 GB型材库 主要用于SolidWorks 焊件中生成结构件特征是调用. 配置GB型材库,默认是ISO和ansi标准的型材. 单独配置GB型材方法 ...

  7. mysql5.7.14 配置文件_mysql 5.7.14 安装配置方法图文教程(转)

    因笔者个人需要需要在本机安装Mysql,先将安装过程记录如下,希望对他人有所参考. 一.下载软件 1. 进入mysql官网,登陆自己的oracle账号,下载Mysql-5.7.14,下载地址:http ...

  8. 服务器asp网站环境配置文件,asp服务器环境配置方法

    asp服务器环境配置方法 内容精选 换一换 开发者基于Atlas 200 DK进行AI应用开发前,需要在制作SD卡时准备的Ubuntu服务器中部署开发工具,有以下两种场景:(推荐)部署Mind Stu ...

  9. C# log4net 的配置

    项目的日志组件是必备可少的,任何项目中都需要.这样既方便前期的开发测试也方便项目后期的项目维护.C#项目的一个不错的日志组件是log4net,下面我就把网站项目.桌面应用程序项目中log4net的如何 ...

最新文章

  1. MySQL数据类型之数字类型详细解析
  2. 业界丨一文详解腾讯布局AI生态的四大战略
  3. qn模块java脚本_Qn271 对于网络编程 反射 IO 线程的一些一本入门程序 多多联系会加快 速度 WinSock-NDIS 269万源代码下载- www.pudn.com...
  4. PAT乙级(1033 旧键盘打字)
  5. java log4j记录_JAVA中使用LOG4J记录日志
  6. [官版翻译ing]OpenStack云计算快速入门之一:OpenStack及其构成简介
  7. el 能否定义作用域变量_EL表达式语法简介及其使用
  8. python函数手册 chm_python中文手册chm
  9. java留言板源码_jsp留言板示例源码下载(入门级)
  10. 友盟推送:测试模式推送完成,但却收不到推送信息
  11. CwRsync安装配置
  12. 手机音乐播放器页面html代码,仿酷狗html5手机音乐播放器主要部分代码
  13. 使用思维导图进行产品需求分析
  14. 2021年征兵没有高考成绩查询,2021年征兵政策新调整,三种情况无法通过政审,快看看是不是自己...
  15. dva使用及项目搭建
  16. python趣味编程与精彩实例-python趣味编程100例(99个)
  17. starlink星座近状
  18. 雷军:当CEO是因为被格式化了电脑
  19. 微信退款返回的几种情况
  20. 字节(byte)、位(bit)、KB、B、字符之间关系以及编码占用位数

热门文章

  1. 计算机考证考试上网题
  2. 在windows下配置R-CNN detection selective_search_ijcv_with_python目标检测
  3. 阿里云OSS后台实现远程文件上传下载
  4. To B企业都有哪些营销方式?客户服务如何维护?
  5. Javascript的算术运算符
  6. Kubernetes 审计日志
  7. iphone备份用什么软件?好用的苹果数据备份工具推荐!
  8. 微信删除好友怎么加回来啊?
  9. Ubuntu14.04安装freesurfer
  10. 安装crf++的python包