基本代码

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. Asp.Net MVC5入门学习系列⑤

    原文:Asp.Net MVC5入门学习系列⑤ 检查VS生产的编辑方法和编辑窗体 前面我们一步使用强类型,然后创建Controller(控制器)的时候,VS默认已经给我们把CURD都简单的实现了.这篇的 ...

  2. hdu4417 Super Mario 树阵离线/划分树

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 Super Mario Time Limit: 2000/1000 MS (Java/Others)    ...

  3. 快速构建Windows 8风格应用26-本地应用数据

    原文:快速构建Windows 8风格应用26-本地应用数据 本篇博文主要介绍如何获取应用的设置和文件容器.如何将数据写入设置.如何从设置中获取数据.如何删除设置中数据.如何将数据写入文件.如何从文件中 ...

  4. OCP-1Z0-051-题目解析-第13题

    13. View the Exhibit and examine the structure of the PRODUCTS table. You need to generate a report ...

  5. mysql的事物

    所谓的事物就是一组原子性的SQL语句,或者说是一个独立的工作单元. 1.事物拥有四大特征: ①原子性(atomicity):一个事物必须被分为一个不可分割的的最小单元,整个事物中的所有操作要么全部提交 ...

  6. ASP.NET MVC IOC 之Ninject攻略

    ASP.NET MVC IOC 之Ninject攻略 一.为什么要使用Ninject? 很多其它类型的IOC容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualifie ...

  7. 解决Github使用Fastly CDN而导致不能加载网页的方法

    Github现在基本属于“安全”网站,但 Github使用fastly.net的CDN服务后,其网站在国内经常不能正常加载网页.github.global.ssl.fastly.net的亚洲IP一般为 ...

  8. 历年noip复赛试题整合

    早晨打算把历年的试题都过一遍,整理一下大概会往哪个方向考,考什么,不说太多,开始吧 2013: Day1: T1 转圈游戏 : 快速幂(关键在于要会打 快速幂) 思路:因为每次都进m位,相当于每次x加 ...

  9. html页面显示服务器时间

    全局变量 var lblTimer; var d; ready事件里面写 lblTimer = $("#lbltimer"); d = new Date('<%=DateTi ...

  10. Mysql--选择适合的引擎,提高操作速度

    在MySQL 5.1中,MySQL AB引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的MySQL服务器中   一.数据引擎简介 在MySQL 5.1中,MySQL AB引入了新的插件 ...