C# 写日志,高性能批量处理 -- Logger
2013-12-11 13:13
176 查看
当然了,可以使用:log4net 库;
但目前该功能需求不需要用到这么强大的日志管理;直接写文件记录;所以就写了一个简单的;
这是半成品,还可以用,还有地方可以优化;
但再优化前,可读性比较好,我就上传了:
测试调用:
但目前该功能需求不需要用到这么强大的日志管理;直接写文件记录;所以就写了一个简单的;
这是半成品,还可以用,还有地方可以优化;
但再优化前,可读性比较好,我就上传了:
using System; using System.Text; using System.IO; using DragerTestingProject.Configs; using System.Diagnostics; using System.Threading.Tasks; using System.Threading; namespace Logs { /// <summary> /// @author Jave.Lin /// @date 2013-12-11 /// </summary> public class Logger { private const string PATH = "Log"; private const string FILE_NAME = "Logs.txt"; private const string FULL_NAME = PATH + "/" + FILE_NAME; public static readonly object Locker = new object(); private static StreamWriter WRITER; private static string GUID; private static string ContinueWriteCaches; private static readonly Stopwatch Continue_WriteSw; private static int ContinueTime = 300; // 300毫秒以后,连续写操作,都统一到一块操作 private static int ContinueCountMax = 100; // 当连续写操作次数上限到指定的数值后,都写一次操作,之后的重新再计算 private static int ContinueCount = 0; public static int AllWriteCount = 0; static Logger() { Continue_WriteSw = new Stopwatch(); } private static string ProjectFullName { get { if (!string.IsNullOrEmpty(ProjectSetting.Default.ProjectName)) return FULL_NAME + ProjectSetting.Default.ProjectName; if (string.IsNullOrEmpty(GUID)) GUID = Guid.NewGuid().ToString(); return PATH + "/" + "TEMPLATE_" + GUID + "_" + FILE_NAME; } } private static void Write(string msg) { if (string.IsNullOrEmpty(msg)) return; lock (Locker) { if (Continue_WriteSw.IsRunning && Continue_WriteSw.ElapsedMilliseconds < ContinueTime) { if (ContinueWriteCaches == null) ContinueWriteCaches = msg; else ContinueWriteCaches += msg + "\r\n"; ContinueCount++; if (ContinueCount > ContinueCountMax) { _Write(); } return; } if (!Continue_WriteSw.IsRunning) Continue_WriteSw.Start(); ContinueWriteCaches = msg; new Task(() => { Thread.Sleep(ContinueTime); _Write(); }).Start(); } } private static void _Write() { if (ContinueWriteCaches != null) { if (!File.Exists(ProjectFullName)) { if (!Directory.Exists(PATH)) Directory.CreateDirectory(PATH); //File.Create(ProjectFullName); } WRITER = new StreamWriter(ProjectFullName, true, Encoding.UTF8); WRITER.WriteLine(ContinueWriteCaches); WRITER.Flush(); WRITER.Close(); } Continue_WriteSw.Stop(); Continue_WriteSw.Reset(); ContinueWriteCaches = null; ContinueCount = 0; Interlocked.Increment(ref AllWriteCount); } public static void Debug(string msg) { msg = string.Format("[{0} {1}] : {2}", "Debug", DateTime.Now.ToString(), msg); Write(msg); } public static void Info(string msg) { msg = string.Format("[{0} {1}] : {2}", "Info", DateTime.Now.ToString(), msg); Write(msg); } public static void Error(string msg) { msg = string.Format("[{0} {1}] : {2}", "Error", DateTime.Now.ToString(), msg); Write(msg); } } }
测试调用:
for (int i = 0; i < 300; i++) { Logger.Debug("testsadfasdfasdf" + i); } Logger.Debug("Write Count : " + Logger.AllWriteCount); // 总调用IO写的次数为:2次。。。但写的内容次数就超过300
相关文章推荐
- .NET C# 高性能日志类
- C# 超高速高性能写日志 代码开源
- C# 超高速高性能写日志 代码开源
- [转]C# 超高速高性能写日志 代码开源
- C#轻量级高性能日志组件EasyLogger(六)
- C#轻量级高性能日志组件EasyLogger(六)
- C# 超高速高性能写日志 代码开源
- C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)
- C# 使用NLog记录日志入门操作
- 高性能页面加载技术(流水线加载)BigPipe的C#简单实现(附源码)
- Linux日志logger命令详解
- c# 日志异常类
- C#(Csharp)+OpenCL+CLBLAS库,实现GPU高性能计算。
- C# 添加日志
- c#编写高性能Tcp Socket应用注意事项
- C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS
- system.out和logger两种日志输出方式的不同
- 通配置文件的方式控制java.util.logging.Logger日志输出
- C# 使用Log4Net记录日志(进阶篇)
- 分享一篇关于C#对文件操作的日志,方法很全