基本代码

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. leetcode[50] N-Queens

    题目:给定一个n,那么在n*n的棋盘里面放国际象棋的皇后,皇后之间互不在攻击范围.(皇后的攻击范围是她所在位置的哪一行,那一列,和她的正负1的对角线) The n-queens puzzle is t ...

  2. 【通过操作指针,与指针做函数參数&#39;实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】

    #include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int ...

  3. C# WinForm程序退出的方法(转)

    转自:http://www.cnblogs.com/yugen/archive/2010/08/10/1796864.html 1.this.Close();   只是关闭当前窗口,若不是主窗体的话, ...

  4. MVC之验证

    MVC之验证 有时候我觉得,很多人将一个具体的技术细节写的那么复杂,我觉得没有必要,搞得很多人一头雾水的,你能教会别人用就成了,具体的细节可以去查MSDN什么的,套用爱因斯坦的名言:能在网上查到的就不 ...

  5. 增强型for语句与java,c#的不同之处,with语句的使用

    <script type="text/javascript" language="javascript"> //遍历数组 var arr = [&q ...

  6. SQLServer数据库误删数据找回

    记一次SQLServer数据库误删数据找回 昨天 同事在本机清理数据库表时,连接到了生产机,误删了二十几张表,幸好是晚上加班的时候删除的,生产机上当时是一天一备份,还原备份是最后的策略,最关键的还是要 ...

  7. Scientific Toolworks Understand for linux安装方法

    1.首先从官网http://www.scitools.com/download/index.php下载Linux版本 2.解压到安装目录下: 32位:gzip -cd Understand-3.1.6 ...

  8. 交叉编译和使用HTOP

    1.什么是htop htop来源于top,top是Unix/linux下功能强大的性能检测工具之一,用于实时检测并统计进程的属性和状态,基于ncurses库,可上显示文字界面.但是top已经非常陈旧, ...

  9. CLR 的执行模型(2)

    第一章 CLR 的执行模型(2) 本篇内容大纲 Framework 类库(Framework Class Library , FCL) 通用类型系统(Common Type System,CTS) 公 ...

  10. 类图class的依赖关系

    类图class的依赖关系 相关文章          [UML]UML系列——用例图Use Case       [UML]UML系列——用例图中的各种关系(include.extend)       ...