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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要添加自定义字段并将其保存到数据库,您可以使用 Log4Net 的 `AdoNetAppender`。下面是一些步骤: 1. 首先,您需要定义一个带有自定义字段的日志类。例如,您可以创建一个名为 `CustomLog` 的类,并在其中定义自定义属性,如下所示: ```csharp public class CustomLog { public string Message { get; set; } public string CustomField { get; set; } } ``` 2. 接下来,您需要在 Log4Net 配置文件中添加 `AdoNetAppender`。在 `AdoNetAppender` 中,您可以指定要将哪些字段保存到数据库中。您可以通过以下方式在配置文件中添加 `AdoNetAppender`: ```xml <log4net> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="Data Source=YOUR_DATASOURCE;Initial Catalog=YOUR_DATABASE;Integrated Security=True" /> <commandText value="INSERT INTO Logs (Message, CustomField) VALUES (@message, @customField)" /> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@customField" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{CustomField}" /> </layout> </parameter> </appender> <root> <level value="DEBUG" /> <appender-ref ref="AdoNetAppender" /> </root> </log4net> ``` 在上述配置中,我们指定了要将消息和自定义字段保存到名为 `Logs` 的表中。我们还为每个字段定义了一个参数,并且为自定义字段指定了 `conversionPattern`,它会将 `CustomField` 属性中的值转换为字符串并将其保存到数据库中。 3. 最后,您需要将自定义字段添加到日志记录中。您可以使用以下代码将自定义字段添加到日志记录中: ```csharp var log = new CustomLog { Message = "This is a log message", CustomField = "Custom field value" }; log4net.LogicalThreadContext.Properties["CustomField"] = log.CustomField; log4net.LogManager.GetLogger(typeof(Program)).Info(log.Message); ``` 在上述代码中,我们首先创建了一个 `CustomLog` 对象,并设置了 `Message` 和 `CustomField` 属性的值。然后,我们将 `CustomField` 属性的值添加到 `LogicalThreadContext.Properties` 集合中。最后,我们使用 `LogManager` 记录日志。 以上就是添加自定义字段并将其保存到数据库中的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值