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

前言

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

关键代码在第三步

一. 数据库表

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

d13652df02fb278515861baaeff8a4fd.png

二. log4net基础配置

1.nuget搜索log4net并安装。

d2627096aa0f8d71aa9a5ba004843957.png

2.Global.asax全局配置

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

9d30f5d8dde95a8fe0561cf6514b3559.png

三.创建自定义类

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

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

using System;

using System.ComponentModel;

namespace DataStatisticsApi.Log

{

///

/// 日志基础类

///

[Serializable]

public class BaseLog

{

public BaseLog()

{

}

///

///唯一标识符

///

[Description("测试1")]

public string test1

{

get; set;

}

///

///请求时间

///

[Description("测试2")]

public string test2

{

get; set;

}

}

}

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

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

using log4net.Appender;

using System.Configuration;

namespace DataStatisticsApi.Log

{

public class CustomAdoNetAppender : AdoNetAppender

{

///

/// Á¬½Ó×Ö·û´®Ãû³Æ

///

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中添加节点

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

五.Api测试

c6960b87a5cbc5e86334c76cd439c43e.png

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

bd7df4f5acf8da68a2279b6bc5041d5f.png

详细代码见github(后续上传)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值