c#用log4Net将日志写入到Oracle数据库,并写入到文件中
原文:c#用log4Net将日志写入到Oracle数据库,并写入到文件中
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
1.从官网下载log4net包,安装到项目中;
2.配置文件log4net.config/app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient"/>
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
    </DbProviderFactories>
  </system.data>
  <appSettings>
    <add key="log4net.Internal.Debug" value="true "/>
    <add key="DbProvider" value="System.Data.SqlClient"/>
  </appSettings>
  <log4net>
    <appender name="AdoNetMysql" type="log4net.Appender.AdoNetAppender,log4net">
      <bufferSize value="2"/>
      <param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/>
      <param name="ConnectionString" value="Server=DESKTOP-QJVL170;Uid=root;Pwd=zws_321;Database=bjdata_zs;Connect Timeout=120; character set=utf8;Use Affected Rows=true;"/>
      <commandText value="INSERT INTO mylog(id,log_datetime,log_thread,log_level,log_logger,log_message) VALUES (null,@log_date, @thread, @log_level, @logger, @message)"/>
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.PatternLayout" value="%d{yyyy-MM-dd HH:mm:ss}"/>
      </parameter>
      <parameter>
        <parameterName value="@thread"/>
        <dbType value="String"/>
        <layout type="log4net.Layout.PatternLayout"  value="%thread">
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level"/>
        <dbType value="String"/>
        <layout type="log4net.Layout.PatternLayout"  value="%log_level">
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger"/>
        <dbType value="String"/>
        <layout type="log4net.Layout.PatternLayout"  value="%logger">
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message"/>
        <dbType value="String"/>
        <layout type="log4net.Layout.PatternLayout"  value="%message">
        </layout>
      </parameter>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="Info" />
        <levelMax value="Fatal" />
      </filter>
    </appender>
    <appender name="ADONetAppender_Oracle" type="log4net.Appender.ADONetAppender">
      <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
      <bufferSize value="0" />
      <!--日志数据库连接串-->
      <!--<connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />-->
      <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
      <!--<connectionString value="Data Source=//59.110.46.189:1521/TestOracle;User ID=TestUser;Password=TestUser;" />-->
      <connectionString value="User ID=TestUser;Password=TestUser;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST =59.110.46.189)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME =TestOracle )))"/>
      <!--<connectionString value="Data Source=TestOracle;User ID=TestUser;Password=TestUser;SERVER=59.110.46.189;" />-->
      <!--日志数据库脚本-->
      <!--<commandText value="INSERT INTO BJ_LogDetails (LogDate,LogThread,LogLevel,LogLogger,LogActionClick,LogMessage,UserName,UserIP) VALUES ('20180112', '3', 'info', '567657', 'delete', :LOG_MESSAGE,'zs','127.0.0.1')" />-->
      <commandText value="INSERT INTO BJ_LOGDETAILS (LogDate,LogThread,LogLevel,LogLogger,LogActionClick,LogMessage,OPERAND) VALUES (:LogDate,:LogThread,:LogLevel,:LogLogger,:ActionsClick,:Message,:Operand)" />
       <!--日志时间LogDate -->
     <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <!--线程号-->
    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%t" />
      </layout>
    </parameter>
    <!--日志类型LogLevel -->
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="200" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%p" />
      </layout>
    </parameter>
    <!--日志名称-->
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="500" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
 <parameter>
      <parameterName value="@ActionsClick" />
      <dbType value="String" />
      <size value="4000" />
        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog" >
        <conversionPattern value = "%property{ActionsClick}"/>
      </layout>
    </parameter>
      <parameter>
        <parameterName value="@Message" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
          <conversionPattern value="%property{Message}" />
        </layout>
      </parameter>
   <!--操作对象-->
      <parameter>
        <parameterName value="@Operand" />
        <dbType value="String" />
        <size value="300" />
        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
          <conversionPattern value="%property{Operand}" />
        </layout>
      </parameter>
    </appender>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
      <!--定义文件存放位置-->
      <file value="log\\"/>
      <appendToFile value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="yyyyMM\\yyyyMMdd'.txt'"/>
      <staticLogFileName value="false"/>
      <param name="MaxSizeRollBackups" value="100"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="==== %date [%thread] %-5level ==== : %newline%message%newline%newline" />
      </layout>
    </appender>
    <!--配置到数据库-->
    <appender name="ADONetApp" type="log4net.Appender.ADONetAppender,log4net">
      <!--BufferSize为缓冲区大小-->
      <bufferSize value="10" />
      <!--<param name="BufferSize" value="2" />-->
      <!--引用-->
      <param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/>
      <!--连接字符串-->
      <param name="ConnectionString" value="Server=DESKTOP-QJVL170;Uid=root;Pwd=zws_321;Database=bjdata_zs;Allow Zero Datetime=True;character set=utf8;"/>
      <!--插入语句-->
      <commandText value="INSERT INTO sys_error_log(Message) VALUES ('sdfd')" />
      <!--记录时间-->
      <!--<parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>-->
      <!--线程号-->
      <!--消息-->
      <parameter>
        <parameterName value="@Message" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
          <conversionPattern value="%property{Message}" />
        </layout>
      </parameter>
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingLogFileAppender"/>
      <appender-ref ref="ADONetAppender_Oracle"/>
      <!--记录到什么介质中-->
    </root>
    <!--使用反射方法同时写两文件和数据库-->
    <logger name="writLogger">
      <level value="ALL"/>
      <appender-ref ref="RollingLogFileAppender"/>
      <appender-ref ref="ADONetAppender_Oracle"/>
    </logger>
  </log4net>
  <connectionStrings>
    <add name="OraConnString1" connectionString="User ID=TestUser;Password=TestUser;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST =59.110.46.189)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME =TestOracle )))"/>
    <add name="OracleTarget" connectionString="User ID=TESTUSER;Password=TestUser;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST =59.110.46.189)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME =BJWARE )))"/>
  </connectionStrings>
</configuration>
3.c#代码的调用:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            log4net.Config.XmlConfigurator.Configure();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ILog log1 = LogManager.GetLogger("writLogger");
            ILog log11 = LogManager.GetLogger("writLogger");
            log11.Info(new LogInfo("1","wgh","s","登陆"));
            log1.Info(new LogMessage(1, (int)TGLog.ActionType.Other, "测试数据"));
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
    }4.数据库表结构如下:
CREATE TABLE "TESTUSER"."BJ_LOGDETAILS"
   (	"LOGID" NUMBER,
	"LOGDATE" DATE,
	"LOGTHREAD" NVARCHAR2(100),
	"LOGLEVEL" NVARCHAR2(200),
	"LOGLOGGER" NVARCHAR2(500),
	"LOGMESSAGE" NVARCHAR2(2000),
	"LOGACTIONCLICK" NVARCHAR2(400),
	"OPERAND" NVARCHAR2(400)
   )PS:1.配置文件中,不需要的参数必须注释或者删除,否则写入不到数据库中;
2.确保链接字符串,SQL语句的正确率;
3.确保oracle数据库版本正确,确保log4net包版本正确;
4.调试阶段,可以跟踪ILog中的参数是否全部为true;
如有错误,希望指出;共同进步!
c#用log4Net将日志写入到Oracle数据库,并写入到文件中的更多相关文章
- Oracle数据库date类型与Java中Date的联系与转化
		以下是对Java中的日期对象与Oracle中的日期之间的区别与联系做点说明,以期对大家有所帮助.new Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),就是系统当前 ... 
- Oracle数据库克隆后temp文件因路径变化无法找到问题
		Oracle数据库克隆后temp文件因路径变化无法找到出现如下报错Errors in filexxxx.trc:ORA-01157: cannot identify/lock data file xx ... 
- 转载-Oracle 数据库导入导出 dmp文件
		首先询问对方数据库的表空间名称和大小,然后在你的oracle中建立相应表空间,最后使用命令导入.导出数据.补充:1.要新建一个数据库: Oracle数据导入导出imp/exp就相当于oracle数据还 ... 
- 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量
		概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ... 
- Oracle 数据库字典 sys.obj$ 表中关于type#的解释
		sys.obj$ 表是oracle 数据库字典表中的对象基础表,所有对象都在该表中有记录,其中type#字段表明对象类型,比如有一个表 test ,则该对象在sys.obj$ 中存在一条记录,name ... 
- Elasticsearch准实时索引实现(数据写入到es分片并存储到文件中的过程)
		溢写到文件系统缓存 当数据写入到ES分片时,会首先写入到内存中,然后通过内存的buffer生成一个segment,并刷到文件系统缓存中,数据可以被检索(注意不是直接刷到磁盘) ES中默认1秒,refr ... 
- Oracle 数据库导入导出 dmp文件
		转自: http://hi.baidu.com/ooofcu/blog/item/ec5d1f9580d41f007af48077.html 首先询问对方数据库的表空间名称和大小,然后在你的oracl ... 
- Oracle数据库编程:在JDBC中应用Oracle
		9.在JDBC中应用Oracle: JDBC访问数据库基本步骤: 1.加载驱动 2.获取链接对象 3.创建SQL语句 4.提交S ... 
- oracle数据库读取操作系统的物理文件-转载,待完善
		--源地址不详 --创建目录SQL> create directory dir_xls as '/home/oracle'; Directory created. --给用户授权SQL> ... 
随机推荐
- echart-如何画自定义的图形,三角形为例
- transform-origin属性
			一.transform-origin的作用 transform-origin改变元素基点 (transform-origin是变形原点,原点就是元素绕着旋转或变形的点) 注意:该属性只有在设置了tra ... 
- Navicat  出现的[Err] 1146 - Table 'performance_schema.session_status' doesn't exist已解决
			[Err] 1146 - Table 'performance_schema.session_status' doesn't exist已解决 刚刚接触MySQL,就往数据库添加数据,就遇到这个问 ... 
- kohana orm巧用字段备注支持扩展
			1.SELECT * FROM `bota_language` WHERE `type` = 'order_type'; id key value type ---- ... 
- 设计模式学习笔记——Composite 组合模式
			用于描述无限层级的复杂对象,类似于描述资源管理器,抽象出每一个层级的共同特点(文件夹和文件,展开事件) 以前描述一个对象,是将整个对象的全部数据都描述清楚,而组合模式通过在对象中定义自己,描述自己的下 ... 
- Spring MVC Captcha 验证码
			本文专为不想一遍遍手写验证码代码的”懒猿“而生,只需要添加部分配置文件,拷贝一个控制层代码,就能在页面中方便使用.话不多说,进入主题: 一. Spring MVC 环境实现方式: 1.1 spring ... 
- CSS中clip-path属性的使用
			clip-path的使用 polygon 值为多个坐标点组成,坐标第一个值是x方向,第二个值是y方向. 左上角为原点,右下角是(100%,100%)的点.</p> body { backg ... 
- 关于Idea热部署,修改代码不需要重启tomcat
- InfluxDB安装使用
			influxdb简介 启动步骤 服务启停:sudo service influxdb start/stop/restart 安装过程: 1.增加yum源 cat <<EOF | sud ... 
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识:  区块链使用的大致技术包括以下几种:  a.点对点网络设计  b.加密技术应用   c.分布式算法的实现  d.数据存储技术  e.拜占庭算法  f.权益证明POW,POS,DPOS  原因一: 点对点网络设计  其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
			任何国家都无法限制数字货币.为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技 ... 
