log4net使用注意事项

1配置Log4net

Log4net的配置文件有几种使用方式,这里将配置log4net的部分独立出来,即关于log4net的配置独立成文件log4net.config。

1)写入Mysql

log4net.config文件配置

<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>

  <log4net>
    <logger name="ErrorLog">
      <level value="Error"/>
      <appender-ref ref="ErrorAppender"/>
    </logger>

    <logger name="OperationLog">
      <level value="Info"/>
      <appender-ref ref="OperationAppender"/>
    </logger>
    
    <appender name="ErrorAppender" type="log4net.Appender.ADONetAppender">
      
      <bufferSize value="1"/>
      
      <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
      <connectionString value="Database=log;Data Source=192.168.107.13;User Id=root;Password=cnki2017;CharSet=utf8;port=3306"/>
      
      <commandText value="INSERT INTO errorlogs (`InsertTime`,`Level`,`Message`,`ExceptionMessage`) VALUES (@log_date, @log_level, @message, @exception)"/>
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value="@log_level"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level"/>
        </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="2000"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message"/>
        </layout>
      </parameter>
</appender>
  </log4net>
</configuration>

在控制台程序中使用:

class Program
{
        static void Main(string[] args)
        {
            try
            {
                var path = string.Format("{0}{1}", System.AppDomain.CurrentDomain.BaseDirectory, "Log4net.config");
                ICollection c = log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(path));
                ILog log = log4net.LogManager.GetLogger("ErrorLog");
                log.Error("wwwww", new Exception("测试抛出"));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            
        }
}

运行上面的代码,成功地将数据记录到数据库中。

2)写入日志文件

appender配置节说明

file

string

日志文件存放位置,可以为绝对路径也可以为相对路径

appendToFile

boolean

是否追加到已有的日志文件中

rollingStyle

Size/Date

切分日志的模式。Size:按大小切分,Date按日期切分

maxSizeRollBackups

int

当rollingStyle为Size模式时,指定备份日志文件的最大切分数量,如果超过指定值,日志将进行覆写。

maximumFileSize

int

当rollingStyle为Size模式时,指定每个切分日志文件的大小

datePattern

string

当rollingStyle为Date模式时,日志文件名称的一部分,可设置时间格式。

staticLogFileName

boolean

指定是否为静态文件名。 若指定为true,那么文件名以file 中定义的文件名为准。 若为false,当rollingStyle为Date模式时,文件名为file 和datePattern共同构成的

layout

输出日志的样式 其下的配置节conversionPattern 控制着输出的样式

lockingModel

string

最小锁定模型以允许多个进程可以写入同一个文件

encoding

string

文件编码

示例:

<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <configSections>
    <section name="log4net"                          type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
<log4net>
<appender name="TxtLogRollingFileAppender"
type="log4net.Appender.RollingFileAppender">
          <file value="log\\RollingFile" />
          <appendToFile value="true" />
          <rollingStyle value="date" />
          <datePattern value="yyyy-MM-dd&quot;.log&quot;"/>
          <staticLogFileName value="false"/>
          <encoding value="utf-8" />
          <lockingModel type="log4net.Appender.FileAppender+MinimalLock"             />
          <layout type="log4net.Layout.PatternLayout">
            <param name="conversionPattern" value="时间:%date%newline                线程:[%thread]%newline日志类型:%-5level%newline内                    容:%message" />
            <param name="header" value="&#13;&#10;------------开始                    ---------------&#13;&#10;" />
            <param name="footer" value="&#13;&#10;-------------    结束                ------------&#13;&#10;" />
       </layout>
</appender>
  </log4net>
</configuration>

Main函数中:

ICollection c = log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(@"E:\projgxz_myself\Log4NetTest\Log4net.config"));
                ILog log = log4net.LogManager.GetLogger("TxtLogRollingFileAppender");
                log.Info("测试输出信息");
                Console.Read();

2遇到的问题

1)数据库的访问。

当访问的数据库不存在或表不存在或连接配置不正确时,并不会抛出异常。

2)不会返回配置文件信息集合。

ICollection c = log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(path));

这行代码返回值是ICollection,然而并不会获得配置文件信息,返回的集合居然是空。

3)配置文件路径不正确。

当所指定的配置文件路径不正确时也不会抛出异常,这给调试增加了难度。

4)配置日志类型与使用的方法不一致。

将上面的配置节:

<logger name="ErrorLog">

      <level value="Error"/>

      <appender-ref ref="ErrorAppender"/>

</logger>

改为下面这样,而其他代码不变,运行程序发现无法写入,但是系统不会抛出异常,也没有任何提示。

<logger name="ErrorLog">

      <level value="Info"/>

      <appender-ref ref="ErrorAppender"/>

</logger>

5)回滚文件锁定模式

如果如下这么配置,系统会抛异常,但是无法用try-catch捕获,但可在控制台查看到。

<lockingModel type="log4net.Appender.RollingFileAppender+MinimalLock" />

6)写文本文件的问题

若rollingStyle配置节的值为date,那么maxSizeRollBackups、maximumFileSize对日志文件没有任何影响。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

TCP/IP协议族(二) HTTP报文头解析

本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述。下方是报文头每个字段的格式,首先是头部字段的名称,如Accept...

1826
来自专栏从零开始学自动化测试

python测试开发django-4.获取url参数和name的作用

如打开博客园按时间分类标签页【https://www.cnblogs.com/yoyoketang/archive/2018/10.html】,里面是时间参数是...

331
来自专栏和蔼的张星的图像处理专栏

1.Win10+VsCode的C/CPP编译环境搭建

我是从开始学C++的时候就一直用的是visual studio,毕竟宇宙第一IDE,写和调试都是超级方便快捷,唯一的缺点可能就是启动慢一点。 之前电脑没有换固...

2426
来自专栏北京马哥教育

27个Linux文档编辑命令

? 文 | 豌豆 来源 | 菜鸟教程 ? 豌豆贴心提醒,本文阅读时间5分钟,文末有秘密! Linux col命令 Linux col命令用于过滤控制字...

4426
来自专栏yukong的小专栏

【ssm个人博客项目实战08】博客的分页显示以及模糊查询,删除。前言1、上篇回顾2、具体编码3、测试与小结

在上一节中我们是完成了博客的回台部分,现在我需要在前台拿到回台传来的数据并且给以显示出来。 不知道大家还记得我们在博客类别管理里面,easyui的datagr...

644
来自专栏C/C++基础

g++入门教程

g++是GNU开发的C++编译器,是GCC(GNU Compiler Collection)GNU编译器套件的组成部分。另外,gcc是GNU的C编译器。

1641
来自专栏玄魂工作室

安全杂谈——linux通配符绕过文件名黑名单

linux shell下可以通过正则匹配来匹配相应的程序并且执行。 在linux下输入man 7 glob命令可以查看相关的内容。值得注意的就这些,学过正则的一...

732
来自专栏跟着阿笨一起玩NET

Remoting配置文件的用法

本文转载:http://www.cnblogs.com/rickie/archive/2004/10/10/50392.html

832
来自专栏王小雷

用windows浏览器打开Linux的Jupyter notebook开发、调试示例

1.场景,在windows浏览器中打开Linux环境下的jupyter notebook。Jupyter notebook开启远程服务,Spark、python...

1906
来自专栏逆向技术

32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址

      32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件...

2857

扫码关注云+社区