原文:C# log4net 日志写入到数据库

效果图:

1:第一步创建SQL表结构

  1.  
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    <?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.  
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <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. 1
    2
    3
    4
    5
    //[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. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    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. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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. 1
    2
    3
    4
    5
    6
    7
    8
    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

      

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

  1. C# 利用log4net 把日志写入到数据库表中

    效果图: 1:第一步创建SQL表结构  CREATE TABLE [dbo].[LogDetails] (  [LogID] int NOT NULL IDENTITY(1,1) ,  [LogDat ...

  2. C# 利用log4net 把日志写入到数据库

    效果图: 1:第一步创建SQL表结构   CREATE TABLE [dbo].[LogDetails] (   [LogID] int NOT NULL IDENTITY(1,1) ,   [Log ...

  3. 使用log4net 日志输出到数据库MySQL

    使用Log4Net的输出日志到MySQL 使用步骤如下: 1. 添加引用Log4Net.dll, mysql.data.dll到工程中 note: mysql.data.dll 版本要高,最好到mys ...

  4. log4net 日志写入MongoDB 实现分布式日志

    本人在.net framework 4.5下测试成功,首先需要安装log4mongo-net组件,见https://www.nuget.org/packages/log4mongo-net/ vs20 ...

  5. webservice log4net日志写入失败

    原因1:如果webservice和调用者都部署在一台机器上,日志有可能写到了项目所在目录中,虽然你添加的服务引用是部署在iis下的,但不会写到这.暂时解决办法,把webservice部署到内网服务器上 ...

  6. spring boot使用log4j2将日志写入mysql数据库

    log4j2官方例子在spring boot中报错而且还是用的是org.apache.commons.dbcp包 我给改了一下使用org.apache.commons.dbcp2包 1.log4j2. ...

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

    如题  建议将日志级别设置为ERROR.这样可以避免存储过多的数据到数据中. 1  logback 配置文件(如下) <?xml version="1.0" encoding ...

  8. mySql---logback日志写入数据库(mysql)配置

    如题  建议将日志级别设置为ERROR.这样可以避免存储过多的数据到数据中. 1  logback 配置文件(如下) <?xml version="1.0" encoding ...

  9. 使用log4j让日志写入数据库

    之前做的一个项目有这么个要求,在日志管理系统里,需要将某些日志信息存储到数据库里,供用户.管理员查看分析.因此我就花了点时间搞了一下这一功能,各位请看. 摘要:我们知道log4j能提供强大的可配置的记 ...

随机推荐

  1. LeetCode--152--乘积最大子序列(python)

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6.示例 2: 输 ...

  2. C++的命令行参数(gflag)

    参考:https://www.cnblogs.com/myyan/p/4699940.html 这是一款google开源的命令行参数解析工具,支持从环境变量.配置文件读取参数(可以用gflags代替配 ...

  3. C#中[JsonIgnore]意义

    字面意义是忽略序列化,就是当字段在序列化时,被[JsonIgnore]标记了的字段将被忽略序列化 序列化输出中使用Id和Name属性,但我绝对不会对AlternateName和Color感兴趣.我用[ ...

  4. HDU 4511 小明系列故事——女友的考验 ( Trie图 && DP )

    题意 :  给出编号从1 ~ n 的 n 个平面直角坐标系上的点,求从给出的第一个点出发到达最后一个点的最短路径,其中有两种限制,其一就是只能从编号小的点到达编号大的点,再者不能走接下来给出的 m 个 ...

  5. django model 操作总结

    使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的数据一一对应 例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足 ...

  6. Linux基础命令及使用帮助

    一.内部命令 内置命令(builtin):由shell程序自带的命令 help:查看内部命令 enable -n command 禁用某内部命令 enable -n 查看全部被禁用的命令 enable ...

  7. es之得分(加权)

    随着应用程序的增长,提高搜索质量的需求也进一步增大.我们把它叫做搜索体验.我们需要知道什么对用户更重要,关注用户如何使用搜索功能.这导致不同的结论,例如,有些文档比其他的更重要,或特定查询需强调一个字 ...

  8. 电脑配置Java环境变量之后,在cmd中仍然无法识别

    在电脑上配置了Java的环境变量,但是在cmd框中仍然无法识别: 解决方法:cmd.exe右键---以管理员身份运行,即可识别

  9. DB数据库的基本操作

    启动 MongoDB 服务 sudo service mongodb start 进入 MongoDB 命令行操作界面,在命令行中敲 exit 可以退出.mongo 创建数据库 use db 命令查看 ...

  10. 数据库为什么使用B+树而不是B树

    B树和B+树的区别主要有两点: 在B树中,你可以将键和值存放在内部节点和叶子节点,但在B+树中,内部节点都是键,没有值.叶子节点同时存放键和值 B+树的叶子节点有一条链相连,而B+树的叶子节点各自独立 ...