c#自定义日志记录
前言:自定义写入日志,需要注意多线程下文件读取写入时异常问题处理:下面列举了2种优化方案:
废话不多说,直接上代码:
很简单:将类复制到项目中,最后在配置文件上配置一下:logUrl即可。 默认保存在:项目/temp/log
自定义日志类1:
- /// <summary>
- /// 日志类
- /// </summary>
- /// <remarks>Creator: v-lxh CreateTime: 2016/7/26 11:18:09</remarks>
- /// <Description></Description>
- public class Log
- {
- /// <summary>
- /// 写入日志.
- /// </summary>
- /// <param name="strList">The STR list.</param>
- /// <remarks>Creator: v-lxh CreateTime: 2016/7/26 11:18:09</remarks>
- /// <Description></Description>
- public static void WriteLog(params object[] strList)
- {
- //判断是否开启日志模式
- //if (!LogModel) return;
- if (strList.Count() == ) return;
- //日志文件路径
- string strDicPath = "";
- try
- {
- strDicPath = HttpContext.Current.Server.MapPath("~/temp/log/");
- if (strDicPath == null || strDicPath == "")
- {
- strDicPath = System.Configuration.ConfigurationManager.AppSettings["logUrl"] + "/temp/log/";
- }
- }
- catch (Exception e)
- {
- strDicPath = System.Configuration.ConfigurationManager.AppSettings["logUrl"] + "/temp/log/";
- }
- string strPath = strDicPath + string.Format("{0:yyyy年-MM月-dd日}", DateTime.Now) + "日志记录.txt";
- if (!Directory.Exists(strDicPath))
- {
- Directory.CreateDirectory(strDicPath);
- }
- if (!File.Exists(strPath))
- {
- using (FileStream fs = File.Create(strPath)) { }
- }
- string str = File.ReadAllText(strPath);
- StringBuilder sb = new StringBuilder();
- foreach (var item in strList)
- {
- sb.Append("\r\n" + DateTime.Now.ToString() + "-----" + item + "");
- }
- File.WriteAllText(strPath, sb.ToString() + "\r\n-----z-----\r\n" + str);
- }
- }
初稿1--优化1-使用Lock锁定资源:
- /// <summary>
- /// 日志类
- /// </summary>
- /// <remarks>Creator: lixh CreateTime: 2017/3/23 11:18:09</remarks>
- /// <Description></Description>
- public class Log
- {
- //日期文件夹路径
- public static string strDicPath = "";
- //静态方法todo:在处理话类型之前自动调用,去检查日志文件夹是否存在
- static Log()
- {
- //todo:通过当前http请求上下文获取的服务器相对路径下的物理路径--非静态资源--占用资源
- //string strDicPath = System.Web.HttpContext.Current.Server.MapPath("~/temp/log/");
- //静态类型--获取应用所在的物理路径--节省资源
- //strDicPath = System.Web.HttpRuntime.AppDomainAppPath + "\\temp\\logs\\";
//winform等非web程序可使用以下方法:
strDicPath = System.Threading.Thread.GetDomain().BaseDirectory.Replace("\\bin\\Debug", "") + "\\temp\\logs\\";- //创建文件夹
- if (!Directory.Exists(strDicPath))
- {
- Directory.CreateDirectory(strDicPath);
- }
- }
- /// <summary>
- /// 写入日志.
- /// </summary>
- /// <param name="strList">The STR list.</param>
- /// <remarks> </remarks>
- /// <Description></Description>
- public static void WriteLog(params object[] strList)
- {
- if (strList.Count() == ) return;
- string strPath = ""; //文件路径
- try
- {
- strPath = strDicPath + string.Format("{0:yyyy年-MM月-dd日}", DateTime.Now) + "日志记录.txt";
- }
- catch (Exception e)
- {
- strDicPath = "C:\\temp\\log\\";
- strPath = strDicPath + string.Format("{0:yyyy年-MM月-dd日}", DateTime.Now) + "日志记录.txt";
- }
- //todo:自动创建文件(但不能创建文件夹),并设置文件内容追加模式,使用using会自动释放FileSteam资源
- using (FileStream stream = new FileStream(strPath, FileMode.Append))
- {
- lock (stream) //锁定资源,一次只允许一个线程写入
- {
- StreamWriter write = new StreamWriter(stream);
- string content = "";
- foreach (var str in strList)
- {
- content += "\r\n" + DateTime.Now.ToString() + "-----" + str;
- }
- content += "\r\n-----z-----\r\n";
- write.WriteLine(content);
- //关闭并销毁流写入文件
- write.Close();
- write.Dispose();
- }
- }
- }
- /// <summary>
- /// 写入日志.
- /// </summary>
- /// <param name="strList">The STR list.</param>
- /// <remarks></remarks>
- /// <Description></Description>
- public static void WriteLog(Action DefFunc, Func<string> ErrorFunc = null)
- {
- try
- {
- DefFunc();
- }
- catch (Exception ex)
- {
- string strPath = strDicPath + string.Format("{0:yyyy年-MM月-dd日}", DateTime.Now) + "日志记录.txt";
- //todo:自动创建文件(但不能创建文件夹),并设置文件内容追加模式,使用using会自动释放FileSteam资源
- using (FileStream stream = new FileStream(strPath, FileMode.Append))
- {
- lock (stream) //锁定资源,一次只允许一个线程写入
- {
- StreamWriter write = new StreamWriter(stream);
- string content = "\r\n" + DateTime.Now.ToString() + "-----" + ex.Message;
- content += "\r\n" + DateTime.Now.ToString() + "-----" + ex.StackTrace;
- content += "\r\n-----z-----\r\n";
- write.WriteLine(content);
- //关闭并销毁流写入文件
- write.Close();
- write.Dispose();
- }
- }
- }
- }
- }
//初稿2-优化-使用微软提供的读写锁:
- //读写锁,当资源处于写入模式时,其他线程写入需要等待本次写入结束之后才能继续写入
- private static ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim();
- /// <summary>
- /// 写入日志.
- /// </summary>
- /// <param name="strList">The STR list.</param>
- /// <remarks> </remarks>
- /// <Description></Description>
- public static void WriteLog(params object[] strList)
- {
- if (strList.Count() == ) return;
- string strPath = ""; //文件路径
- try
- {
- strPath = strDicPath + string.Format("{0:yyyy年-MM月-dd日}", DateTime.Now) + "日志记录.txt";
- }
- catch (Exception e)
- {
- strDicPath = "C:\\temp\\log\\";
- strPath = strDicPath + string.Format("{0:yyyy年-MM月-dd日}", DateTime.Now) + "日志记录.txt";
- }
- try
- {
- //todo:自动创建文件(但不能创建文件夹),并设置文件内容追加模式,使用using会自动释放FileSteam资源
- LogWriteLock.EnterWriteLock();
- using (FileStream stream = new FileStream(strPath, FileMode.Append))
- {
- StreamWriter write = new StreamWriter(stream);
- string content = "";
- foreach (var str in strList)
- {
- content += "\r\n" + DateTime.Now.ToString() + "-----" + str;
- }
- content += "\r\n-----z-----\r\n";
- write.WriteLine(content);
- //关闭并销毁流写入文件
- write.Close();
- write.Dispose();
- }
- }
- catch (Exception)
- {
- }
- finally {
- LogWriteLock.ExitWriteLock();
- }
- }
c#自定义日志记录的更多相关文章
- Windows server2012 IIs 8 自定义日志记录
问题: 通过CDN加速的网站,记录日志时无法追踪源IP,日志的IP都为CDN节点ip. 分析: 1.在解析记录header时,CDN实际会把源IP以其它header的形式回传,如网宿为[Cdn-Src ...
- shell脚本中自定义日志记录到文件
自定义日志函数和前期变量 # adirname - return absolute dirname of given file adirname() { odir=`pwd`; cd `dirname ...
- 基于.NetCore3.1系列 —— 日志记录之自定义日志组件
一.前言 回顾:日志记录之日志核心要素揭秘 在上一篇中,我们通过学习了解在.net core 中内置的日志记录中的几大核心要素,在日志工厂记录器(ILoggerFactory)中实现将日志记录提供器( ...
- IIS 7完全攻略之日志记录配置(摘自网络)
IIS 7完全攻略之日志记录配置 作者:泉之源 [IT168 专稿]除了 Windows 提供的日志记录功能外,IIS 7.0 还可以提供其他日志记录功能.例如,可以选择日志文件格式并指定要记录的请求 ...
- ASP.NET MVC自定义Module记录管道事件执行顺序
1. 在Visual Studio 新建项目,模板为空,下面结构选择MVC. 2. 在项目中新建一个类MyModule,实现IHttpModule接口 namespace SimpleApp.Infr ...
- 如何自行给指定的SAP OData服务添加自定义日志记录功能
有的时候,SAP标准的OData实现或者相关的工具没有提供我们想记录的日志功能,此时可以利用SAP系统强大的扩展特性,进行自定义日志功能的二次开发. 以SAP CRM Fiori应用"My ...
- 基于.NetCore3.1系列 —— 日志记录之初识Serilog
一.前言 对内置日志系统的整体实现进行了介绍之后,可以通过使用内置记录器来实现日志的输出路径.而在实际项目开发中,使用第三方日志框架(如: Log4Net.NLog.Loggr.Serilog.Sen ...
- 如何定制.NET6.0的日志记录
在本章中,也就是整个系列的第一部分将介绍如何定制日志记录.默认日志记录仅写入控制台或调试窗口,这在大多数情况下都很好,但有时需要写入到文件或数据库,或者,您可能希望扩展日志记录的其他信息.在这些情况下 ...
- ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面
应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但 ...
随机推荐
- CYQ.Data V5 数据库读写分离功能介绍
前言 好多年没写关于此框架的新功能的介绍了,这些年一直在默默地更新,从Nuget上的记录就可以看出来: 这几天在看Java的一些东西,除了觉的Java和.NET的相似度实在太高之外,就是Java太原始 ...
- 初探ReactJS.NET 开发
ReactJS通常也被称为"React",是一个刚刚在这场游戏中登场的新手.它由Facebook创建,并在2013年首次发布.Facebook认为React在处理SPA问题上可以成 ...
- 一步步学习javascript基础篇(2):作用域和作用域链
作用域和作用域链 js的语法用法非常的灵活,且稍不注意就踩坑.这集来分析下作用域和作用域链.我们且从几道题目入手,您可以试着在心里猜想着答案. 问题一. if (true) { var str = & ...
- AngularJS 中的Promise --- $q服务详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- Redhat环境下编译安装Google Bazel
Redhat环境下编译安装bazel 作者:Jack47 目前Google Bazel没有提供各个操作系统下的二进制安装包,只提供源代码,需要我们自己编译安装,详情可以见我翻译的中文版Google B ...
- 三周,用长轮询实现Chat并迁移到Azure测试
公司的OA从零开始进行开发,继简单的单点登陆.角色与权限.消息中间件之后,轮到在线即时通信的模块需要我独立去完成.这三周除了逛网店见爱*看动漫接兼职,基本上都花在这上面了.简单地说就是用MVC4基于长 ...
- ASP.NET MVC Routing学习笔记(一)
Routing在ASP.NET MVC中是非常核心的技术,属于ASP.NET MVC几大核心技术之一,在使用Routing之前,得先引入System.Web.Routing,但其实不用这么麻烦,因为在 ...
- Java基础-输入输出-2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt
2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt ...
- Jetty Maven Plugin配置
官方文档:http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#maven-config-https 1 ...
- 谈谈php里的DAO Model AR
这次要谈的3个关键字:DAO.Model.AR,是我们在做web应用时常见的几个概念,也被称作设计模式(design pattern),先简单看看它们的全拼和中文: DAO:Data Access O ...