基于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(微服务监控)...
背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...
- 基于Jquery插件Uploadify实现实时显示进度条上传图片
网址:http://www.jb51.net/article/83811.htm 这篇文章主要介绍了基于Jquery插件Uploadify实现实时显示进度条上传图片的相关资料,感兴趣的小伙伴们可以参考 ...
- chosen jquery ajax搜索,基于chosen插件实现人员选择树搜索自动筛选功能
要实现的功能截图: 要求: 1.点击输入框可以根据拼音自动筛选数据,并且标记已经选择的数据,没有结果的时候提示,相应的更新左边树状态 2.勾选树右侧树的复选框左侧出现相应的内容 我用到的插件 vue+ ...
- 基于 Tampermonkey 插件平台开发的淘宝直通车爬虫
crawler-userscript 一个基于 Tampermonkey 插件平台开发的爬虫.主要目的是最大限度模拟用户环境,避免被反爬虫系统识破. 本项目除了实现了一个爬虫框架以外,还是一个完整的淘 ...
- 基于vs插件的abp代码生成器
工作了这么多年,一直都在小公司摸爬滚打,对于小公司而言,开发人员少,代码风格五花八门.要想用更少的人,更快的速度,开发更规范的代码,那自然离不开代码生成器.之前用过动软的,也用过T4,后面又接触了力软 ...
- 动态调整web主题(3): 基于tailwindcss插件的主题色生成方案‘
动态调整web主题(3): 基于tailwindcss插件的主题色生成方案 动态调整web主题(3): 基于tailwindcss插件的主题色生成方案 前言 tailwind-css-variable ...
- 基于fiddler插件的代理扫描系统:越权漏洞检测
基于fiddler插件的代理扫描系统:越权漏洞检测 # 概述 ##越权检测原理 ###系统架构 #基本步骤 待优化与工具联动 工具联动: 其他漏洞检测 # 概述 随着现在企业安全水平的提高, 单独依赖 ...
- 2022去/水印小程序源码+基于WordPress插件
正文: 2022去/水印小程序源码+基于WordPress插件,本版本代码是全开源的,基于Wordpress的插件开发的. 上传到Wordpress,安装插件,启动之后,绑定自己的小程序id即可,wo ...
- 基于clang插件的一种iOS包大小瘦身方案
引子 \ 包瘦身,包瘦身,包瘦身,重要的事情说三遍. \ 最近公司一款iOS APP(本文只讨论使用Objective C开发的iOS安装包)一直在瘦身,我们团队的APP也愈发庞大了.而要解决这个问题 ...
最新文章
- C语言小知识:typedef\函数模板\
- xp系统的计算机管理中用户在哪里,XP系统设备管理器中一片空白怎么修复?
- XOR Specia-LIS-t 异或和 贪心
- GDCM:获取SubSequence数据的测试程序
- php 调用python 脚本
- c/c++入门教程 - 1.基础c/c++ - 1.0 Visual Studio 2019安装环境搭建
- Hive从一个表向另一个表插入数据的注意事项
- filezilla server 有时连不上可以重启arm试试 server安装为手动 每次要点下start
- vue差(插)值表达式
- Atitit 健康减肥与软件健康减肥的总结 attilax著 1. 几大最佳实践减肥行为	1 1.1. 控制饮食分量用小碗 小盘子 小餐具	1 1.2. 软件如何减肥,控制资源占有率,比如体积 打包
- MaskFlownet图
- python RTL自动生成_RTL建模
- access查询出生日期格式转换_Access时间格式处理
- web版ppt制作插件impress.js源码注释翻译
- Exploring Simple Siamese Representation Learning阅读笔记
- 记事本APP之Alpha报告
- [设计模式]创建模式-建造者(C++描述)
- 工业大数据的关键技术是什么
- 谷歌变坏了?Chrome 已成众矢之的:15 篇前端热文回看
- C++ std::accumulate
热门文章
- 数据恢复:解决ORA-600[kghstack_free2][kghstack_err+0068]一例
- Python+selenium自动化测试:报错:TypeError: 'WebElement' object is not iterable
- ASP.NET 2.0的异步页面刷新真给劲
- php对象的底层机制
- zabbix简介(第一章第一节)
- Hadoop Hive迁移至MaxCompute
- hihoCoder-1830 2018亚洲区预选赛北京赛站网络赛 C.Cheat 模拟
- 【重要预警】“永恒之蓝”漏洞又现新木马 组成僵尸网络挖矿虚拟货币
- Realm数据库拾遗
- Java 类加载机制详解