基本代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net.Util;
using System.IO;
using System.Net; using Log4netUTS.Model; namespace log4netUTS
{
/// <summary>
/// <code>
/// <appender name="HttpAppender" type="log4netUTS.HttpAppender,log4netUTS">
/// <param name="Host" value="http://localhost:30532/WEBFORM1.ASPX"/>
/// <param name="ServerTag" value="192.168.0.1"/>
/// <param name="AppName" value="test"/>
/// <param name="Timer" value="60000"/>
/// <param name="MaxRecords" value="1000"/>
/// </appender>
/// </code>
/// </summary>
public class HttpAppender : log4net.Appender.AppenderSkeleton
{
public HttpAppender()
{
Timer = 5000;
MaxRecords = 300;
} private System.Threading.Timer mTimer; private void CreateTime()
{
lock (this)
{
if (mTimer == null)
mTimer = new System.Threading.Timer(Upload, null, Timer, Timer);
}
} private readonly static Type declaringType = typeof(HttpAppender); private Queue<LogEvent> mEvents = new Queue<LogEvent>(1000); private void Add(LogEvent item)
{
CreateTime();
lock (mEvents)
{
mEvents.Enqueue(item);
if (mEvents.Count > MaxRecords)
Upload(null);
}
} private void Upload(object state)
{
List<LogEvent> items = new List<LogEvent>();
lock (mEvents)
{
while (mEvents.Count > 0)
{
items.Add(mEvents.Dequeue());
}
}
if (items.Count > 0)
{
OnUpload(items);
}
} private void OnUpload(object state)
{
try
{
List<LogEvent> items = (List<LogEvent>)state;
string param =string.Format("UserName={0}&UserPwd={1}&LogData={2}",UserName,UserPWD, Newtonsoft.Json.JsonConvert.SerializeObject(items));
byte[] data = Encoding.UTF8.GetBytes(param);
HttpWebRequest req =
(HttpWebRequest)HttpWebRequest.Create(Host);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = data.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
}
using (WebResponse wr = req.GetResponse())
{ }
}
catch (Exception e_)
{
LogLog.Error(declaringType, e_.Message);
}
} public string Host
{
get;
set;
} public string ServerTag
{
get;
set;
} public string AppName
{
get;
set;
} public int MaxRecords
{
get;
set;
} public int Timer
{
get;
set;
} public string UserName
{
get;
set;
}
public string UserPWD
{
get;
set;
} protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
try
{
LogEvent le = new LogEvent();
le.ErrorTime =loggingEvent.TimeStamp.ToString("yyyy-MM-dd HH:mm:ss");
le.EventType = loggingEvent.Level.ToString();
le.Message = loggingEvent.RenderedMessage;
le.AppName = AppName;
le.ServerTag = ServerTag;
le.ErrorType = loggingEvent.ExceptionObject != null ? loggingEvent.ExceptionObject.GetType().ToString() : "未知错误类型";
AddError(le, loggingEvent.ExceptionObject);
Add(le); }
catch (Exception e_)
{
LogLog.Error(declaringType, e_.Message);
}
} private void AddError(LogEvent e, Exception err)
{
if (err != null)
{
e.Errors.Add(new EventMessage { Message = err.Message, StackTrace = err.StackTrace });
err = err.InnerException;
while (err != null)
{
e.Errors.Add(new EventMessage { Message = err.Message, StackTrace = err.StackTrace });
err = err.InnerException;
}
} }
}
}

使用配置:

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net>
<!-- Define some output appenders -->
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="Log/" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
<param name="Header" value="
----------------------header--------------------------
" />
<param name="Footer" value="
----------------------footer--------------------------
" />
</layout>
</appender>
<appender name="HttpAppender" type="log4netUTS.HttpAppender,log4netUTS">
<param name="Host" value="http://tLog.cn100.com/HttpLogReceive.aspx"/>
<param name="ServerTag" value="192.168.0.1"/>
<param name="AppName" value="test"/>
<param name="Timer" value="5000"/>
<param name="MaxRecords" value="1000"/>
<param name="UserName" value="Admin"/>
<param name="UserPWD" value="8D70D8AB2768F232EBE874175065EAD3"/>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="SysAppender" />
<appender-ref ref="HttpAppender"/>
</root>
</log4net>

里面可能有些model的引用,根据自己的项目情况,写个就行了!

而且使用了第三方的序列组件 Newtonsoft.Json.Net35

基于Log4net插件的更多相关文章

  1. 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)

    背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...

  2. struts2基于Convention插件的约定映射使用

    一.首先说明一点:所谓的基于Convention插件的约定优于配置的使用,并不是严格意义上的零配置,struts.xml文件并不能完全舍弃. 获得Convention插件功能,所必需的jar包有:|a ...

  3. 基于maven插件的缓存控制插件

    asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控 ...

  4. [开源]基于Log4Net简单实现KafkaAppender

    背景 基于之前基于Log4Net本地日志服务简单实现 实现本地日志服务,但是随着项目开发演进,本地日志服务满足不了需求,譬如在预发布环境或者生产环境,不可能让开发人员登录查看本地日志文件分析. Kaf ...

  5. 基于Log4Net本地日志服务简单实现

    背景 项目开发中,我们或多或少会使用诸如NLog,Log4Net,Kafka+ELK等等日志套件: 基于关注点分离原则,业务开发的时候不应该关注日志具体实现:并且后续能方便切换其他日志套件: 这里先实 ...

  6. 基于tomcat插件的maven多模块工程热部署(附插件源码)

    内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? ...

  7. 基于etcd插件的CoreDNS动态域名添加

    前提条件:已经有一个可用的etcd环境. 一.CoreDNS简介 CoreDNS是一个DNS服务器,和Caddy Server具有相同的模型:它链接插件.CoreDNS是云本土计算基金会启动阶段项目. ...

  8. windows下编译基于nginx插件的rtmp流媒体服务nginx-rtmp

    1 概述 rtmp流媒体服务器,开源方案有多种,包括srs,red5,crtmpserver,fms,nginx插件等.本文描述了基于nginx插件的方式来实现rtmp流媒体服务器nginx-rtmp ...

  9. 基于Lua插件化的Pcap流量监听代理

    1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...

随机推荐

  1. hadoop搭建开发环境及编写Hello World

    hadoop搭建开发环境及编写Hello World   本文地址:http://www.cnblogs.com/archimedes/p/hadoop-helloworld.html,转载请注明源地 ...

  2. WCF中队列服务详解

    WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...

  3. C++中怎样获取类成员的指针

     我们都知道C++ class中有三种成员函数,static(静态的),nonstatic(非静态的),virtual(虚拟的)各种成员函数的指针各有差别,下面是一个完整的样例:(注意红颜色的差别 ...

  4. 探索Android该Parcel机制上

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制.译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...

  5. NHibernate 数据查询之QueryOver<T>

    NHibernate 数据查询之QueryOver<T>   一.限制运算符 Where:筛选序列中的项目WhereNot:反筛选序列中的项目 二.投影运算符 Select:创建部分序列的 ...

  6. 藏地传奇js

    http://zd.163.com/m/zhenyan/ js很厉害,有很多值得学习的地方,记录下来. http://res.nie.netease.com/zdcq/qt/13/0625_zheny ...

  7. oracle 表导入到powerDesigner 中

    最近不忙,之前一直是用powerDesigner看表结构,还没自己导入过,今天试试 oracle 表导入到powerDesigner 中步骤: 1.File--->reverse Enginne ...

  8. MySql 集群配置

    MYSQL CLUSTER方案介绍 本文的大致框架来自罗志威.黄川的报告, 在它的基础上进行简化和修改一些bug并且添加了主从复制的章节,最后做出该文档 MySQL Cluster 是MySQL适合于 ...

  9. SQL 内存数据库的细节

    解读SQL 内存数据库的细节 相信大家对内存数据库的 概念并不陌生,之前园子里也有多位大牛介绍过SQL内存数据库的创建方法,我曾仔细 拜读过,有了大致了解,不过仍有很多细节不清晰,比如: (1)内存数 ...

  10. HBase的索引

    LSM树由来.设计思想以及应用到HBase的索引   讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎  是哈希表的持久化实现,支持增.删.改以及随机读取操作,但 ...