100行代码实现了多线程,批量写入,文件分块的日志方法
2016-11-07 14:22
661 查看
一,您选择用什么样的日志组件
日志组件,不得不提大名鼎鼎的Log4Net。比较常用的还有 Enterprise Library Logging,ServiceStack Logging。当然您还可以补充,我就只用过这几款。
上边提到的3款日志组件,都要在.config里加代码,特别是Log4Net,还要把SQL写在配置里。我就是仅仅只写个日志,还要配置这么多信息,让人略有不爽。
所以在很长一段时间里,我用下边这个方法写日志:
View Code
日志组件,不得不提大名鼎鼎的Log4Net。比较常用的还有 Enterprise Library Logging,ServiceStack Logging。当然您还可以补充,我就只用过这几款。
上边提到的3款日志组件,都要在.config里加代码,特别是Log4Net,还要把SQL写在配置里。我就是仅仅只写个日志,还要配置这么多信息,让人略有不爽。
所以在很长一段时间里,我用下边这个方法写日志:
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace LogTest { public class IOExtention { static ConcurrentQueue<Tuple<string, string>> logQueue = new ConcurrentQueue<Tuple<string, string>>(); static Task writeTask = default(Task); static ManualResetEvent pause = new ManualResetEvent(false); //Mutex mmm = new Mutex(); static IOExtention() { writeTask = new Task((object obj) => { while (true) { pause.WaitOne(); pause.Reset(); List<string[]> temp = new List<string[]>(); foreach (var logItem in logQueue) { string logPath = logItem.Item1; string logMergeContent = String.Concat(logItem.Item2, Environment.NewLine, "-----------------------------------------------------------", Environment.NewLine); string[] logArr = temp.FirstOrDefault(d => d[0].Equals(logPath)); if (logArr != null) { logArr[1] = string.Concat(logArr[1], logMergeContent); } else { logArr = new string[] { logPath, logMergeContent }; temp.Add(logArr); } Tuple<string, string> val = default(Tuple<string, string>); logQueue.TryDequeue(out val); } foreach (string[] item in temp) { WriteText(item[0], item[1]); } } } , null , TaskCreationOptions.LongRunning); writeTask.Start(); } public static void WriteLog(String preFile, String infoData) { WriteLog(string.Empty, preFile, infoData); } public static void WriteLog(String customDirectory, String preFile, String infoData) { string logPath = GetLogPath(customDirectory, preFile); string logContent = String.Concat(DateTime.Now, " ", infoData); logQueue.Enqueue(new Tuple<string, string>(logPath, logContent)); pause.Set(); } private static string GetLogPath(String customDirectory, String preFile) { string newFilePath = string.Empty; String logDir = string.IsNullOrEmpty(customDirectory) ? Path.Combine(Environment.CurrentDirectory, "logs") : customDirectory; if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } string extension = ".log"; string fileNameNotExt = String.Concat(preFile, DateTime.Now.ToString("yyyyMMdd")); String fileName = String.Concat(fileNameNotExt, extension); string fileNamePattern = string.Concat(fileNameNotExt, "(*)", extension); List<string> filePaths = Directory.GetFiles(logDir, fileNamePattern, SearchOption.TopDirectoryOnly).ToList(); if (filePaths.Count > 0) { int fileMaxLen = filePaths.Max(d => d.Length); string lastFilePath = filePaths.Where(d => d.Length == fileMaxLen).OrderByDescending(d => d).FirstOrDefault(); if (new FileInfo(lastFilePath).Length > 1 * 1024 * 1024 * 1024) { string no = new Regex(@"(?is)(?<=\()(.*)(?=\))").Match(Path.GetFileName(lastFilePath)).Value; int tempno = 0; bool parse = int.TryParse(no, out tempno); string formatno = String.Format("({0})", parse ? (tempno + 1) : tempno); string newFileName = String.Concat(fileNameNotExt, formatno, extension); newFilePath = Path.Combine(logDir, newFileName); } else { newFilePath = lastFilePath; } } else { string newFileName = String.Concat(fileNameNotExt, String.Format("({0})", 0), extension); newFilePath = Path.Combine(logDir, newFileName); } return newFilePath; } private static void WriteText(string logPath, string logContent) { try { if (!File.Exists(logPath)) { File.CreateText(logPath).Close(); } StreamWriter sw = File.AppendText(logPath); sw.Write(logContent); sw.Close(); } catch (Exception ex) { } finally { } } } }
View Code
相关文章推荐
- 100多行代码实现6秒完成50万条多线程并发日志文件写入
- 实现python代码的动态删除多余的日志文件(非自带滚动日志方法)
- C#实现多线程写入同一个文件的方法
- PHP写入WRITE编码为UTF8的文件的实现代码
- php做下载文件的实现代码及文件名中乱码解决方法
- 把php代码保存到php文件实现方法
- C#批量重命名文件代码的实现
- 用python实现批量重命名文件的代码
- 把php代码保存到php文件实现方法
- 一种点对点文件断点续传的多线程实现方法
- php 多线程上下文中安全写文件实现代码
- 用ASP实现远程将文件批量改名的代码
- ASP实现网页打开任何类型文件都提示保存的方法附代码
- 用实现ASP批量删除目录及文件的代码
- 将 html 代码写入 js 文件中,然后在网页中引用此 js 文件,实现头模板重用
- php做下载文件的实现代码及文件名中乱码解决方法
- 日志文件满而造成SQL数据库无法写入文件时,可用两种方法
- PHP写入WRITE编码为UTF8的文件的实现代码
- C# 代码文件头部注释批量写入, 函数注释批量删除的工具
- 一种点对点文件断点续传的多线程实现方法