Log4net 使用之 自定义字段

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(1,1) NOT NULL,
    [LOG_DATE] [nvarchar](255) NULL,
    [LOG_THREAD] [nvarchar](255) NULL,
    [LOG_LEVEL] [nvarchar](50) NULL,
    [LOG_LOGGER] [nvarchar](255) NULL,
    [LOG_MESSAGE] [nvarchar](4000) NULL,
    [LOG_EXCEPTION] [nvarchar](2000) NULL,
    [LOG_TYPE] [nvarchar](50) NULL,
    [LOG_OPERATOR] [nvarchar](50) 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="1" />
      <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="255" />
        <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="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
      <parameter>
        <parameterName value="@log_type" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{LogType}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_operator" />
        <dbType value="String" />
        <size value="50" />
        <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");

效果如下图。

原文地址:https://www.cnblogs.com/ywzdmu/p/9858389.html

时间: 2024-10-25 08:56:04

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

log4net插入access自定义字段

1.创建表格 2.创建log4net.xml,并设置属性始终复制,关键属性 <bufferSize value="1" /> <conversionPattern value="%property{usernm}" /> |DataDirectory| 如果是winform,在项目下加个文件夹App_Data然后将access数据库放进去. 在程序运行开始加上这个方法: string p = AppDomain.CurrentDomain.B

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

一.环境说明: 开发工具:vs2010   ,数据库:oracle 11g ,版本:log4net的目前最新版本1.2.13.0    :  Oracle.ManagedDataAccess.dll  Version 4.121.1.0 二.官网dll准备 log4net      http://mirrors.hust.edu.cn/apache//logging/log4net/binaries/log4net-1.2.13-bin-newkey.zip Oracle.ManagedData

关于log4net自定义字段写入不进数据库的问题

网上的教程上配置文件基本上都差不多 <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> <configSections> <section name="log4net" type="log4net.Config.Lo

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

这种方法比第一种方法麻烦些 Log4Net.config <?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- Author:GaoBingBing--> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfiguratio

Log4net 自定义字段到数据库

今天要求做个log4net自定义字段到数据库,在网上找了好多例子,都运行不成功.最后找了个国外的,很简单的就解决了. log4net它已经定义的字段有 <commandText value="INSERT INTO xiao_log(Date,Thread,Level,Logger,Message)VALUES(@log_date, @thread, @log_level, @logger, @message)"/> 中的Date,Thread,Level,Logger,M

Log4Net 自定义字段记录到数据库

大家可能都用过Log4net插件来记录日志,该插件默认提供了这几个字段@log_date,@exception, @thread, @log_level, @logger, @message, 但是这并不能完全满足我们日常记录日志的需求,我们可能需要扩展自己所需的其他字段,来记录到数据库.例如,对于用户操作日志,我们可能需要记录操作人员ID或者姓名,或者操作类型或者操作信息等. 下面简单地介绍一下Log4Net 自定义字段记录到数据库: 第一步,当然是创建对应的数据库日志表,如下图所示: 第二步

利用WordPress自定义字段为文章添加下载按钮

树经常要上传一些资源来给大家分享,但是每次都要手动加链接,关联图片,十分麻烦,于是就利用了一下wordpress的自定义字段功能来自动添加下载按钮下面就来说说怎么实现这个功能吧~其实方法很简单,利用的就是下面这一段代码 <?php if(get_post_meta($post->ID, "download", $single = true) != ""){ ?> <div id="download"> <a h

Linq多表链接分页,Select new{&quot;需要的字段列..&quot;},配合杨涛Mvcpager,前台遍历展示自定义字段

题前:,Select new{"需要的字段列.."}好处,减少不必要数据的查询,尤其是分布式的时候,网络再不好的情况下,而不必要的数据又很多,Select new{"需要的字段列.."}好处明显 如题,Linq多表链接分页,Select new{"需要的字段列.."},配合杨涛Mvcpager,前台遍历展示自定义字段 (1)  我的例子是,(Tb_Mnager)管理员表与(Tb_Role)角色表联查,返回两个表部分字段的组合 如下控制器代码: p

redmine 自定义字段mysql表结构

redmine可以创建自定义字段,我经常用它来满足不同的管理需求,现在来解读一下,看看这些自定义字段是如何存在mysql表中的. 表issues 用来存放issue的标准字段. mysql> describe issues; +----------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------