线程托管日志类

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;

namespace BLL
{

/// <summary>
/// 日志类
/// </summary>
/// <remarks>此日志类提供高性能的日志记录实现。
/// 当调用Write方法时不会造成线程阻塞,而是立即完成方法调用,因此调用线程不用等待日志写入文件之后才返回。</remarks>
public class Log : IDisposable
{
//日志对象的缓存队列
private static Queue<Msg> msgs;
//日志写入线程的控制标记
private static bool state;
//日志文件生命周期的时间标记
private static DateTime TimeSign;

/// <summary>
/// 创建日志对象的新实例,根据指定的日志文件路径和指定的日志文件创建类型
/// </summary>
/// <param name="p">日志文件保存路径</param>
/// <param name="t">日志文件创建方式的枚举</param>
public Log()
{
if (msgs == null)
{
state = true;
msgs = new Queue<Msg>();

Thread thread = new Thread(work);
thread.Start();
}
}

//日志文件写入线程执行的方法
private void work()
{
while (true)
{
//判断队列中是否存在待写入的日志
if (msgs.Count > 0)
{
Msg msg = null;
lock (msgs)
{
msg = msgs.Dequeue();
}
if (msg != null)
{
LogWrite(msg);
}
}
else
{
//判断是否已经发出终止日志并关闭的消息
if (state)
{
Thread.Sleep(1);
}
else
{
//无需关闭
}
}
}
}

//写入日志到表的方法
private void LogWrite(Msg msg)
{
try
{
//数据持久化
}
catch (Exception e)
{
Console.Out.Write(e);
}
}

/// <summary>
/// 写入新日志,根据指定的日志对象Msg
/// </summary>
/// <param name="msg">日志内容对象</param>
public void Write(Msg msg)
{
if (msg != null)
{
lock (msgs)
{
msgs.Enqueue(msg);
}
}
}

#region IDisposable 成员

/// <summary>
/// 销毁日志对象
/// </summary>
public void Dispose()
{
state = false;
}

#endregion
}
}

namespace BLL
{
/// <summary>
/// 表示一个日志记录的对象
/// </summary>
public class Msg
{
//日志记录的时间
private DateTime datetime;
//日志记录的类型
private MsgType type;
//用户ID
private string userId;
//模块ID
private int modular;
//项目ID
private int projectid;
//记录ID
private int modelid;
//原始模型
private object oldModel;
//新模型
private object newModel;
//自定义内容
//private string text = null;

//public string Text
//{
// get { return text; }
// set { text = value; }
//}
private string guid;

public string Guid
{
get { return guid; }
set { guid = value; }
}
private int batch;

public int Batch
{
get { return batch; }
set { batch = value; }
}

/// <summary>
/// 创建新的日志记录实例;
/// </summary>
/// <param name="t">日志记录的文本内容</param>
/// <param name="p">日志记录的消息类型</param>
/// <param name="userId">用户ID</param>
/// <param name="projectid">项目ID</param>
/// <param name="modelid">记录ID</param>
/// <param name="modular">模块ID</param>
/// <param name="table">表明称</param>
//public Msg(MsgType p, string userId, int projectid, int modelid, int modular, string text)
// : this(DateTime.Now, p, null, null, userId, projectid, modelid, modular, text)
//{
//}
/// <summary>
/// 创建新的日志记录实例;
/// </summary>
/// <param name="t">日志记录的文本内容</param>
/// <param name="p">日志记录的消息类型</param>
/// <param name="userId">用户ID</param>
/// <param name="projectid">项目ID</param>
/// <param name="modelid">记录ID</param>
/// <param name="modular">模块ID</param>
/// <param name="table">表明称</param>
public Msg(MsgType p, object oldModel, object newModel, string userId, string projectid, int modelid, int modular, string guid,int batch)
: this(DateTime.Now, p, oldModel, newModel, userId, Common.Toolbox.ConvertToInt32(projectid), modelid, modular, guid,batch)
{
}
/// <summary>
/// 创建新的日志记录实例;
/// </summary>
/// <param name="t">日志记录的文本内容</param>
/// <param name="p">日志记录的消息类型</param>
/// <param name="userId">用户ID</param>
/// <param name="projectid">项目ID</param>
/// <param name="modelid">记录ID</param>
/// <param name="modular">模块ID</param>
/// <param name="table">表明称</param>
public Msg(MsgType p, object oldModel, object newModel, string userId, string projectid, int modelid, int modular)
: this(DateTime.Now, p, oldModel, newModel, userId, Common.Toolbox.ConvertToInt32(projectid), modelid, modular, "",0)
{
}
/// <summary>
/// 创建新的日志记录实例;
/// </summary>
/// <param name="t">日志记录的文本内容</param>
/// <param name="p">日志记录的消息类型</param>
/// <param name="userId">用户ID</param>
/// <param name="projectid">项目ID</param>
/// <param name="modelid">记录ID</param>
/// <param name="modular">模块ID</param>
/// <param name="table">表明称</param>
public Msg(MsgType p, object oldModel, object newModel, string userId, int projectid, int modelid, int modular, string guid,int batch)
: this(DateTime.Now, p, oldModel, newModel, userId, projectid, modelid, modular, guid,batch)
{
}
/// <summary>
/// 创建新的日志记录实例;
/// </summary>
/// <param name="t">日志记录的文本内容</param>
/// <param name="p">日志记录的消息类型</param>
/// <param name="userId">用户ID</param>
/// <param name="projectid">项目ID</param>
/// <param name="modelid">记录ID</param>
/// <param name="modular">模块ID</param>
/// <param name="table">表明称</param>
public Msg(MsgType p, object oldModel, object newModel, string userId, int projectid, int modelid, int modular)
: this(DateTime.Now, p, oldModel, newModel, userId, projectid, modelid, modular, "",0)
{
}
/// <summary>
/// 创建新的日志记录实例;
/// </summary>
/// <param name="dt">日志记录的时间</param>
/// <param name="t">日志记录的文本内容</param>
/// <param name="p">日志记录的消息类型</param>
/// <param name="userId">用户ID</param>
/// <param name="projectid">项目ID</param>
/// <param name="modelid">记录ID</param>
/// <param name="modular">模块ID</param>
/// <param name="table">表明称</param>
public Msg(DateTime dt, MsgType p, object oldModel, object newModel, string userId, int projectid, int modelid, int modular, string guid,int batch)
{
datetime = dt;
type = p;
this.oldModel = oldModel;
this.newModel = newModel;
this.userId = userId;
this.projectid = projectid;
this.modelid = modelid;
this.modular = modular;
this.guid = guid;
this.batch = batch;
}

public object OldModel
{
get { return oldModel; }
set { oldModel = value; }
}

public object NewModel
{
get { return newModel; }
set { newModel = value; }
}
public string UserId
{
get { return userId; }
set { userId = value; }
}

public int Modular
{
get { return modular; }
set { modular = value; }
}

public int Projectid
{
get { return projectid; }
set { projectid = value; }
}

public int Modelid
{
get { return modelid; }
set { modelid = value; }
}

/// <summary>
/// 获取或设置日志记录的时间
/// </summary>
public DateTime Datetime
{
get { return datetime; }
set { datetime = value; }
}

/// <summary>
/// 获取或设置日志记录的消息类型
/// </summary>
public MsgType Type
{
get { return type; }
set { type = value; }
}
}
}

namespace BLL
{
/// <summary>
/// 日志消息类型的枚举
/// string Name = Enum.Parse(typeof(Man), i.ToString()).ToString();
/// int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2));
/// enum Man
///{
/// 刘备 = 1,
/// 关羽 = 2,
/// 张飞 = 3
///}
/// </summary>
public enum MsgType
{
/// <summary>
/// 添加
/// </summary>
添加 = 1,

/// <summary>
/// 修改
/// </summary>
修改 = 2,

/// <summary>
/// 删除
/// </summary>
删除 = 3,

/// <summary>
/// 添加相似
/// </summary>
添加相似 = 4,
//查看 = 5,
//搜索 = 6,
//下载 = 7
}
}

时间: 2024-10-04 21:50:36

线程托管日志类的相关文章

c++ 日志类 线程安全+缓存

根据上一次的测试,有缓存的日志类性能会更好.用到了time.h类函数,所以在linux下就要改动一下了,windows环境下写的. 思路采用(参照muduo库的日志,不过认为他线程不安全,和没用缓存,就改造了下) 1.有一个总的缓存,logboss,为一个恶汉模式的单例类,指针对象为智能指针,析构函数讲缓存写入文件. 2.有一个logger类,作为临时缓存,析构函数,将里面的缓存写入总缓存(在总缓存写入的时候加锁).如果缓存超过一定限度,就将前面的缓存写入文件先. void LogBoss::a

线程安全的日志类设计

最近在写多线程方面的内容, 其实多线程开发设计清楚了在写, 并不会有太大的坑, 尽管如此, 难免有需要调试的时候, 多线程的程序单步调试有时候难以发现bug, 通过记录日志, 可以用来查找问题, 方便调试. 其实有不少开源的C++日志库, 比如大名鼎鼎的log4cxx, 轻量级的glog, 还有一些热心的同行提供的开源工程, 我大体看了几个, 觉得不是很符合我的胃口, 于是就花了一天的时间, 自己写了一个, 用起来还比较顺手, 想怎么改就怎么改, 目前还是比较适合需求的. 考虑到线程安全, 就有

C#日志类记录

每个程序都要和日志打交道.程序日志的质量直接影响了排除问题的难度.普通程序调试信息直接输出控制台,复杂程序则通过文本,xml等方式记录运行时的调试信息.在C#中Diagnostics命名空间下有一个微软提供的专门用于记录信息的TraceSource类.TraceSource的使用方法很简单,只需要4行代码 TraceSource ts = new TraceSource("Code.Main", SourceLevels.All); ts.Listeners.Add(new Conso

获取当前线程状态--Thread类

String msgToPrint = Thread.currentThread().getStackTrace()[3] .getMethodName(); 就是调用时的方法名. 其中使用的Thread类的第一个方法: public static Thread currentThread() 返回当前线程对象. 实例代码: package com.loaderman.getthreadstatusdemo; import android.support.v7.app.AppCompatActi

Golang简单日志类

实现简单的日志写入文件功能运行环境:golang1.4.2+win7x64golang1.4.2+centos6.5×64 1 package Helper 2 3 import ( 4 “fmt” 5 “log” 6 “os” 7 “time” 8 ) 9 10 /*简单日志类*/ 11 /*注意,这个类不是线程安全的*/ 12 type LogFile struct { 13 mFile *os.File 14 mLogger *log.Logger 15 } 16 17 //创建日志对象

日志类(一)字段

今年一直想写一个基于完成端口的服务器,但是因为生活上的事屡屡推迟.此次怀着进行到底的决心开始.给自己的目标每周2单元(业余爱好者,能写的时间不多.2单元安排比较合理) 言归正传.一个完备的服务器首先必不可缺的是预警系统.无论是内部错误,还是外部攻击.都应该有响应的处理,那么记录下服务器的状态是我们分析问题的关键.那么日志类应运而生. 一个工程级的日志类应具备消耗资源少(CPU,内存),稳定,便于管理和查看的特点.数据库模式就值得我们参考,写一个轻量级的防数据库模式的日志类是此次目标. 我将此次工

多人即时战斗游戏服务端系列[3]--日志类及Config类以及Excel生成类

这里说一些辅助类的设计及介绍. 依然上类图先: 首先是日志类和Config,这个库以及Config库取自暗黑3的民间模拟器mooege, 当时看了写的简短小巧就直接拿过来用了. 后来虽然发现一些问题,进行简单修改和优化之后,在项目中进行使用了. 首先是日志类,看了下类图也就没几行,简单的就是一些输出层级,带有可外部加载的扩展方法,ExtensionLogTarget,通过反射加载,然后进行一些扩展目标的输出. 修改部分的话,比较简单,原先日志是同步输出,这样会导致卡掉一些时间比较敏感的运算,这边

[原创]分享一个轻量级日志类

日常开发中,常常会在程序部署到生产环境后发现有些问题,但无法直接调试,这就需要用到日志,本来想找一些开源的完善的日志类来实现,但试了几个都感觉太重.于是意识到一个问题,懒是偷不得的,只好撸起袖子,自己写一个.这个日志类是基于订阅模式的,而且是线程安全的,现在分享给大家,希望能给大家带来帮助. 闲话不多说,直接上代码.代码有两个实现版本(Java与C#),这里放出的是C#. 一共用到三个类:JzgLogs.cs主类,LogBuffer.cs日志缓冲类,LogInfo是用于日志缓冲中做记录的实体类,

logback如何按线程打印日志

背景   在一次项目的性能调优中,发现出现竞争瓶颈,导致在资源未使用满的情况下,TPS已经无法提升.祭起JMC(JAVA MISSON CONTROL)飞行记录器大法后,发现线程集中等待在logback写日志的地方,如下图所示:   由于项目组多线程写如同一个文件日志,导致存在IO竞争,一般解决这种问题有三种选择方式: 异步日志,但是会存在断电或者日志队列溢出丢失的可能 远程日志,日志放入外部消息队列,保证持久化,但需额外部署日志存储队列 多线程日志,按线程(或线程取模)记录日志,减少竞争,日志