在VS2013中使用Log4net

大致分为3个步骤

  1. 引用Log4net

  2. 配置Log4net
    配置目标:
    1. 启用内部调试
    2. 按照日期分割日志文件 1小时1个
    3. 按照日志容量分割文件 10KB 1个
    4. 按照日志大小, 时间分割文件
    5. 输出到SQL SERVER(需要先建立表)

    建立表代码如下:

    CREATE TABLE [dbo].[Log](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [AppDomain] [nvarchar](255) NULL,
        [Logger] [nvarchar](255) NOT NULL,
        [Level] [nvarchar](50) NOT NULL,
        [Thread] [nvarchar](255) NOT NULL,
        [File] [nvarchar](500) NULL,
        [Line] [nvarchar](50) NULL,
        [Identity] [nvarchar](50) NULL,
        [UserName] [nvarchar](50) NULL,
        [Date] [datetime] NOT NULL,
        [RunTime] [int] NULL,
        [Message] [nvarchar](4000) NULL,
        [Exception] [text] NULL,
     CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[Log] ADD  CONSTRAINT [DF_Log_Date]  DEFAULT (getdate()) FOR [Date]
    GO

    配置如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
      </configSections>
    
      <appSettings>
        <!-- 开启内部调试 比如, 配置好了日志记录到数据库(Mysql、Oracle、Sql Server)等, 但就是记录不上, 又找不到原因时, 可以查看这个log排查原因 -->
        <add key="log4net.Internal.Debug" value="true"/>
      </appSettings>
    
      <system.diagnostics>
        <trace autoflush="true">
          <listeners>
            <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Log/log4net.Internal.Debug.log" />
          </listeners>
        </trace>
      </system.diagnostics>
    
      <log4net>
    
        <!-- 按照日期分割日志文件 1小时1个 -->
        <appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender">
    
          <!-- 是否续写 -->
          <param name="AppendToFile" value="true" />
          <!--最小锁定模型以允许多个进程可以写入同一个文件 在使用RollingFileAppender的方式不支持多进程同時写一個日志文件; 使用FileAppender才可以 -->
          <!--<param name="LockingModel" value="log4net.Appender.FileAppender+MinimalLock" />-->
          <!--<param name="StaticLogFileName" value="true" />-->
    
          <!-- 保存路径 -->
          <param name="File" value="Log/" />
          <param name="DatePattern" value="yyyy-MM-dd HH.LOG" />
          <!-- 注意后缀必须要大写, 不然会生成位置类型的文件 -->
    
          <param name="StaticLogFileName" value="false" />
          <param name="RollingStyle" value="Date" />
    
          <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="
    ---- Start --------------------------------------------
    " />
            <param name="Footer" value="
    ---- End --------------------------------------------
    " />
            <param name="ConversionPattern" value="%newline
    AppDomain: %appdomain %newline
    Logger: %logger %newline
    Level: %level %newline
    ThreadId: %thread %newline
    File: %file %newline
    Line: %line %newline
    Identity: %identity %newline
    UserName: %username %newline
    DateTime: %date{yyyy-MM-dd HH:mm:ss.fff} %newline
    RunTime: %timestamp(ms) %newline
    Message: %message %newline
    Exception: %exception %newline
    %newline" />
          </layout>
    
        </appender>
    
        <!-- 按照日志容量分割文件 10KB 1个 -->
        <appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender">
    
          <!--是否续写-->
          <param name="AppendToFile" value="true" />
          <!--最小锁定模型以允许多个进程可以写入同一个文件 在使用RollingFileAppender的方式不支持多进程同時写一個日志文件; 使用FileAppender才可以 -->
          <!--<param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />-->
    
          <!--按照文件的大小进行变换日志文件-->
          <param name="RollingStyle" value="Size" />
          <!--生成 log.txt, log.txt.1, log.txt.2-->
          <param name="File" value="Log/log.txt" />
    
          <!--单个文件最大数量 好像只有在 按Size分割时有效-->
          <param name="MaximumFileSize" value="15KB"/>
          <!--保留的log文件数量 超过此数量后 自动删除之前的   好像只有在 按Size分割时有效-->
          <param name="MaxSizeRollBackups" value="3" />
    
          <param name="StaticLogFileName" value="false" />
          <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="
    ---- Start --------------------------------------------
    " />
            <param name="Footer" value="
    ---- End --------------------------------------------
    " />
            <param name="ConversionPattern" value="%newline
    AppDomain: %appdomain %newline
    Logger: %logger %newline
    Level: %level %newline
    ThreadId: %thread %newline
    File: %file %newline
    Line: %line %newline
    Identity: %identity %newline
    UserName: %username %newline
    DateTime: %date{yyyy-MM-dd HH:mm:ss.fff} %newline
    RunTime: %timestamp(ms) %newline
    Message: %message %newline
    Exception: %exception %newline
    %newline" />
          </layout>
    
        </appender>
    
        <!--输出到文件-->
        <appender name="LogFileAppenderBySizeAndDate" type="log4net.Appender.RollingFileAppender">
          <param name="File" value="Log/" />
          <param name="AppendToFile" value="true" />
          <!-- 切割最多文件数 -1表示不限制产生日志文件数-->
          <param name="MaxSizeRollBackups" value="-1"/>
          <!-- 每个文件的大小限制  -->
          <param name="MaximumFileSize" value="10KB"/>
          <!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 -->
          <param name="RollingStyle" value="Composite" />
          <!--如果要在这个文件名后面加上.log后缀,必须使用转义字符-->
          <!--<param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />-->
          <param name="DatePattern" value="yyyyMMdd-HH.mm&quot;.log&quot;" />
          <param name="StaticLogFileName" value="false" />
    
          <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="
    ---- Start --------------------------------------------
    " />
            <param name="Footer" value="
    ---- End --------------------------------------------
    " />
            <param name="ConversionPattern" value="%newline
    AppDomain: %appdomain %newline
    Logger: %logger %newline
    Level: %level %newline
    ThreadId: %thread %newline
    File: %file %newline
    Line: %line %newline
    Identity: %identity %newline
    UserName: %username %newline
    DateTime: %date{yyyy-MM-dd HH:mm:ss.fff} %newline
    RunTime: %timestamp(ms) %newline
    Message: %message %newline
    Exception: %exception %newline
    %newline" />
          </layout>
    
          <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="ALL" />
            <param name="LevelMax" value="OFF" />
          </filter>
    
        </appender>
    
        <!--输出到SQL Server-->
        <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
          <bufferSize value="100" />
          <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <connectionString value="Data Source=.;Initial Catalog=log4netTest;User ID=sa;Password=sa" />
          <commandText value="INSERT INTO [dbo].[Log]
                                         ([AppDomain]
                                         ,[Logger]
                                         ,[Level]
                                         ,[Thread]
                                         ,[File]
                                         ,[Line]
                                         ,[Identity]
                                         ,[UserName]
                                         ,[Date]
                                         ,[RunTime]
                                         ,[Message]
                                         ,[Exception])
                                   VALUES
                                         (@appDomain
                                         ,@logger
                                         ,@log_level
                                         ,@thread
                                         ,@file
                                         ,@line
                                         ,@identity
                                         ,@userName
                                         ,@log_date
                                         ,@runtime
                                         ,@message
                                         ,@exception)" />
    
          <parameter>
            <parameterName value="@appDomain" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%appdomain" />
            </layout>
          </parameter>
    
          <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%logger" />
            </layout>
          </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="@thread" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%thread" />
            </layout>
          </parameter>
    
          <parameter>
            <parameterName value="@file" />
            <dbType value="String" />
            <size value="500" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%file" />
            </layout>
          </parameter>
    
          <parameter>
            <parameterName value="@line" />
            <dbType value="String" />
            <size value="50" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%line" />
            </layout>
          </parameter>
    
          <parameter>
            <parameterName value="@identity" />
            <dbType value="String" />
            <size value="50" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%identity" />
            </layout>
          </parameter>
    
          <parameter>
            <parameterName value="@userName" />
            <dbType value="String" />
            <size value="50" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%username" />
            </layout>
          </parameter>
    
          <parameter>
            <parameterName value="@log_date" />
            <dbType value="DateTime" />
            <layout type="log4net.Layout.RawTimeStampLayout" />
          </parameter>
    
          <parameter>
            <parameterName value="@runtime" />
            <dbType value="Int32" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%timestamp" />
            </layout>
          </parameter>
    
          <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="4000" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%message" />
            </layout>
          </parameter>
    
          <parameter>
            <parameterName value="@exception" />
            <dbType value="String" />
            <size value="8000" />
            <layout type="log4net.Layout.ExceptionLayout" />
          </parameter>
    
        </appender>
    
        <root>
          <!-- 配置日志的级别,低于此级别的就不写到日志里面去 OFF、FATAL、ERROR, WARN, INFO, DEBUG, ALL -->
          <level value="DEBUG" />
          <appender-ref ref="LogFileAppenderByDate" />
          <appender-ref ref="LogFileAppenderBySize" />
          <appender-ref ref="LogFileAppenderBySizeAndDate" />
          <appender-ref ref="AdoNetAppender" />
        </root>
    
      </log4net>
    
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
    </configuration>
  3. 调用Log4Net

    首先在AssemblyInfo.cs类添加一行代码

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]

    编写调用方法

    class Program
    {
            private static readonly ILog log = LogManager.GetLogger(typeof(Program).Name);
    
            static void Main(string[] args)
            {
                for (int i = 0; i < 50; i++)
                {
                    try
                    {
                        int a = 8, b = 0, c = 0;
    
                        c = a / b;
                    }
                    catch (Exception ex)
                    {
                        if (log.IsErrorEnabled)
                        {
                            log.Error(null, ex);
                        }
    
                        if (log.IsDebugEnabled)
                        {
                            log.Debug("Debug", ex);
                        }
                    }
                }
    
                Console.ReadKey();
            }
    }

查看运行结果:

  • 路径下生成的文件
  • SQL SERVER 结果

时间: 2024-10-22 05:14:02

在VS2013中使用Log4net的相关文章

在VS2013中使用水晶报表

原文:在VS2013中使用水晶报表 又遇到了在B/S系统中打印,打印格式要求比较高,打印出的效果要求高大上.用VS2013中微软自带的报表,实在难以实现应用的效果,主要问题表现在: 1.不能插入用Word做好的打印模板,自己按照模板来做感觉比较费事,实现不了Word的打印效果,一旦打印模板改变,调整格式比较麻烦. 2.在火狐.谷歌浏览器中打印按钮不显示. 想试试水晶报表,无奈VS2013中已经不集成该报表了.需要单独下载安装http://scn.sap.com/docs/DOC-7824.大家可

VLFeat开源库介绍及在VS2013中的编译

VLFeat是一个开源的计算机视觉算法库,内容主要包括feature detectors.feature extractors.k-means clustering.randomized kd-tree matching.super-pixelization.它是跨平台的,能够应用在Linux.Mac.Windows平台.它的License是BSD. 在VS2013中编译VLFeat源码操作步骤: 1.      从http://www.vlfeat.org/ 下载源码(或从https://gi

在VS2013中配置QT5 win7_64

转自 在VS2013中配置QT5 win7_64 环境: win x64 + vs2013+QT5+vs_addin 下面示例正确配置QT以及VS2013 + QT Addin开发环境: 下载VS2013: http://pan.baidu.com/s/1geL6aQ3 到官网下载QT5的源码和qt vs-addin插件(在这之前你得在官网注册一个登陆账号): https://www.qt.io/download-open-source/#section-2 下载最新的QT5.8.0版本: 往下

MVC 中使用log4net 打印重复日志解决方法

最近在项目中引用log4net 来打印日志,会发现在同一时间点 打印重复记录: 详见图 其实,解决这个问题挺简单的就是太配置文件上logger 标签上添加一个additivity="false"属性就好了:完美解决.

Vs2013中通过Nuget添加不同版本jQuery

vs2013中如果直接更新jQuery则是2X的版本,为了兼容IE浏览器的,一般都是希望使用jQuery1.x版本的jQuery,则可在调出Nuget的控制台,在控制台输入(此例子是下载jQuery 1.11.0): Install-Package jQuery -Version 1.11.0   Vs2013中通过Nuget添加不同版本jQuery,布布扣,bubuko.com

在C#代码中应用Log4Net(二)典型的使用方式

不管用什么框架,学什么东西,最初的想法还不是尽快地用上这个框架,所以我们在这个章节还是不打算介绍具体配置节的应用,而是直接给出一个经典的使用样例,让你尽快上手.即使你对Log4Net的配置不熟悉也完全没有关系. (下面的文章假定你已经看过了第一篇,当然在有的操作中,我还是会简单地重复第一篇,以便加深你的记忆) 先说说这篇教程的思路,我们打算使用Log4Net,首先必须先引入Log4Net的库:然后我们要对Log4Net进行一些配置:最后,我们会在代码里面使用它. 1.引入Log4Net.dll组

VS2013中的MVC5模板部署到mono上的艰辛历程

在Xamarin.Studio创建的asp.net项目,部署过程非常顺利,没有遇到什么问题:但在VS2013中创建的asp.net项目,部署过程会有一些波折.现在想想,原因是Xamarin.Studio中的项目模板比较简单,只是显示几个文字,并没有用到mvc5中的东西. vs2013新建一个asp.net的项目(目标框架是.net4.5),选择mvc,并且更改身份验证为不适用身份验证. 编译,并发布到jexus默认站点指向的目录,访问之.报出的错误信息如下图. 根据异常堆栈信息,应该是调用Htm

VS2013中Python学习笔记[Django Web的第一个网页]

前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环境的搭建过程,以及Hello World的实现. 第二篇 VS2013中Python学习笔记[基础入门] 我简单学习使用了Python的几个基础的知识点. 第一个Web页面 第一步:首先打开VS2013开发工具 ,新建项目,选择Django Project模版. 修改项目名称,可以查看到项目的文件结

VS2013中使用GDI+绘图

VC范例,400多个例子源代码下载 http://download.csdn.net/detail/bigtree_mfc/7727977 VS2013中使用GDI+绘图和VC6.0不同,在VC6.0中能绘出的图像在VS2013中不会显示,原因就是在VS2013中需要添加初始化GDI+: 绘图 对话框视图类中:(绘图部分大同小异,) void **View::OnDraw(CDC *pDC){ //初始化部分 GdiplusStartupInput gdiplusStartupInput; UL