C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)
由于iis的自动回收机制,不适用于ASP.NET程序
代码:
using System;
using System.Collections.Concurrent;
using System.Configuration;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace CommonDll
{
/// <summary>
/// 写日志类
/// </summary>
public class LogUtil
{
#region 字段
public static string path = ConfigurationManager.AppSettings["LogPath"];
public static int fileSize = * * ; //日志分隔文件大小
private static ConcurrentQueue<Tuple<string, DateTime>> queue = new ConcurrentQueue<Tuple<string, DateTime>>();
#endregion #region 构造函数
static LogUtil()
{
Task.Factory.StartNew(new Action(delegate()
{
StringBuilder log;
string path;
Tuple<string, DateTime> tuple;
string item; while (true)
{
log = new StringBuilder();
path = CreateLogPath(); while (queue.TryDequeue(out tuple))
{
item = string.Format(@"{0} {1}", tuple.Item2.ToString("yyyy-MM-dd HH:mm:ss.fff"), tuple.Item1);
log.AppendFormat("\r\n{0}", item);
} if (log.Length > ) WriteFile(log.ToString(, log.Length - ), path);
Thread.Sleep();
}
}));
}
#endregion #region 写文件
/// <summary>
/// 写文件
/// </summary>
public static void WriteFile(string log, string path)
{
try
{
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
} if (!File.Exists(path))
{
using (FileStream fs = new FileStream(path, FileMode.Create)) { fs.Close(); }
} using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(log);
sw.Flush();
}
fs.Close();
}
}
catch { }
}
#endregion #region 生成日志文件路径
/// <summary>
/// 生成日志文件路径
/// </summary>
public static string CreateLogPath()
{
int index = ;
string logPath;
bool bl = true;
do
{
index++;
logPath = Path.Combine(path, "Log" + DateTime.Now.ToString("yyyyMMdd") + (index == ? "" : "_" + index.ToString()) + ".txt");
if (File.Exists(logPath))
{
FileInfo fileInfo = new FileInfo(logPath);
if (fileInfo.Length < fileSize)
{
bl = false;
}
}
else
{
bl = false;
}
} while (bl); return logPath;
}
#endregion #region 写错误日志
/// <summary>
/// 写错误日志
/// </summary>
public static void LogError(string log)
{
queue.Enqueue(new Tuple<string, DateTime>("[Error] " + log, DateTime.Now));
}
#endregion #region 写操作日志
/// <summary>
/// 写操作日志
/// </summary>
public static void Log(string log)
{
queue.Enqueue(new Tuple<string, DateTime>("[Info] " + log, DateTime.Now));
}
#endregion }
}
测试代码:
private void button1_Click(object sender, EventArgs e)
{
int n = ;
DateTime dtStart = DateTime.Now;
for (int i = ; i <= n; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object obj)
{
int j = (int)obj;
LogUtil.Log("测试" + j.ToString("")); if (j == n)
{
double sec = DateTime.Now.Subtract(dtStart).TotalSeconds;
MessageBox.Show(n + "条日志完成,耗时" + sec.ToString("0.000") + "秒");
}
}), i);
}
}
效果图:

C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)的更多相关文章
- C#写文本日志帮助类(支持多线程)
代码: using System; using System.Configuration; using System.IO; using System.Threading.Tasks; namespa ...
- Android开发调试日志工具类[支持保存到SD卡]
直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...
- glog另启动线程写文本日志
glog本身是很高效的,google的大牛肯定知道大规模的写日志用glog的话肯定会影响业务线程的处理,带负荷的磁盘IO谁都桑不起.比方levelDB就是默认异步写,更不用说google的三驾马车都是 ...
- Asp.Net写文本日志
底层代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...
- C#写日志工具类
代码: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System ...
- 支持异步写入的日志类,支持Framework2.0
因为工作需要需要在XP上运行一个C#编写的Winform插件,我就用Framework2.0,因为存在接口交互所以想保留交易过程的入参出参. 考虑到插件本身实施的因素,就没有使用Log4.NLog等成 ...
- 如何将Unicode文本写到日志文件中
有时为了定位问题,我们需要结合打印日志来处理.特别是较难复现的,一般都需要查看上下文日志才能找出可能存在的问题.考虑到程序要在不同语言的操作系统上运行,程序界面显示要支持Unicode,打印出来的日志 ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播。
Linux是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播. Linux是众多操作系统之一 , 目前流行的服务器和 PC 端操作系统有 L ...
随机推荐
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 任务调度系统界面 http: ...
- C#创建dll类库
类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...
- 不懂CSS的后端难道就不是好程序猿?
由于H5在移动端的发展如日中天,现在大部分公司对高级前端需求也是到处挖墙角,前端薪资也随之水涨船高,那公司没有配备专用的前端怎么办呢? 作为老板眼中的“程序猿” 前端都不会是非常无能的表现,那作为后端 ...
- 微信小程序IDE(微信web开发者工具)安装、破解手册
1.IDE下载 微信web开发者工具,本人是用的windows 10 x64系统,用到以下两个版本的IDE安装工具与一个破解工具包: wechat_web_devtools_0.7.0_x64.exe ...
- Nexus(一)环境搭建
昨天,成功搭建了自己的 Maven 环境(详见:Maven(一)环境搭建),今天就来研究和探讨下 Nexus 的搭建! 使用背景: 安装环境:Windows 10 -64位 JDK版本:1.7 Mav ...
- 基于开源项目SharpMap的热力图(HeatLayer)实现。
当前公司需要一个用时较少的热力图呈现方案,在避免较底层的GDI开发和比较了多家GIS产品的实际效果之后,团队决定用sharpMap的API来实现,由于之前框架采用的是另外一个开源项目GMap.net, ...
- android SystemServer.java启动的服务。
EntropyService:熵(shang)服务,用于产生随机数PowerManagerService:电源管理服务ActivityManagerService:最核心服务之一,Activity管理 ...
- SQL SERVER导入数据到ORACLE的方法总结
我们偶尔会有将数据从SQL SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢? 下面比较肤浅的总结了一些可行的方法. 1:生成SQL脚本然后去OR ...
- Linux学习日记-MVC的部署(三)
一.Mvc与wcf 相对WCF的部署MVC还是有点麻烦,我们要考虑哪些dll是不需要的,哪些是要拷贝到本地的. 而WCF因为有些配置文件不支持,我们只需要在配置wcf时不使用配置文件而直接使用代码就行 ...
- 一步步搭建自己的博客 .NET版(2、评论功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...