最近有个需求,使用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的更多相关文章

  1. Log4Net Config Appender

    整理了下以前项目中使用的Log4Net的Appender. 1:只记录在一个文件下的 <appender name="RollingFileAppenderFileSize" ...

  2. Log4net 自定义字段到数据库

    今天要求做个log4net自定义字段到数据库,在网上找了好多例子,都运行不成功.最后找了个国外的,很简单的就解决了. log4net它已经定义的字段有 <commandText value=&q ...

  3. log4j2自定义Appender(输出到文件/RPC服务中)

    1.背景 虽然log4j很强大,可以将日志输出到文件.DB.ES等.但是有时候确难免完全适合自己,此时我们就需要自定义Appender,使日志输出到指定的位置上. 本文,将通过两个例子说明自定义APP ...

  4. Log4j/Log4j2自定义Appender来实现日志级别计数统计及监控

    一.简述 本文主要讲如何基于Log4j2来实现自定义的Appender.一般用途是用于Log4j2自带的Appender不足以满足我们的需求,或者需要我们对日志进行拦截统计等操作时,需要我们自定义Ap ...

  5. 7-log4j2之自定义Appender

    一.添加Maven依赖 <dependencies> <dependency> <groupId>org.apache.logging.log4j</grou ...

  6. SpringBoot | 第二十五章:日志管理之自定义Appender

    前言 前面两章节我们介绍了一些日志框架的常见配置及使用实践.一般上,在开发过程中,像log4j2.logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了.但在一些特殊需求 ...

  7. log4net 自定义Layout日志字段

    最近在使用log4net的时候有一个简单的需求,就是自定义个格式化输出符.这个输出符是专门用来帮我记录下业务ID.业务类型的.比如,“businessID:328593,businessType: o ...

  8. log4net自定义字段写入SqlServer数据库 ASP.net

    首先申明,本示例经过本作者亲自试验通过,可以运行 第一步 编写log4net配置文件 此处为Log.xml,该文件放在与Web.config平级的位置 <?xml version="1 ...

  9. log4net自定义扩展及配置说明

    log4net文件保存配置我就不说太多了,网上一大把的,数据库配置其实网上也有,只是我第一次按照网上的配置没有跑通,我就说下数据库配置需要注意的地方吧. 下面是一个log4net的数据库代码配置 pu ...

随机推荐

  1. 一个简单的AboutMe页面

    Web2.0程序设计的小练习. Firefox下的效果 Chrome下的效果,套上了Helvetica,不知道为什么FF没有 (其实好像应该再优先加个Helvetica Neue的……呃……) 代码和 ...

  2. [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治

    https://loj.ac/problem/6039 我们设dp[i][j]表示考虑所有价值小于等于i的物品,带了j块钱的最大吸引力. 对于ci相同的物品,我们一定是从大到小选k个物品,又发现最大的 ...

  3. linux tar gzip 命令用法

    语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用. 主选项: -c: 建立压缩档案-x:解压-t:查看内容-r: ...

  4. linq to sql: 在Entityfamework Core中使用多个DbContext

    最近在学习DotNetCore并做一个自己的小项目,分为了多个数据库,AccountDbContext和BlogDbContext, 发blog的时候需要用到Account的信息,但是再Blog中只记 ...

  5. jQuery 最简化实现

    window.jQuery = (selector) => { let nodes = {}; if (typeof selector === 'string') { //是字符串 let te ...

  6. Java8所有的包介绍(由英文文档翻译而来)

    转载: Java8所有的包介绍(由英文文档翻译而来)

  7. Java线程池使用和常用参数(待续)

    线程池怎么实现的,核心参数讲一讲? Executors是线程池的工厂类,通过调用它的静态方法如下: Executors.newCachedThreadPool(); Executors.newFixe ...

  8. Python之路【第三篇】:文件操作

    一.文件操作步骤 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 歌名:<大火> 演唱:李佳薇 作词:姚若龙 作曲:马奕强 歌词: 有座巨大的停了的时钟 倾倒在赶 ...

  9. GeneXus项目启动

    使用GeneXus产品开发项目时,在开始,有一些属性我会经常改一下.我现在使用的GeneXus版本是GeneXus U3,由于在做手机应用的开发,所以一般使用最新的版本,老外那边差不多两个月会有一个u ...

  10. Spring 常用的注解

    目录 Spring 常用的注解 前言 SpringMVC配置 web配置 @ComponentScan @PropertySource @PropertySources @Value @Control ...