在项目中遇到需要记录操作日志的需求,由于是一个外挂系统,因此不用考虑到公司框架的限制,直接二层架构直连数据库,考虑使用log4net连接DB2。请宽恕我这个非软工科班出身的IT小白,以前一直在知道有个log4net,但在工作中公司有一套自己的框架记履历,一直没有机会接触。这次嘛,正好就这个机会小试身手。
在这里先简答介绍一下这个外挂系统。很简单,.NET+DB2的配置,两层架构,大致画面都有了,需要切入权限控制和日志系统。工作很顺利的开展了,权限系统嘛小意思,日志方面log4net拿来就用,大不了百度一下嘛。参考百度出来MySql的ODBC配置这里抄抄那里抄抄,这可到好,一运行,傻眼了,不报错,也没写入自己建的表,头疼。
本着一向的钻研精神,接着直接百度了log4net+DB2+ODBC等等各种关键词的排列组合,无奈,百度上log4net+DB2+ODBC的关键词几乎没有,都是sqlserver、Oracle云云的,崩溃,大家都不用log4net连DB2吗?唯一找到的一篇相关的博文,博主也只是说DB2 V9.7对log4net via ODBC的支持不好,根本连不上:(,好吧~~~~“根本连不上!!!”(后面我的结果证明他是错的哦)。接着小白求助了CSDN的论坛——没回音;想上stackoverflow问问老外,好久不上,google的JS库被墙了,问不出问题——无语。
就这样小白怀着不爽的心情熬到了今晚。就在小白一边咒骂log4net怎么连不上数据库连个报错都没有,一边断点调试的时候,发现了ConfigurationMessages的一坨履历,上面赫然写着,"找不到System.Data.dll"(大致是这个意思,小白就不在此贴图了)。灵光一闪,有眉目了,将引用中System.Data.dll复制本地设置成true,运行之,成了!
在此,小白将log4net通过ODBC于OLEDB连接DB2的配置列在下面:
log4net via ODBC
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 5 </configSections> 6 7 <log4net debug="true"> 8 <root> 9 <level value="INFO"></level> 10 <!--文件记录格式--> 11 <!--<appender-ref ref="rollingFile"/>--> 12 <appender-ref ref="AdoNetAppender_DB2"/> 13 </root> 14 15 <appender name="AdoNetAppender_DB2" type="log4net.Appender.AdoNetAppender,log4net"> 16 <bufferSize value="1"/> 17 18 <!--SQL数据源--> 19 <connectionType value="System.Data.Odbc.OdbcConnection, System.Data"/> 20 21 <!--SQL连接字符串--> 22 <connectionString value="Driver={IBM DB2 ODBC DRIVER};Hostname=192.168.44.11;Port=50001;Database=xxx;Uid=xxx;Pwd=xxx;Protocol=TCPIP;" /> 23 <commandText value="INSERT INTO xxx VALUES (' ', ' ', ' ', ?, ' ', ' ')"/> 24 25 <parameter> 26 <parameterName value="@log_level" /> 27 <dbType value="String" /> 28 <size value="50" /> 29 <layout type="log4net.Layout.PatternLayout" value="%level" /> 30 </parameter> 31 </appender> 32 </log4net> 33 </configuration>
log4net via OLEDB
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 5 </configSections> 6 7 <log4net debug="true"> 8 <root> 9 <level value="INFO"></level> 10 <!--文件记录格式--> 11 <!--<appender-ref ref="rollingFile"/>--> 12 <appender-ref ref="AdoNetAppender_DB2"/> 13 </root> 14 <appender name="AdoNetAppender_DB2" type="log4net.Appender.AdoNetAppender,log4net"> 15 <bufferSize value="1" /> 16 <connectionType value="System.Data.OleDb.OleDbConnection, System.Data" /> 17 <connectionString value="Provider=IBMDADB2;Hostname=192.168.44.11;Port=50001;UID=xxxx;PWD=xxx;Database=xxx;Protocol=TCPIP;" /> 18 <commandText value="INSERT INTO xxx VALUES (' ', ' ', ' ', ?, ' ', ' ')" /> 19 <parameter> 20 <parameterName value="@message" /> 21 <dbType value="String" /> 22 <size value="4000" /> 23 <layout type="log4net.Layout.PatternLayout"> 24 <conversionPattern value="%message" /> 25 </layout> 26 </parameter> 27 </appender> 28 </log4net> 29 </configuration>
最后,再贴一张如何检查log4net错误的断点视图,以后可以找到从哪查错咯: