您的位置:首页 > 编程语言 > C#

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: