Log4net 使用之 自定义字段

时间:2022-09-23 22:29:03

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

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

本文方法参考了*问答中的内容(https://*.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 使用之 自定义字段

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

  1. log4net插入access自定义字段

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

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

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

  3. log4net自定义字段写入SqlServer数据库 ASP&period;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&period;NET Managed驱动

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

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

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

  8. &lbrack;SharePoint 2010&rsqb; 自定义字段类型开发&lpar;二&rpar;

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

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

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

随机推荐

  1. XML的一些事

    XML文件的优缺点: 使用XML作为传输格式的优势: 1. 格式统一, 符合标准 2. 容易与其他系统进行远程交互, 数据共享比较方便 3.调用将 XML 用作传输的现有服务. 4.使用 XSLT 可 ...

  2. SQL Server中关于跟踪(Trace&rpar;那点事

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

  3. CUDA 标准编程模式

    前言 本文将介绍 CUDA 编程的基本模式,所有 CUDA 程序都基于此模式编写,即使是调用库,库的底层也是这个模式实现的. 模式描述 1. 定义需要在 device 端执行的核函数.( 函数声明前加 ...

  4. 黄聪:深入理解PHP Opcode缓存原理

    什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少 ...

  5. BestCoder Round &num;2

    TIANKENG’s restaurant http://acm.hdu.edu.cn/showproblem.php?pid=4883 竟然暴力1.44*10^7  还要*T=100  竟然过了 # ...

  6. 【转】在iOS开发中使用FMDB

    本文转载自:唐巧的博客 在iOS开发中使用FMDB APR 22ND, 2012 前言 SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iO ...

  7. python高级-面向对象&lpar;11&rpar;

    一.面向过程和面向对象 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 二.类和对象 1.类的概念 面向对象编程的 ...

  8. Lua:Nginx Lua环境配置,第一个Nginx Lua代码

    一.编译安装LuaJIT Lua:编译安装LuaJIT,第一个Lua程序 http://blog.csdn.net/guowenyan001/article/details/48250427 二.下载 ...

  9. swing的弹出窗口

    swing作为基础的图形化显示界面开发,还是新手小难上手的一个项目学习,当然做好了之后的数据流转是对编程架构的很大提高. 这里我介绍一下swing的弹出窗口,作为界面交互的时候不可或缺的检测工具,简直 ...

  10. advStringGrid单元格文字垂直居中

    1.必须设置advStringGrid属性WordWrap = false, 2.在OnGetAlignment事件中,添加以下代码 procedure Tfrm_book_input.StringG ...