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(,) 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插入access自定义字段
1.创建表格 2.创建log4net.xml,并设置属性始终复制,关键属性 <bufferSize value="1" /> <conversionPattern ...
- log4net记录日志到数据库自定义字段
假设数据库中有如下自定义字段: 1.根据自定义字段定义日志信息对象 public class MessageLog { /// <summary> ...
- log4net自定义字段写入SqlServer数据库 ASP.net
首先申明,本示例经过本作者亲自试验通过,可以运行 第一步 编写log4net配置文件 此处为Log.xml,该文件放在与Web.config平级的位置 <?xml version="1 ...
- Log4net 自定义字段到数据库(二)
这种方法比第一种方法麻烦些 Log4Net.config <?xml version="1.0" encoding="utf-8" ?> <c ...
- Log4net 自定义字段到数据库
今天要求做个log4net自定义字段到数据库,在网上找了好多例子,都运行不成功.最后找了个国外的,很简单的就解决了. log4net它已经定义的字段有 <commandText value=&q ...
- Log4net 自定义字段 写入Oracle 使用ODP.NET Managed驱动
一.环境说明: 开发工具:vs2010 ,数据库:oracle 11g ,版本:log4net的目前最新版本1.2.13.0 : Oracle.ManagedDataAccess.dll ...
- SharePoint 2013 图文开发系列之自定义字段
SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应用中,我们还需要一些功能特殊的字段,下面,我们简单介绍下字段的开 ...
- [SharePoint 2010] 自定义字段类型开发(二)
在SharePoint 2010中实现View Action Button效果. http://www.sharepointblogs.be/blogs/vandest/archive/2008/06 ...
- Redmine自定义字段增多后会变慢
问题: 在Redmine部署使用后,发现更新事务时速度慢,进行了相关试验,去掉了可能影响速度的插件,仍然很慢.以下为对比试验: 1.包含12个自定义字段的项目,更新用时2136ms,记录如下: Sta ...
随机推荐
- 既之前的基础,先写个简单的PHP 与数据库 的数据交流
程序分三个板块, 现在先不用 css 和 javascript 先用纯 html php 写吧. 所以那些 嵌入式 <font size=.... 什么的看看就算了,不推荐如此使 ...
- Ionic APP 热更新
开门见山,本文主题:cordova-hot-code-push 作用:cordova热更新插件,提供了在应用程序中对基于Web的内容进行自动更新的功能. GitHub地址:https://github ...
- 设计模式学习--面向对象的5条设计原则之接口隔离原则--ISP
一.ISP简介(ISP--Interface Segregation Principle): 使用多个专门的接口比使用单一的总接口要好.一个类对另外一个类的依赖性应当是建立在最小的接口上的.一个接口代 ...
- videojs IE8无法播放解决方案
1.如果是在.cs文件里初始化视频元素,没有遇到无法播放问题. 2.如果是js动态换播放器的poster和src遇到此问题,解决办法是用videojs提供的函数来设置 https://github.c ...
- 【转】通过CountDownLatch提升请求处理速度
countdownlatch是java多线程包concurrent里的一个常见工具类,通过使用它可以借助线程能力极大提升处理响应速度,且实现方式非常优雅.今天我们用一个实际案例和大家来讲解一下如何使用 ...
- centos7安装 ftp 组件与开放防火墙端口命令
Linux 安装 ftp 组件 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是 vsftp 的配置文件. 1.执行 yum -y install vsftpd 2. 添加一个 f ...
- node.js和JavaScript的关系
node.js是一个基于 Chrome V8 引擎的 JavaScript 运行时环境. 一.类比JavaScript和java JavaScript java V8 JVM node.js JRE ...
- css画一个提示框
用css画一个如下图的提示框: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- js-权威指南学习笔记7
第七章 数组 1.数组直接量的语法允许有可选的结尾的逗号,所以[ , , ]只有两个元素而非三个. 2.调用构造函数Array()创建数组时,传入一个参数时表示指定数组的长度. 3.所有的索引都是属性 ...
- 记ASP.NET 使用 X509Certificate2 出现的一系列问题
在做微信支付退款的时候,由于需要使用到p12证书,结果就遇到一系列的坑.这里做个记录方便以后查阅. 原先加载证书的代码: X509Certificate2 cert = new X509Certifi ...