使用Log4Net写入日志文件和写入到数据库

本文主要说明一下两点内容

1.1 关于读取Log4Net配置文件产生的错误

1.2 记录日志到数据库(SQL Server)

详细步骤如下

  1. 添加log4net程序包

  2. 添加配置文件

  3. 引入命名空间 using log4net; using log4net.Config;

  4. 读取配置文件

    XmlConfigurator.Configure(); 默认去读取配置文件如 App.conifg 或 Web.config

  5. 获取ILog接口

    ILog ilog=LogManager.GetLogger(typeof()); 或者 LogManager.GetLogger("字符串类型");

  6. 开始写入日志

无论是系统配置文件还是自定义配置文件都需要选中配置文件右键-->属性-->把复制到输出目录选项设置为:始终复制


1.1 记录配置Log日志所遇到的错误

以下的错误是本人在配置Log4net文件中所遇到的坑...解决了好一段时间,想着记录一下,望能帮助到正在学习log4net的网友。

第一个问题配置文件读取失败,快速监视可以看到这段代码异常了,其中Exception中显示配置文件未能初始化。

控制台打印出来的异常信息

接下来检查我们的配置文件,似乎从图中看不出任何问题,本人也是看了老半天,该配置的节点都配置好了,为什么还提示我们配置文件未能初始化?接下来阐述解决办法。

解决方法我们可以从控制台看到输出的异常信息这段话。这段话的意思是我们已经配置的configSections元素,如上图。但是她必须是根节点的第一个子元素。

更改配置文件节点为第一个子节点,然后在运行程序。可以看到日志记录成功!位置在bin\Debu目录下。

以上代码是默认读取系统配置文件,如果单独新建一个配置文件可以参考以下代码

log4net.Config.XmlConfigurator.Configure(new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"LogFig.config")));

1.2 记录日志到数据库(SQL Server)

1.在数据库中添加记录日志表(创建表的sql语句)

CREATE TABLE [dbo].[LogDetails](
	[LogID] [int] IDENTITY(1,1) NOT NULL,
	[LogDate] [datetime] NOT NULL,
	[LogLevel] [nvarchar](20) NOT NULL,
	[Thread] [nvarchar](20) NOT NULL,
	[Logger] [nvarchar](20) NOT NULL,
	[Exception] [nvarchar](3000) NULL,
	[Message] [nvarchar](3000) NULL
)

2.配置log4net文件,用于写入到数据库

<log4net>
  <!--name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是指定使用哪种介质  写入到数据库-->
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="1" />
    <!--日志数据库连接字符串-->
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <!--数据库连接字符串-->
    <connectionString value="Data Source=.;Initial Catalog=Test;Integrated Security=True" />
    <!--日志数据库脚本-->
    <commandText value="INSERT INTO LogDetails ([LogDate],[LogLevel],[Thread],[Logger],[Exception],[Message]) VALUES 
                 (@logdate,@loglevel,@thread,@logger,@exception,@message)" />
    <!--日志时间参数-->
    <parameter>
      <!--参数名称-->
      <parameterName value="@logdate" />
      <!--数据类型-->
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
 
 <!--线程号-->
<parameter>
  <parameterName value="@thread" />
  <dbType value="String" />
  <size value="20" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%t" />
  </layout>
</parameter
 
 <!--日志等级-->
<parameter>
  <parameterName value="@loglevel" />
  <dbType value="String" />
  <size value="20" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%p" />
  </layout>
</parameter>
<parameter>
  <parameterName value="@logger" />
  <dbType value="String" />
  <size value="20" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%logger" />
  </layout>
</parameter>

<!--日志异常-->
<parameter>
  <parameterName value="@exception" />
  <dbType value="String" />
  <size value="4000" />
  <layout type="log4net.Layout.ExceptionLayout" />
</parameter>

<!--日志信息-->
<parameter>
  <parameterName value="@message" />
  <dbType value="String" />
  <size value="50" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%message" />
  </layout>
</parameter>
   </appender>
  <root>
  <!--如果存在两个及以上<appender>元素,比如说一个是写文本日志,一个是写数据库日志,那么我们可以用以下元素指定使用哪个appender元素,元素ref属性中的值来appender属性中的name值-->
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

  

3.编写程序写入日志,这边读取的是自定义配置文件,不是系统配置文件。

在介绍一下,可以看到记录日志的几个不同等级的方法传入的messag参数是一个object类型,比如我们想用对象的方式来记录相关信息,可以进行Json序列化之后再传入进去。

程序执行完之后,编写Sql语句查询是否写入成功,如果写入失败,请仔细检查配置文件是否初始化成功以及节点是否相符,最后检查参数是否对应。上面配置文件中介绍的元素说明。

本次就介绍到这里,本文偏实际应用,第一次用博客记录,笔者文笔还需加强,希望大家都能搞定log4net的配置,如有不足之处,请留言指出,感谢!

猜你喜欢

转载自www.cnblogs.com/wanglinfu/p/12522898.html
今日推荐