基于Log4net插件
基本代码
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插件的更多相关文章
- 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)
背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...
- struts2基于Convention插件的约定映射使用
一.首先说明一点:所谓的基于Convention插件的约定优于配置的使用,并不是严格意义上的零配置,struts.xml文件并不能完全舍弃. 获得Convention插件功能,所必需的jar包有:|a ...
- 基于maven插件的缓存控制插件
asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控 ...
- [开源]基于Log4Net简单实现KafkaAppender
背景 基于之前基于Log4Net本地日志服务简单实现 实现本地日志服务,但是随着项目开发演进,本地日志服务满足不了需求,譬如在预发布环境或者生产环境,不可能让开发人员登录查看本地日志文件分析. Kaf ...
- 基于Log4Net本地日志服务简单实现
背景 项目开发中,我们或多或少会使用诸如NLog,Log4Net,Kafka+ELK等等日志套件: 基于关注点分离原则,业务开发的时候不应该关注日志具体实现:并且后续能方便切换其他日志套件: 这里先实 ...
- 基于tomcat插件的maven多模块工程热部署(附插件源码)
内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? ...
- 基于etcd插件的CoreDNS动态域名添加
前提条件:已经有一个可用的etcd环境. 一.CoreDNS简介 CoreDNS是一个DNS服务器,和Caddy Server具有相同的模型:它链接插件.CoreDNS是云本土计算基金会启动阶段项目. ...
- windows下编译基于nginx插件的rtmp流媒体服务nginx-rtmp
1 概述 rtmp流媒体服务器,开源方案有多种,包括srs,red5,crtmpserver,fms,nginx插件等.本文描述了基于nginx插件的方式来实现rtmp流媒体服务器nginx-rtmp ...
- 基于Lua插件化的Pcap流量监听代理
1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...
随机推荐
- java 中关于json的使用方法
json在数据传输起了很大的作用,下面说说java中json的使用方法. 文章参考:http://www.codes51.com/article/detail_99574.html json串示例 [ ...
- 接口自动化测试:参数化封装(excel文件读取)
log4j.properties文件配置 log4j.rootLogger = DEBUG,stdout,F log4j.appender.stdout = org.apache.log4j.Cons ...
- ios基金会-XCode温馨提示
(一个)代号规格pragma mark 1.定义 #pragma 开头的代码是一条编译器指令,是一个特定于程序或编译器的指令. 不一定适用于其他编译器或其他环境.假设编译器不能识别该指令.则会将其忽略 ...
- Objective-C系列
我的Objective-C系列文章和坚持写博客的感想 做iOS开发有一段时间了,也有自己上线的App产品,也在坚持着发表技术博客总结自己所学的东西.在写博客的时候虽然博文中不免有错别字,但每句话都 ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- 收集整理的非常有用的PHP函数
原文:收集整理的非常有用的PHP函数 项目中经常会需要一些让人头疼的函数,作为开发者应该整理一个自己的函数库,在需要之时复制过来即可.本文作者收集整理数十个PHP项目中常用的函数,保证能正常运行,你只 ...
- 藏地传奇js
http://zd.163.com/m/zhenyan/ js很厉害,有很多值得学习的地方,记录下来. http://res.nie.netease.com/zdcq/qt/13/0625_zheny ...
- open打开窗口并且获得打开窗口的窗口对象
//主窗体 <script language="javascript" type="text/javascript"> function opens ...
- 带你走近AngularJS 之创建自定义指令
带你走近AngularJS 之创建自定义指令 为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义 ...
- 为ASP.NET MVC应用程序读取相关数据
为ASP.NET MVC应用程序读取相关数据 2014-05-08 18:24 by Bce, 299 阅读, 0 评论, 收藏, 编辑 这是微软官方教程Getting Started with En ...