ArcGIS AddIn 中使用 NLog 的一点经验

0
分享 2014-01-19
写程序基本没法离开log,dotNet 上用的比较多的 log 组件主要有log4net、nlog、common logging以及等等,从nuget.org上的统计资料来看,log4net用的最多,但我个人比较青睐NLog,不过其实log这个东西需要完成的目标都很类似,不同框架之间的差别也没有那么大,本文所说的这些内容,也可以应用到其他的log框架上的。

log框架中主要是3个部件,一个是target,代表着log的内容要写到哪里,实践上一般是console、file、数据库、网络等等;第二个是layout,这个很简单主要是决定log内容的格式,要不要带上时间啊,要不是带上发出log的函数名等等;最后一个是rule,其实就是决定什么级别的log会真正写到trget上,不够级别的log自然就被忽略了。
由此可见log的使用是很灵活的,这3个部件当然可以从代码上控制,不过这明显不是好主意,一来这样做很罗嗦,二来很容易被写死在代码里,更多的情况下,还是会把信息写到配置文件里,这里是个典型的nlog的配置
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSche ... gt%3B

<targets>
<target name="logfile" xsi:type="File" fileName="file.txt" />
</targets>

<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>

意思很明显了,target是一个文件,名字叫做logfile,然后任何级别的log都会被写入到logfile中。

当配置好了nlog,我们就可以这样使用了
using NLog;

Logger logger = LogManager.GetCurrentLogger();

一切都很行云流水,但是在AddIn这个环境下,就有个地方很尴尬。
nlog使用的配置文件默认叫做nlog.config,但是为了在AddIn中识别到,nlog.config需要放在arcgis的bin目录里,这样子,如果有多个addin使用nlog,自然就产生了冲突,所以不同的addin还是要使用不同的配置文件名。
用不同的名字很简单,只要修改一下LogManager的Configuration就可以了
LogManager.Configuration = new XmlConfigration("my.config");


普通来说,这条语句只要放到程序的入口,设置一次就可以了,可是我们的Addin并没有一个入口函数,这可怎么办?


考虑了挺长时间,在addin这个特别的环境里,大概有三种方法吧
1. 每次创建logger前,都先设置Configration。这个方法最质朴,也最简单,其实如果没有代码洁癖,完全可以这样做,主要的缺点就是有点丑陋;
2. 重发布NLog,这个方法不错,nlog是开源的么,把缺省的配置文件名改掉,自己的项目里使用自己定制过的nlog,也很正常。这个方法主要是有点笨重,不过配合上私人的nuget源,还是可以做的很优雅;
3. 最后一个方法就有点hack了,前文说,addin没有入口,其实也不是的,addin是有一个很好的入口的,只是这个文件是从Config.esriaddinx生成的,也就是AddInStartupObject这个类的构造函数里。这个地方是很不错的选择,可以把对Configureation的修改放到这里。但是这有个大问题,就是一旦修改Config.esriaddinx,就会激活addin的构建工具,Config.Designer.cs的内容都会被重新生成。我试图有一些技巧规避这一点,还反编译了一些代码,都没有成功。不过也不是没有办法,可以通过一些编织工具甚至是il注入的方法,解决这个问题,不过这样就有点跑题了


我自己能力有限了,只能想到这三个方法,如果读者有更好的方案,可以在评论中交流。
文章来源:http://blog.csdn.net/esrichinacd/article/details/26246787

0 个评论

要回复文章请先登录注册