log4net 自定义Appender
最近有个需求,使用log4net来记录日志,然后将数据保存到服务器端。一开始打算写一个windows service,定期上传日志。
后来又因为一些场景下不适应,因此直接改为保存内存中,到一定阀值之后将数据post到服务器。
考虑用log4net的MemoryAppender,但是没办法控制这个阀值,同时还需要另外配置服务器接受数据地址。
因此也不适用,还好log4net支持自定义Appender,于是,参考MemoryAppender,自定义一个,问题解决。
下面是Appender代码。
/// <summary>
/// Customize Appender, save the Log in the memory
/// when it the event queue reach maximum queue size
/// the queue will post to sever.
/// </summary>
public class MyMemAppender : AppenderSkeleton
{
#region public properties
public string RemoteAddress { get; set; }
public int QueueSize { get; set; }
#endregion #region Public Instance Constructors
public MyMemAppender()
: base()
{
eventQueue = new ArrayList();
}
#endregion #region private fields
private ArrayList eventQueue;
#endregion #region Override implementation of AppenderSkeleton
protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
lock (eventQueue.SyncRoot)
{
eventQueue.Add(loggingEvent);
if (eventQueue.Count >= QueueSize)
{
this.Clear();
}
}
}
#endregion #region Public Instance Methods /// <summary>
/// Clear the list of events
/// </summary>
/// <remarks>
/// Clear the list of events
/// </remarks>
virtual public void Clear()
{
lock (eventQueue.SyncRoot)
{
SaveToServer();
eventQueue.Clear();
}
} /// <summary>
/// Gets the events that have been logged.
/// </summary>
/// <returns>The events that have been logged</returns>
/// <remarks>
/// <para>
/// Gets the events that have been logged.
/// </para>
/// </remarks>
virtual public LoggingEvent[] GetEvents()
{
lock (eventQueue.SyncRoot)
{
return (LoggingEvent[])eventQueue.ToArray(typeof(LoggingEvent));
}
} #endregion Public Instance Methods #region private methods
private void SaveToServer()
{
lock (eventQueue.SyncRoot)
{
List<LogModel> logList = new List<LogModel>();
foreach (log4net.Core.LoggingEvent evt in eventQueue)
{
try
{
LogModel m = Newtonsoft.Json.JsonConvert.DeserializeObject<LogModel>(evt.RenderedMessage);
logList.Add(m);
}
catch (Exception ex)
{
Console.Write(ex.ToString());
continue;
}
}
SaveToServer(logList);
}
} private void SaveToServer(List<LogModel> logList)
{
try
{
IsoDateTimeConverter timeConverter = new IsoDateTimeConverter();
timeConverter.DateTimeFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
string str = Newtonsoft.Json.JsonConvert.SerializeObject(logList, Newtonsoft.Json.Formatting.Indented, timeConverter);
PostStrToServer(str, RemoteAddress);
}
catch (Exception ex)
{
Console.Write(ex.ToString());
return;
}
} private void PostStrToServer(string content, string url)
{
using (WebClient client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
client.Encoding = System.Text.Encoding.UTF8;
client.UploadStringAsync(new Uri(url), ("logList=" + content));
}
} #endregion
}
配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
<appender name="myMemAppender" type="LogSystem.Common.MyMemAppender">
<param name="QueueSize" value="10"/>
<param name="RemoteAddress" value="http://localhost/PostLogData.aspx"/>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="myMemAppender" />
</root>
</log4net>
调用方式:
MyMemAppender logger = new MyMemAppender();
logger.QueueSize = ;
logger.RemoteAddress = "http://localhost:57427/PostLogData.aspx";
log4net.Config.BasicConfigurator.Configure(logger);
ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 或者
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(configPath));
log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log4net 自定义Appender的更多相关文章
- Log4Net Config Appender
整理了下以前项目中使用的Log4Net的Appender. 1:只记录在一个文件下的 <appender name="RollingFileAppenderFileSize" ...
- Log4net 自定义字段到数据库
今天要求做个log4net自定义字段到数据库,在网上找了好多例子,都运行不成功.最后找了个国外的,很简单的就解决了. log4net它已经定义的字段有 <commandText value=&q ...
- log4j2自定义Appender(输出到文件/RPC服务中)
1.背景 虽然log4j很强大,可以将日志输出到文件.DB.ES等.但是有时候确难免完全适合自己,此时我们就需要自定义Appender,使日志输出到指定的位置上. 本文,将通过两个例子说明自定义APP ...
- Log4j/Log4j2自定义Appender来实现日志级别计数统计及监控
一.简述 本文主要讲如何基于Log4j2来实现自定义的Appender.一般用途是用于Log4j2自带的Appender不足以满足我们的需求,或者需要我们对日志进行拦截统计等操作时,需要我们自定义Ap ...
- 7-log4j2之自定义Appender
一.添加Maven依赖 <dependencies> <dependency> <groupId>org.apache.logging.log4j</grou ...
- SpringBoot | 第二十五章:日志管理之自定义Appender
前言 前面两章节我们介绍了一些日志框架的常见配置及使用实践.一般上,在开发过程中,像log4j2.logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了.但在一些特殊需求 ...
- log4net 自定义Layout日志字段
最近在使用log4net的时候有一个简单的需求,就是自定义个格式化输出符.这个输出符是专门用来帮我记录下业务ID.业务类型的.比如,“businessID:328593,businessType: o ...
- log4net自定义字段写入SqlServer数据库 ASP.net
首先申明,本示例经过本作者亲自试验通过,可以运行 第一步 编写log4net配置文件 此处为Log.xml,该文件放在与Web.config平级的位置 <?xml version="1 ...
- log4net自定义扩展及配置说明
log4net文件保存配置我就不说太多了,网上一大把的,数据库配置其实网上也有,只是我第一次按照网上的配置没有跑通,我就说下数据库配置需要注意的地方吧. 下面是一个log4net的数据库代码配置 pu ...
随机推荐
- SASS详解之混合(mixins)
SASS详解之混合(mixins)可以出现在SASS的任何地方.有很多类名具有相同或者相似的样式,就可以用SASS中的混合(mixins)来进行编写,然后针对不同类名的不同样式逐一编写. 定义一个混合 ...
- dubbo 搭建开发环境
本文是基于maven的,预先使用,先装maven. dubbo是一个分布式服务框架,提供一个SOA的解决方案.简单的说,dubbo就像在生产者和消费者中间架起了一座桥梁,使之能透明交互. 本文旨在搭建 ...
- cordova编译crosswalk-webview插件报错的处理办法
一直用得好好的.今天编译cordova失败了.报错如下: :processArmv7DebugManifest :processArmv7DebugResourcesERROR: In FontFam ...
- vuex 操作姿势
Vuex 应用的核心就是 store,它包含着你的应用中大部分的状态 (state) 你不能直接改变 store 中的状态.改变 store 中的状态的唯一途径就是显式地提交 (commit) mut ...
- linux关闭地址空间随机化(ASLR)
转:http://www.xuebuyuan.com/1571079.html 确认ASLR是否已经被打开,"2"表示已经打开 shanks@shanks-ubuntu:/home ...
- 【转载】Xutils3-Dbutils
Github源码地址:https://github.com/wyouflf/xUtils3 下面是源码中sample关于Dbutils的使用代码: import android.view.View; ...
- Chris and Magic Square CodeForces - 711B
ZS the Coder and Chris the Baboon arrived at the entrance of Udayland. There is a n × n magic grid o ...
- Scrapy实战篇(四)之周杰伦到底唱了啥
从小到大,一直很喜欢听周杰伦唱的歌,可是相信很多人和我一样,并不能完全听明白歌词究竟是什么,今天我们就来研究一下周董最喜欢在歌词中用的词,这一小节的构思是这样的,我们爬取周杰伦的歌词信息,并且将其进行 ...
- POJ2955【区间DP】
题目链接[http://poj.org/problem?id=2955] 题意:[].()的匹配问题,问一个[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<= ...
- 【BZOJ 2121】 (字符串DP,区间DP)
2121: 字符串游戏 Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,B ...