在项目中遇到需要记录操作日志的需求,由于是一个外挂系统,因此不用考虑到公司框架的限制,直接二层架构直连数据库,考虑使用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

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections> <log4net debug="true">
<root>
<level value="INFO"></level>
<!--文件记录格式-->
<!--<appender-ref ref="rollingFile"/>-->
<appender-ref ref="AdoNetAppender_DB2"/>
</root> <appender name="AdoNetAppender_DB2" type="log4net.Appender.AdoNetAppender,log4net">
<bufferSize value="1"/> <!--SQL数据源-->
<connectionType value="System.Data.Odbc.OdbcConnection, System.Data"/> <!--SQL连接字符串-->
<connectionString value="Driver={IBM DB2 ODBC DRIVER};Hostname=192.168.44.11;Port=50001;Database=xxx;Uid=xxx;Pwd=xxx;Protocol=TCPIP;" />
<commandText value="INSERT INTO xxx VALUES (' ', ' ', ' ', ?, ' ', ' ')"/> <parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" value="%level" />
</parameter>
</appender>
</log4net>
</configuration>

log4net via OLEDB

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections> <log4net debug="true">
<root>
<level value="INFO"></level>
<!--文件记录格式-->
<!--<appender-ref ref="rollingFile"/>-->
<appender-ref ref="AdoNetAppender_DB2"/>
</root>
<appender name="AdoNetAppender_DB2" type="log4net.Appender.AdoNetAppender,log4net">
<bufferSize value="1" />
<connectionType value="System.Data.OleDb.OleDbConnection, System.Data" />
<connectionString value="Provider=IBMDADB2;Hostname=192.168.44.11;Port=50001;UID=xxxx;PWD=xxx;Database=xxx;Protocol=TCPIP;" />
<commandText value="INSERT INTO xxx VALUES (' ', ' ', ' ', ?, ' ', ' ')" />
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
</log4net>
</configuration>

最后,再贴一张如何检查log4net错误的断点视图,以后可以找到从哪查错咯:

log4net写入DB2备忘 via OLEDB & ODBC的更多相关文章

  1. Log4Net写入到数据库配置过程中的一些小问题备忘

    问题1: 在公司进行log4net写入服务器配置的时候,一切正常,但是在家里的机器上,就频繁出现这个问题: SQL Server 2008 报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误 ...

  2. 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因

    近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...

  3. Nmap备忘单:从探索到漏洞利用(Part 5)

    这是备忘单的最后一部分,在这里主要讲述漏洞评估和渗透测试. 数据库审计 列出数据库名称 nmap -sV --script=mysql-databases 192.168.195.130 上图并没有显 ...

  4. Linux常用命令速查备忘

    Linux常用命令速查备忘   PS:备忘而已,详细的命令参数说明自己man 一. 启动,关机,登入,登出相关命令 [login] 登录 [logout] 登出 [exit] 登出 [shutdown ...

  5. ## 本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘

    本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘一,磁盘管理1.显示当前目录位置 pwd2.切换目录 cd ...

  6. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  7. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  8. Vi命令备忘

    备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...

  9. ExtJs4常用配置方法备忘

    viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...

随机推荐

  1. 【转】C# datagridview大小跟随窗口动态改变

    源地址:https://blog.csdn.net/fengxing11/article/details/52527715

  2. luoguP2418 yyy loves OI IV

    https://www.luogu.org/problemnew/show/P2418 暴力 DP 做这题只有 30 分 考虑用线段树优化这个 DP 先处理一下整个房间都膜拜一个人的情况,然后将 1 ...

  3. spark执行例子eclipse maven打包jar

    首先在eclipse Java EE中新建一个Maven project具体选项如下 点击Finish创建成功,接下来把默认的jdk1.5改成jdk1.8 然后编辑pom.xml加入spark-cor ...

  4. Python开发MapReduce系列(一)WordCount Demo

    原创,转发请注明出处. MapReduce是hadoop这只大象的核心,Hadoop 中,数据处理核心就是 MapReduce 程序设计模型.一个Map/Reduce 作业(job) 通常会把输入的数 ...

  5. 使用TortoiseSVN新建及合并分支图文教程

    打开trunks目录,在trunks目录下新建两个文本文件A.java,B.java:   打开A.java输入以下内容: B.java文件可以随机输入些,本例中主要用于观察后续是否变化. 两个文件编 ...

  6. 3C - Youmu

    (ans & arr[j]) == ans 保证高位已有值不失效. ((ans[j] >> (i - 1)) & 1) == 1 当前位为1,cnt++, cnt > ...

  7. 关于zabbix _get返回Could not attach to pid的问题

    分析:这是因为由于zabbix客户端没有权限,导致zabbix_server端无法获取到键值数据!! 解决:在客户端上添加用户sudo的权限就可以解决了. 验证:是脚本的话还要在脚本里加上sudo的命 ...

  8. DHCP协议及基本实现原理

    DHCP(Dynamic Host Configuration Protocol):动态主机配置协议. DHCP的优缺点 DHCP服务优点:网络管理员可以验证IP地址和其它配置参数,而不用去检查每个主 ...

  9. C++_类继承3-动态联编和静态联编

    程序调用函数时,将使用哪个可执行代码块呢?编译器负责回答这个问题. 将源代码中的函数调用解释为特定的函数代码块被称为函数名联编(binding). 在C语言中,这非常简单,因为每个函数名对应一个不同的 ...

  10. rest-assured的根路径(root path)和URL编码(URL Encoding)

    一.根路径(Root path) 为了避免在body方法中使用重复的路径来断言,我们可以指定一个根路径(root path),比如: 我们以前的写法是: when(). get("/some ...