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. Firebird 获取用户表及字段

    select rdb$relation_fields.rdb$relation_name table_name, rdb$relations.rdb$description table_des, rd ...

  2. 脚手架(create-react-app)没有eject情况下,使用react-scripts的时候,动态设置环境变量

    在实际开发中,例如:有时候打包发布时,需要手动更新版本,比如修改package.json中的version,但是如果有时候忘了修改,那么又得build一次: 如果能动态设置多好,webpack下可以在 ...

  3. spring下redis使用资料

    参考资料地址: spring集成redis Spring缓存注解@Cacheable.@CacheEvict.@CachePut使用 redis常用命令 redis持久化(RDB与AOF) Redis ...

  4. 【模板 && 拓扑】 Dijkstra 单源最短路径算法

    话不多说上代码 链式前向星233 #include<bits/stdc++.h> using namespace std; ,_max=0x3fffffff; //链式前向星 struct ...

  5. [PHP] 商品类型规格属性后台管理(代码流程备忘)

    实现界面 涉及到四张表,type(商品类型表),type_spec(商品类型规格关联表),attribute(商品属性表),attribute_value(商品属性值表) 新建基控制器BaseCont ...

  6. idea入手配置

    一.编码配置 utf-8 二.注释模板(Java Doc) 三.Live Templates 快捷键模板, 如配置logger,(类似 sout)

  7. java实现黑客帝国数字雨特效(转)

    原文出处https://www.cnblogs.com/x110/p/4239585.html 我在原文的基础上做了优化,使动画看起来更流畅,效果如下 import java.awt.*; impor ...

  8. mybatis-plus的集成与使用

    Mybatis-Plus: Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 官方网站:http://m ...

  9. python学习之老男孩python全栈第九期_day015知识点总结

    # 作用域相关(2)locals() # 返回本地作用域中的所有名字 globals() # 返回全局作用域中的所有名字 # 迭代器/生成器相关(3)range()print('__next__' i ...

  10. IBM V7000错误代码及解决

    https://www.ibm.com/support/knowledgecenter/zh/ST3FR7_7.7.1/com.ibm.storwize.v7000.771.doc/svc_error ...