文档章节

log4net配置自定义字段存入数据库

刘昌鑫
 刘昌鑫
发布于 2018/12/06 18:38
字数 898
阅读 40
收藏 0

 

前言

以bs项目中引入log4net为例。log4net存入数据库提供了基本的(时间、线程、等级、message)字段。 但是实际日志场景中可能需要统计IP、用户ID或者其他业务相关的信息记入日志。 需要重写log4net的部分方法来实现。本文展示使用log4net从0开始到记录自定义字段入库的过程。

关键代码在第三步

一. 数据库表

随便创建一个测试的表,有test1和test2两个字段,后续用log4net存入数据。

二. log4net基础配置

1.nuget搜索log4net并安装。

2.Global.asax全局配置

   在Global.asax中添加  log4net.Config.XmlConfigurator.Configure();这句。如图。

三.创建自定义类

1.创建一个自己数据库里日志表的实体,方便传值、添加数据等。

我这里命名为BaseLog.cs, 字段为test1和test2 ,和数据库表对应

using System;
using System.ComponentModel;

namespace DataStatisticsApi.Log
{
    /// <summary>
    /// 日志基础类
    /// </summary>
    [Serializable]
    public class BaseLog
    {
        public BaseLog()
        {
        }

        ///<summary>
        ///唯一标识符
        ///</summary>
        [Description("测试1")]
        public string test1
        {
            get; set;
        }
        ///<summary>
        ///请求时间
        ///</summary>
        [Description("测试2")]
        public string test2
        {
            get; set;
        }
    }
}

2.增加数据库连接字符串属性

创建一个类,继承log4net的AdoNetAppender类。


using log4net.Appender;
using System.Configuration;
namespace DataStatisticsApi.Log
{

    public class CustomAdoNetAppender : AdoNetAppender
    {
        /// <summary>
        /// Á¬½Ó×Ö·û´:registered:Ãû³Æ
        /// </summary>
        public new string ConnectionStringName
        {
            set
            {
                this.ConnectionString = ConfigurationManager.ConnectionStrings[value].ConnectionString;
            }
        }

    }
}

3.增加一个自定义的日志类

创建一个类,作为一个自定义的日志。我这里叫DataLogAdoAppender, 同样继承自log4net的AdoNetAppender类。

在该类中写自己插入表的语句和参数,并在最后调用log4net的ActivateOptions方法初始化加载log4net配置。


using System;

using log4net.Appender;
using System.Data;
using log4net.Layout;
namespace DataStatisticsApi.Log
{
    public class DataLogAdoAppender : CustomAdoNetAppender
    {
        public DataLogAdoAppender()
        {
            //System.Data.SqlClient
            Type t = typeof(System.Data.SqlClient.SqlConnection);
            string s = t.Assembly.FullName.ToString();
            //数据连接类型
            this.ConnectionType = $"System.Data.SqlClient.SqlConnection, {s}";

            base.UseTransactions = false;
            this.CommandType = CommandType.Text;
            //sql语句
            this.CommandText = @"INSERT INTO [dbo].[testLog]
                                       ([test1]
                                       ,[test2])
                                      
                                 VALUES
                                       (@test1
                                       ,@test2
                                       )";
            //填充参数
            string parameterName = "test1";
            this.AddParameter(new AdoNetAppenderParameter() { ParameterName = "@" + parameterName, DbType = DbType.String, Size = 50, Layout = new Layout2RawLayoutAdapter(new LogLayout("%" + parameterName)) });
            parameterName = "test2";
            this.AddParameter(new AdoNetAppenderParameter() { ParameterName = "@" + parameterName, DbType = DbType.String, Size = 200, Layout = new Layout2RawLayoutAdapter(new LogLayout("%" + parameterName)) });

            base.ActivateOptions();
        }
    }
}

4.增加一个自定义的转换类

 创建一个自定义转换类,把log4net对象转换成自定义日志类的字段属性。继承log4net的PatternLayout类,并重写ActivateOptions方法。

using System.IO;

using log4net.Core;
using log4net.Layout;
using log4net.Layout.Pattern;

namespace DataStatisticsApi.Log
{
    public class LogLayout : PatternLayout
    {
        public LogLayout(string pattern)
            : base(pattern)
        {

        }
        public override void ActivateOptions()
        {
            this.AddConverter("test1", typeof(test1Converter));

            this.AddConverter("test2", typeof(test2Converter));

            base.ActivateOptions();
        }
    }

    #region 转换
    internal sealed class test1Converter : PatternLayoutConverter
    {
        override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            BaseLog log = (BaseLog)loggingEvent.MessageObject;
            if (log != null)
                writer.Write(log.test1);
        }
    }

    internal sealed class test2Converter : PatternLayoutConverter
    {
        override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            BaseLog log = (BaseLog)loggingEvent.MessageObject;
            if (log != null)
                writer.Write(log.test2);
        }
    }

    #endregion


}

 

 

四.log4net存库配置

在web.config中添加<log4net>节点

<log4net>
  <!-- 业务日志-“数据库”记录器 -->
  <appender name="DataLogAdoAppender" type="DataStatisticsApi.Log.DataLogAdoAppender">
    <!-- 依赖的数据库链接名称 -->
    <connectionStringName value="ConnectionString"/>
    <!-- 缓存条数,到达value值时批量插入,1为每次都插入。实际环境根据日志量设置500或者更多-->
    <bufferSize value="1"/>
  </appender>
  <root>
    <level value="DEBUG" />
  </root>
  <!-- 自定义记录日志-->
  <logger name="DataLogAdoAppenderLogger">
    <!--信息级别仅限(FATAL)-->
    <level value="INFO" />
    <!--日志配置,ref对应appender配置-->
    <appender-ref ref="DataLogAdoAppender" />
  </logger>
</log4net>

在web.config中添加<connectionStrings>节点(数据库连接字符串)

<connectionStrings>
 <add name="ConnectionString" connectionString="Data Source=1.1.1.3,1355; User ID=xxx; Password=xxx; Initial Catalog=dbName" providerName="System.Data.SqlClient" />
 </connectionStrings>

五.Api测试

测试访问,日志数据成功入库

 

详细代码见github 详细代码

© 著作权归作者所有

刘昌鑫

刘昌鑫

粉丝 8
博文 83
码字总数 26615
作品 0
海淀
后端工程师
私信 提问
log4net:添加自定义字段并将日志存储到Oracle11g数据库中

我的操作系统为Win7旗舰版,.NET版本为4.5,log4net版本为1.2.15,Oracle版本为11g。 使用log4net建立一个最简单的DEMO,可以参考我的上一篇博客: http://my.oschina.net/Tsybius2014/blog...

北风其凉
2016/06/07
324
0
Log4Net 日志记录的实现

一、前言 在上一篇文章【(转载)非常完善的Log4net配置详细说明】介绍了Log4Net的配置说明,如果不知道的可以去看看,这里我们就介绍一下日志记录的实现,说得都比较基础,所以大神请绕过。 ...

园子的蜗牛
09/08
0
0
log4net 存日志进oracle数据库,测试通过,但是经常丢失数据

配置的log4net存日志到oracle,MVC层监测的action,记录操作行为日志。配置什么的都没问题,测试是可以存入数据库的,但是问题在于有时候数据能进库,有时候怎么都进不去。还有不会马上进库,...

彩色铅笔
2014/07/29
647
6
nxlog4go 简介 - 基于log4go的下一代日志系统 - Go中国技术社区 - golang

nxlog4go的项目网址: https://github.com/ccpaging/nxlog4go 项目历史 ccpaging's log4go forked from https://github.com/alecthomas/log4go The latest release is 4.0.3 详见:https://g......

2018/01/28
0
0
log4net 自定义Layout日志字段

最近在使用log4net的时候有一个简单的需求,就是自定义个格式化输出符。这个输出符是专门用来帮我记录下业务ID、业务类型的。比如,“businessID:328593,businessType: orderID”。类似这样的...

王清培
2016/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android -------- kotlin插件神器Json直接生成javaBean

这是一个data class从JSON字符串生成Kotlin 的插件,换句话说,是一个将JSON字符串转换为Kotlin data class(Json到Kotlin)的插件 在使用Kotlin进行开发的时候,我们需要经常对Json数据做解析...

切切歆语
12分钟前
20
0
1、Spring注解开发,第一天

第一天:Spring annotation开发 目录:1、@Configuration与@Bean给容器注册组件 2、@ConponentScan自动扫描注解 一、@Configuration与@Bean给容器注册组件 1、旧版本中创建配置文件和Bean //...

有一个小阿飞
19分钟前
16
0
斯坦福博弈论笔记整理活动的任务已重新划分,望周知

参与方式:https://github.com/apachecn/stanford-game-theory-notes-zh/blob/master/CONTRIBUTING.md 整体进度:https://github.com/apachecn/stanford-game-theory-notes-zh/issues/1 项目......

ApacheCN_飞龙
20分钟前
11
0
使用HTML5 canvas完成的一个网页白板

该代码能够使用canvas对象完成的一个基本功能。仅供大家参考。 <html> <head> <meta http-equiv="Content-Type" contentType="text/html; charset=UTF-8" %> <title>Title</title> <script t......

前端老手
23分钟前
13
0
web漏洞之xss(学习记录)

xss又名跨站脚本攻击,是一种注入攻击,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML、JavaScript)到网页中时,如果用户访问了含有恶意代码的页面,恶意脚本就会被浏览器...

半缘修道半缘君丶
25分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部