C# log4net 日志写入到数据库

效果图:

1:第一步创建SQL表结构

  1. CREATE TABLE [dbo].[LogDetails] (
    
    [LogID] int NOT NULL IDENTITY(1,1) ,
    
    [LogDate] datetime NOT NULL ,
    
    [LogThread] nvarchar(100) NOT NULL ,
    
    [LogLevel] nvarchar(200) NOT NULL ,
    
    [LogLogger] nvarchar(500) NOT NULL ,
    
    [LogMessage] nvarchar(3000) NOT NULL ,
    
    [LogActionClick] nvarchar(4000) NULL ,
    
    [UserName] nvarchar(30) NULL ,
    
    [UserIP] varchar(20) NULL
    
    )
    

      2:创建项目然后下载log4net.dll 在项目中添加引用http://logging.apache.org/log4net/download_log4net.cgi下载Binaries 下面的

3:创建 log4net.config

  1. <?xml version="1.0" encoding="utf-8" ?>
    
    <log4net debug="false">
    
    <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
    
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
    
    <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
    
    <bufferSize value="0" />
    
    <!--日志数据库连接串-->
    
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    
    <connectionString value="DATABASE=GoodLook;SERVER=xx.xx.140.170;UID=sa;PWD=123456a;Connect Timeout=30;" />
    
    <!--日志数据库脚本-->
    
    <commandText value="INSERT INTO LogDetails ([LogDate],[LogThread],[LogLevel],[LogLogger],[LogActionClick],[LogMessage],[UserName],[UserIP]) VALUES (@log_date, @thread, @log_level, @logger, @ActionsClick, @message,@UserName,@UserIP)" />
    
    <!--日志时间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="@message" />
    
    <dbType value="String" />
    
    <size value="3000" />
    
    <layout type="Log4NetApply.MyLayout">
    
    <conversionPattern value="%property{Message}" />
    
    </layout>
    
    </parameter>
    
    <parameter>
    
    <parameterName value="@ActionsClick" />
    
    <dbType value="String" />
    
    <size value="4000" />
    
    <layout type="Log4NetApply.MyLayout" >
    
    <conversionPattern value = "%property{ActionsClick}"/>
    
    </layout>
    
    </parameter>
    
    <!--自定义UserName -->
    
    <parameter>
    
    <parameterName value="@UserName" />
    
    <dbType value="String" />
    
    <size value="30" />
    
    <layout type="Log4NetApply.MyLayout" >
    
    <!--log4net.MDC.Set("UserName", "asdfasdf");
    
    <conversionPattern value = "%X{UserName}"/>-->
    
    <conversionPattern value = "%property{UserName}"/>
    
    </layout>
    
    </parameter>
    
    <parameter>
    
    <parameterName value="@UserIP" />
    
    <dbType value="String" />
    
    <size value="20" />
    
    <layout type="Log4NetApply.MyLayout" >
    
    <conversionPattern value = "%property{UserIP}"/>
    
    </layout>
    
    </parameter>
    
    </appender>
    
    <!-- setup the root category, add the appenders and set the default level -->
    
    <root>
    
    <level value="Warn"/><!-- 定义记录的日志级别-->
    
    <level value="Info"/>
    
    <level value="Debug"/>
    
    <level value="Fine"/>
    
    <appender-ref ref="ADONetAppender" /><!-- 记录到什么介质中-->
    
    </root>
    
    <!-- specify the level for some specific categories -->
    
    <!--//关于上边root到logger这块,如果同时出现,有可能会出现重复插入记录的情况:-->
    
    <!--<logger name="iNotes">
    
    <level value="WARN"/>
    
    <level value="INFO"/>
    
    <level value="DEBUG"/>
    
    <level value="FINE"/>
    
    <appender-ref ref="ADONetAppender"/>
    
    </logger>
    
    <logger name="StellaLogger">
    
    <level value="ALL"/>
    
    <appender-ref ref="AdoNetAppender" />
    
    </logger>-->
    
    <appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">
    
    <!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件-->
    
    <param name="File" value="D:/Log/" />
    
    <!--是否追加到文件-->
    
    <param name="AppendToFile" value="true" />
    
    <!--记录日志写入文件时,不锁定文本文件-->
    
    <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
    
    <!--Unicode编码-->
    
    <!--<Encoding value="UTF-8" />-->
    
    <!--最多产生的日志文件数,value="-1"为不限文件数-->
    
    <!--<param name="MaxSizeRollBackups" value="10" />-->
    
    <!--是否只写到一个文件中-->
    
    <param name="StaticLogFileName" value="false" />
    
    <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
    
    <param name="RollingStyle" value="Composite" />
    
    <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]-->
    
    <param name="DatePattern" value="yyyy-MM-dd/"ReflectionLayout.log"" />
    
    <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />-->
    
    <!--<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log"" />-->
    
    <!--每个文件的大小。只在混合方式与文件大小方式下使用,超出大小的在文件名后自动增加1重新命名-->
    
    <param name="maximumFileSize" value="500KB" />
    
    <!--记录的格式。-->
    
    <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
    
    <param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />
    
    </layout>
    
    </appender>
    
    </log4net>
    

      

4:在Web.config 里面加 configSections 节点 (CS可直接写在app.config里面,或者都写在一个config里面)

  1. <configuration>
    
    <strong> <span style="color:#FF0000;"> <configSections>
    
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    
    </configSections>
    
    <log4net configSource="log4net.config"/></span></strong>
    
    <system.web>
    
    <compilation debug="true" targetFramework="4.5" />
    
    <httpRuntime targetFramework="4.5" />
    
    </system.web>
    
    </configuration>
    

      

5:Properties 属性下面的AssemblyInfo.cs 追加 必须有这个,否则写入不到数据库中

  1. //[assembly: log4net.Config.XmlConfigurator(Watch = true)]
    
    //注意: ConfigFile 可以指定相对路径 和 绝对路径。 eg: /log/xxxx.log 或者 d://log//xxxx.log
    
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
    

      

6:添加 Global.asax

然后在Application_Start 追加 读取配置程序文件

  1. protected void Application_Start(object sender, EventArgs e)
    
    {
    
    //应用程序启动时,自动加载配置log4Net
    
    XmlConfigurator.Configure();
    
    }
    7:创建自定义类 LogPublicClass.cs,为了方便写入数据库中 自定义的一些信息
    
    using log4net.Layout;
    
    using log4net.Layout.Pattern;
    
    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Reflection;
    
    using System.Web;
    
    namespace Log4NetApply
    
    {
    
    /// <summary>
    
    /// 包含了所有的自定字段属性
    
    /// </summary>
    
    public class LogContent
    
    {
    
    public LogContent(string macAddress, string computerName, string actionsclick, string description)
    
    {
    
    UserIP = macAddress;
    
    UserName = computerName;
    
    ActionsClick = actionsclick;
    
    Message = description;
    
    }
    
    /// <summary>
    
    /// 访问IP
    
    /// </summary>
    
    public string UserIP { get; set; }
    
    /// <summary>
    
    /// 系统登陆用户
    
    /// </summary>
    
    public string UserName { get; set; }
    
    /// <summary>
    
    /// 动作事件
    
    /// </summary>
    
    public string ActionsClick { get; set; }
    
    /// <summary>
    
    /// 日志描述信息
    
    /// </summary>
    
    public string Message { get; set; }
    
    }
    
    public class MyLayout : PatternLayout
    
    {
    
    public MyLayout()
    
    {
    
    this.AddConverter("property", typeof(LogInfoPatternConverter));
    
    }
    
    }
    
    public class LogInfoPatternConverter : PatternLayoutConverter
    
    {
    
    protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
    
    {
    
    if (Option != null)
    
    {
    
    // Write the value for the specified key
    
    WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
    
    }
    
    else
    
    {
    
    // Write all the key value pairs
    
    WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
    
    }
    
    }
    
    /// <summary>
    
    /// 通过反射获取传入的日志对象的某个属性的值
    
    /// </summary>
    
    /// <param name="property"></param>
    
    /// <returns></returns>
    
    private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
    
    {
    
    object propertyValue = string.Empty;
    
    PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
    
    if (propertyInfo != null)
    
    propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
    
    return propertyValue;
    
    }
    
    }
    
    }
    

      

8:示例使用

  1. try
    
    {
    
    log.Info(new LogContent("127.0.0.1", "111111", "登陆系统", "登陆成功"));
    
    var ss = 1 - int.Parse("sss");
    
    }
    
    catch(Exception ex)
    
    {
    
    log.Error(new LogContent("127.0.0.1", "111111", "登陆系统", ex.Message+":"+ex.StackTrace));
    
    }
    

      

其他自行参考下列文章

  1. http://www.cnblogs.com/kissazi2/p/3393151.html
    
    http://blog.csdn.net/zdw_wym/article/details/48802821
    
    http://blog.csdn.net/ydm19891101/article/details/50561638
    
    http://www.cnblogs.com/yuangang/archive/2016/05/16/5497140.html
    

      

原文地址:https://www.cnblogs.com/stry/p/9847832.html

时间: 2024-10-09 03:04:07

C# log4net 日志写入到数据库的相关文章

关于log4net日志写入mysql数据库记录

网上关于log4net日志写入mysql数据库的博客感觉比较少,所以这边搞定之后先过来记录一下. 首先新建个项目,我命名是log4netDemo,然后需要引入两个dll,一个是mysql.dll,一个是log4net.dll.可以通过NuGet安装这两个dll,如下图 我这边mysql和log4net的版本分别是6.10.8和2.0.8,当然mysql更高版本的也是可以的. 然后在项目中新建一个log4net.config的配置文件,配置全文如下: <?xml version="1.0&q

使用log4j让日志写入数据库

之前做的一个项目有这么个要求,在日志管理系统里,需要将某些日志信息存储到数据库里,供用户.管理员查看分析.因此我就花了点时间搞了一下这一功能,各位请看. 摘要:我们知道log4j能提供强大的可配置的记日志功能,有写文件的.打印到控制台的等等,但有时我们需要它把日志输出到后台数据库中,log4j的强大的可扩展性支持了这一点,以下就是具体的实现. 关键词:log,log4j,日志,Java,DB,数据库,slf4j 前提:已经配置好slf4j.log4j,能正常的往文件或控制台写日志. 需求:将日志

logback日志写入数据库(mysql)配置

如题  建议将日志级别设置为ERROR.这样可以避免存储过多的数据到数据中. 1  logback 配置文件(如下) <?xml version="1.0" encoding="UTF-8" ?> <configuration scan="true"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender&q

将日志写入数据库

之前做的一个项目有这么个要求,在日志管理系统里,需要将某些日志信息存储到数据库里,供用户.管理员查看分析.因此我就花了点时间搞了一下这一功能,各位请看. 摘要:我们知道log4j能提供强大的可配置的记日志功能,有写文件的.打印到控制台的等等,但有时我们需要它把日志输出到后台数据库中,log4j的强大的可扩展性支持了这一点,以下就是具体的实现. 关键词:log,log4j,日志,Java,DB,数据库,slf4j 前提:已经配置好slf4j.log4j,能正常的往文件或控制台写日志. 需求:将日志

asp.net利用log4net写入日志到SqlServer数据库

asp.net利用log4net写入日志到SqlServer数据库 作者: Kein  来源: 博客园  发布时间: 2010-10-14 07:19  阅读: 6427 次  推荐: 6   原文链接   [收藏] 摘要:Log4net是一个开源的错误日志记录项目,asp.net利用log4net写入日志到SqlServer数据库.下面就我的安装部署log4net到MS sql server的经验与大家分享. asp.net利用log4net写入日志到SqlServer数据库,Log4net是

c#用log4Net将日志写入到Oracle数据库,并写入到文件中

原文:c#用log4Net将日志写入到Oracle数据库,并写入到文件中 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_37913923/article/details/79072898 1.从官网下载log4net包,安装到项目中: 2.配置文件log4net.config/app.config <?xml version="1.0" encoding=&

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

问题1: 在公司进行log4net写入服务器配置的时候,一切正常,但是在家里的机器上,就频繁出现这个问题: SQL Server 2008 报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误 并且这种错误是随机性的,在log4net往数据库插入几条的时候,没问题,但是插入次数一多起来,就频繁报这个错误.后来没办法,网上搜罗了一圈,最终发现了解决方案: 将相关的TCP参数都设置为启动之后,就再没遇到过问题. 问题2,log4net配置都正确,但是一直无法写入数据库. 这个问题困扰了好久,

关于使用Log4Net将日志插入oracle数据库中

1.关于配置文件. <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> </configSections> <log4

也用 Log4Net 之将日志记录到数据库的配置 (一)

也用 Log4Net  之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需要不同的记录方式,比如利用数据库来记录,用txt的文件形式来记录,当然,这些都是最常用的记录方式.而且不同的业务组都希望有自己的记录数据表,不希望和其他业务组的数据混在一起.于是我先前设想的架构方式也就付之一炬了,因为不够灵活,而且实现难度大.周期长.恰在此时想起了之前做项目的时候用的 Log4Ne