Log4net 是.Net下一个非常优秀的开源日志记录组件。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。

由于业务需要,计划为日志增加2个字段,除了Log4net默认字段,额外增加了LOG_TYPE 和 LOG_OPERATOR 两个字段用于对日志分类和记录相关操作的人员,以便于检索。

本文方法参考了StackOverFlow问答中的内容(https://stackoverflow.com/questions/12139486/log4net-how-to-add-a-custom-field-to-my-logging),

此方法并不需要创建额外的类,使用非常简单。

1、创建数据库表

针对写入数据库的情况,如果写入文本无需创建数据表。

CREATE TABLE [dbo].[SYS_LOG1](
[LOG_ID] [int] IDENTITY(,) NOT NULL,
[LOG_DATE] [nvarchar]() NULL,
[LOG_THREAD] [nvarchar]() NULL,
[LOG_LEVEL] [nvarchar]() NULL,
[LOG_LOGGER] [nvarchar]() NULL,
[LOG_MESSAGE] [nvarchar]() NULL,
[LOG_EXCEPTION] [nvarchar]() NULL,
[LOG_TYPE] [nvarchar]() NULL,
[LOG_OPERATOR] [nvarchar]() NULL,
CONSTRAINT [PK_SYS_LOG2] PRIMARY KEY CLUSTERED
(
[LOG_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]

2、添加Log4net 配置AdoNetAppender节点

注意加粗的部分设计自定义字段的配置

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=127.0.0.1;initial catalog=JXFST_WMS;integrated security=false;persist security info=True;User ID=sa;Password=123" />
<commandText value="insert into SYS_LOG1 (LOG_DATE,LOG_THREAD,LOG_LEVEL,LOG_LOGGER,LOG_MESSAGE,LOG_EXCEPTION,LOG_TYPE,LOG_OPERATOR) values (@log_date, @thread,
      @log_level, @logger, @message, @exception, @log_type, @log_operator)
" />
<parameter>
<parameterName value="@log_date" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout" >
<conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.ffff}" />
</layout>
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
<parameter>
<parameterName value="@log_type" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{LogType}" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_operator" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{LogOperator}" />
</layout>
</parameter>
</appender>

3、使用Log4net的上下文来将值传递给参数

//传参
log4net.LogicalThreadContext.Properties["LogType"] = "Custom LogType";
log4net.LogicalThreadContext.Properties["LogOperator"] = "Custom log_operator"; //写日志
Program.sysLog.WarnFormat("TaskCompleteJob.Execute:处理Control任务失败 {0}", sResult);

或者干脆封装几个方法,取代Log4net原有的方法。

        /// <summary>
/// 自定义写入日志方法
/// </summary>
/// <param name="logType">日志类别</param>
/// <param name="logOperator">日志操作者</param>
/// <param name="logMessage">日志信息</param>
public void YwzWarn(string logType,string logOperator ,string logMessage)
{
log4net.LogicalThreadContext.Properties["LogType"] = logType;
log4net.LogicalThreadContext.Properties["LogOperator"] = logOperator; Program.sysLog.Warn(logMessage);
} /// <summary>
/// 自定义写入日志方法
/// </summary>
/// <param name="logType">日志类别</param>
/// <param name="logOperator">日志操作者</param>
/// <param name="logMessage">日志信息</param>
/// <param name="exception">异常信息</param>
public void YwzWarn(string logType, string logOperator, string logMessage, Exception exception)
{
log4net.LogicalThreadContext.Properties["LogType"] = logType;
log4net.LogicalThreadContext.Properties["LogOperator"] = logOperator; Program.sysLog.Warn("TaskCompleteJob.Execute:处理Control任务失败", exception);
} /// <summary>
/// 自定义写入日志方法
/// </summary>
/// <param name="logType">日志类别</param>
/// <param name="logOperator">日志操作者</param>
/// <param name="messageFormat">日志信息</param>
/// <param name="args">格式化参数</param>
public void YwzWarnFormat(string logType, string logOperator, string messageFormat, params object[] args)
{
log4net.LogicalThreadContext.Properties["LogType"] = logType;
log4net.LogicalThreadContext.Properties["LogOperator"] = logOperator; Program.sysLog.WarnFormat("TaskCompleteJob.Execute:处理Control任务失败_{0}", args); }

调用就变的更简单了。

this.YwzWarn("Task", "路人甲", "TaskCompleteJob.Execute:处理Control任务失败");
this.YwzWarn("Task", "路人甲", "TaskCompleteJob.Execute:处理Control任务失败",new Exception("发生异常啦"));
this.YwzWarnFormat("Task", "路人甲", "TaskCompleteJob.Execute:处理Control任务失败_{0}", "12344321abcddcba");

效果如下图。

Log4net 使用之 自定义字段的更多相关文章

  1. log4net插入access自定义字段

    1.创建表格 2.创建log4net.xml,并设置属性始终复制,关键属性 <bufferSize value="1" /> <conversionPattern ...

  2. log4net记录日志到数据库自定义字段

    假设数据库中有如下自定义字段:   1.根据自定义字段定义日志信息对象     public class MessageLog     {           /// <summary> ...

  3. log4net自定义字段写入SqlServer数据库 ASP.net

    首先申明,本示例经过本作者亲自试验通过,可以运行 第一步 编写log4net配置文件 此处为Log.xml,该文件放在与Web.config平级的位置 <?xml version="1 ...

  4. Log4net 自定义字段到数据库(二)

    这种方法比第一种方法麻烦些 Log4Net.config <?xml version="1.0" encoding="utf-8" ?> <c ...

  5. Log4net 自定义字段到数据库

    今天要求做个log4net自定义字段到数据库,在网上找了好多例子,都运行不成功.最后找了个国外的,很简单的就解决了. log4net它已经定义的字段有 <commandText value=&q ...

  6. Log4net 自定义字段 写入Oracle 使用ODP.NET Managed驱动

    一.环境说明: 开发工具:vs2010   ,数据库:oracle 11g ,版本:log4net的目前最新版本1.2.13.0    :  Oracle.ManagedDataAccess.dll ...

  7. SharePoint 2013 图文开发系列之自定义字段

    SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应用中,我们还需要一些功能特殊的字段,下面,我们简单介绍下字段的开 ...

  8. [SharePoint 2010] 自定义字段类型开发(二)

    在SharePoint 2010中实现View Action Button效果. http://www.sharepointblogs.be/blogs/vandest/archive/2008/06 ...

  9. Redmine自定义字段增多后会变慢

    问题: 在Redmine部署使用后,发现更新事务时速度慢,进行了相关试验,去掉了可能影响速度的插件,仍然很慢.以下为对比试验: 1.包含12个自定义字段的项目,更新用时2136ms,记录如下: Sta ...

随机推荐

  1. composer如何自动验证并获取gitlab的私有库?

        近期购买了Laravel的nova以后,需要对它的核心代码做一些修改,为方便与团队其他成员分享,以及在nova官方库更新后方便对差异管理.便将nova库挂在自己的gitlab,通过compos ...

  2. postgresql 匿名函数(单独执行代码段)

    do LANGUAGE plpgsql $$ declare top integer; row_org dbo.a_org_type%rowtype; begin /* Insert real cod ...

  3. wcf读写cookie

    一般来说,web应用的服务端(aspx或mvc的action)调用wcf时,是一个服务与服务的通讯,而不是客户端(浏览器)与服务器的通讯. 这种情况下,如果要在wcf端处理客户端的cookie,就需要 ...

  4. mysql根据经纬度求两地距离

    #1.两点距离(1.4142135623730951) ,),point(,)); select st_distance(point (120.10591, 30.30163),point(120.1 ...

  5. knockout事件绑定

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. spring cloud 服务发现

    Eureka 当注册中心使用. 注: 1.当仅有一台Eureka时,不需要向别的节点注册. 2.集群的时候,需要相互注册. 工作方式: 前提: Eureka    //注册中心 provide1  / ...

  7. Wampserver环境配置

    ☆根目录修改问题 /.修改运行根目录 1.修改apache配置,将服务请求定位到新目录下 →左击wampserver,点击Apache打开httpd.conf文件,Ctrl+f搜索documentro ...

  8. BZOJ2227 [Zjoi2011]看电影(movie)

    Description \(k\)个座位,\(n\)个人依次过来,每人随机从\(k\)个座位中选择一个,并从它开始不停向后走直到遇到空座位坐下.求所有人都能坐下的概率(即没有人走到第\(k+1\)个位 ...

  9. 百万级数据 MySQL处理(转)

    转自 http://www.cnblogs.com/win7xt/p/3156334.html 使用MySQL处理百万级以上数据时,不得不知道的几个常识   最近一段时间参与的项目要操作百万级数据量的 ...

  10. Android 图板之保存图像

    (1)为了能适应多种屏幕尺寸的手机,我们在创建图像的时候就要根据用户手机屏幕的宽高像素来创建. (2)该软件将把图形保存到sdcard中,在保存之前,需要检测sdcard是否存在,是否可写入.如通过以 ...