C# 日志记录工具类:(适用于不想使用log4j等第三方的Log工具的时候,希望自己写个简单类实现)
LogHelper.cs内容如下:
 using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
using System.Collections.Generic; namespace Tools.Log
{
/// <summary>
/// 多线程安全Log记录工具20180314
/// </summary>
public class LogHelper
{
//为了使用DBGView进行在线调试:
//System.Diagnostics.Debug.WriteLine("Debug模式可见")
//System.Diagnostics.Trace.WriteLine("Debug、Release都可见"); private static Thread WriteThread;
private static readonly Queue<string> MsgQueue; private static readonly string FilePath; private static Boolean autoResetEventFlag = false;
private static AutoResetEvent aEvent = new AutoResetEvent(false);
private static bool flag = true;
public static bool LogFlag = true; static LogHelper()
{
FilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "App_Log\\";
WriteThread = new Thread(WriteMsg);
MsgQueue = new Queue<string>();
WriteThread.Start();
} public static void LogInfo(string msg)
{
Monitor.Enter(MsgQueue);
MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Info", msg));
Monitor.Exit(MsgQueue);
if (autoResetEventFlag) {
aEvent.Set();
}
}
public static void LogError(string msg)
{
Monitor.Enter(MsgQueue);
MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Error", msg));
Monitor.Exit(MsgQueue);
if (autoResetEventFlag)
{
aEvent.Set();
}
}
public static void LogWarn(string msg)
{
Monitor.Enter(MsgQueue);
MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Warn", msg));
Monitor.Exit(MsgQueue);
if (autoResetEventFlag)
{
aEvent.Set();
}
} /// <summary>
/// ExitThread是退出日志记录线程的方法,一旦退出,无法开启,一般在程序关闭时执行
/// </summary>
public static void ExitThread() {
flag = false;
aEvent.Set();//恢复线程执行
}
private static void WriteMsg()
{
while (flag)
{
//进行记录
if (LogFlag)
{
autoResetEventFlag = false;
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath);
}
string fileName = FilePath + DateTime.Now.ToString("yyyy-MM-dd") + "-Dic.log";
var logStreamWriter = new StreamWriter(fileName, true);
while (MsgQueue.Count > )
{
Monitor.Enter(MsgQueue);
string msg = MsgQueue.Dequeue();
Monitor.Exit(MsgQueue);
logStreamWriter.WriteLine(msg);
if (GetFileSize(fileName) > * )
{
logStreamWriter.Flush();
logStreamWriter.Close();
CopyToBak(fileName);
logStreamWriter = new StreamWriter(fileName, false);
logStreamWriter.Write("");
logStreamWriter.Flush();
logStreamWriter.Close();
logStreamWriter = new StreamWriter(fileName, true);
}
//下面用于DbgView.exe工具进行在线调试
System.Diagnostics.Debug.WriteLine("BS_Debug:"+msg);
System.Diagnostics.Trace.WriteLine("BS_Release:" + msg);
}
logStreamWriter.Flush();
logStreamWriter.Close();
autoResetEventFlag = true;
aEvent.WaitOne();
}
else {
autoResetEventFlag = true;
aEvent.WaitOne();
}
}
}
private static long GetFileSize(string fileName)
{
long strRe = ;
if (File.Exists(fileName))
{
var myFs=new FileInfo(fileName);
strRe = myFs.Length / ;
//Console.WriteLine(strRe);
}
return strRe;
}
private static void CopyToBak(string sFileName)
{
int fileCount = ;
string sBakName = "";
do
{
fileCount++;
sBakName = sFileName + "." + fileCount + ".BAK";
}
while (File.Exists(sBakName));
File.Copy(sFileName, sBakName);
}
}
}

该类由BS风华改编自网上一个类。实现了多线程下面安全记录日志的功能:

使用方法:

    Tools.Log.LogHelper.LogFlag = true; //开启记录
Tools.Log.LogHelper.LogInfo("==========日志记录内容 Info====");
Tools.Log.LogHelper.LogWarn("==========日志记录内容 Warn====");
Tools.Log.LogHelper.LogError("==========日志记录内容 Error====");
Tools.Log.LogHelper.LogFlag = false;//停止记录 Tools.Log.LogHelper.ExitThread();// 退出日志记录线程,一般在程序退出时候调用。

如果有更好的方式,欢迎留言

C# 日志记录工具类--LogHelper.cs测试的更多相关文章

  1. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  2. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  3. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  4. LogHelper 日志记录帮助类

    1.LogHelper 日志记录帮助类 using System; using System.Collections.Generic; using System.Linq; using System. ...

  5. HttpClientUntils工具类的使用测试及注意事项(包括我改进的工具类和Controller端的注意事项【附 Json 工具类】)

    HttpClient工具类(我改过): package com.taotao.httpclient; import java.io.IOException; import java.net.URI; ...

  6. 基于SQLite日志记录工具--Log4W

    最近压迫自己写点自己的东西,但是水平不高,槽点多,望各位请轻喷,嘿嘿! 以前用过一个Log4Net的东东,但是保存的是文本文件,不好过滤,而且用的不多,也不太熟悉,所以自己也当写一个练练手吧!     ...

  7. AspNetCore.FileLog 一款很不错的日志记录工具

    AspNetCore.FileLog 该项目作者为伟哥,GitHub地址:https://github.com/amh1979:该项目维护者为鸟窝,GitHub地址:https://github.co ...

  8. Java日志记录工具SLF4J介绍

    SLF4J是什么 SLF4J是一个包装类,典型的facade模式的工具,对用户呈现统一的操作方式,兼容各种主流的日志记录框架,典型的有log4j/jdk logging/nop/simple/jaka ...

  9. log4j2和logback动态修改日志级别工具类

    工作中,在排查线上问题时,有以下场景在不重新部署或重启服务的情况下,需要动态调整线上日志级别 1.线上有些日志打印过多干扰有用的日志,需要动态修改线上日志记录器的打印日志级别,调高一些日志级别,打印出 ...

随机推荐

  1. 了解dto概念,什么是DTO

    了解dto概念   此博文收集整理了一些主流的文章对于DTO模式的解读,他们大体相似而又各有所不同.对于设计模式的解读也是一个仁者见仁智者见智的事情,不过设计模式往往都是前辈们在遇到一类特定的问题下而 ...

  2. 文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了

    当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成.不过,FileSystemWatcher 对文件夹的监视要求文件夹必须存在,否则会产生错误“无效路径”. 那 ...

  3. CTF密码学之凯撒加密

    在加密的各种算法中,凯撒加密是最简单的也是最常见的一种加密方法,它的中心思想是替换,ROT加密其实就是凯斯加密的变种. 即明文的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文 ...

  4. metabase docker-compose 运行说明

    metabase 是一款比较产品化的一个数据分析工具,支持的数据源也比较多 以下为简单的docker-compose 运行文件,同时集成了mongo 以及graphql 引擎,方便数据 的api查询 ...

  5. Swift 学习笔记十五:扩展

    扩展就是向一个已有的类.结构体或枚举类型加入新功能(functionality).扩展和 Objective-C 中的分类(categories)相似.(只是与Objective-C不同的是,Swif ...

  6. Digester库使用总结

    1.Digester是Apache软件基金会的Jakarta项目下的子Commons项目下的一个开源项目,Digester API包含3个包:org.apache.commons.digester,提 ...

  7. 【转】第六章、Linux 的文件权限与目录配置

    原文网址:http://vbird.dic.ksu.edu.tw/linux_basic/0210filepermission.php 最近更新日期:2009/08/18 Linux最优秀的地方之一, ...

  8. 【转】RS232、RS485、TTL电平、CMOS电平

    原文网址:http://blog.sina.com.cn/s/blog_63a0638101018grc.html RS232.RS485.TTL电平.CMOS电平 什么是TTL电平.CMOS电平.R ...

  9. RAC2——11g Grid Infrastructure的新机制

    版权声明:本文为博主原创文章,未经博主允许不得转载. 可以看到,最初CRS(Cluster Ready Services)名词的起源就是因为10.1中作为集群软件的原因.后来经历了Clusterwar ...

  10. yii2 rbac权限管理学习笔记

    下面介绍一个 yii2 的 Rbac 权限管理设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main ...