http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 25757|回复: 10

[功能帮助类] 日志类,多线程多程序同时写不冲突 。

[复制链接]
发表于 2017-1-13 09:27:11 | 显示全部楼层 |阅读模式
[C#] 纯文本查看 复制代码
/*
 * 日志类,不同于其他开源项目需要引用dll 
 * 代码简短,支持多线程写同一日志文件不冲突。
 * 主要代码也来自网络,进行过优化和格式修改
 * wisecn  2017-1-13 
 */
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;


namespace SXLibrary
{
    public class Log
    {
        private static readonly Thread WriteThread;
        private static readonly Queue<string> MsgQueue;
        private static readonly object FileLock;
        private static readonly string FilePath;

        static Log()
        {
            FileLock = new object();
            FilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "log\\";
            WriteThread = new Thread(WriteMsg);
            WriteThread.IsBackground = true;
            MsgQueue = new Queue<string>();
            WriteThread.Start();
        }

        public static void WriteInfoLog(string msg)
        {
            Monitor.Enter(MsgQueue);
            MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", " Info", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
            Monitor.Exit(MsgQueue);
        }
        public static void WriteErrorLog(string msg)
        {
            Monitor.Enter(MsgQueue);
            MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", "Error", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
            Monitor.Exit(MsgQueue);
        }
        public static void WriteDebugLog(string msg)
        {
            Monitor.Enter(MsgQueue);
            MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", "Debug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
            Monitor.Exit(MsgQueue);
        }
        private static void WriteMsg()
        {
            while (true)
            {
                if (MsgQueue.Count > 0)
                {
                    Monitor.Enter(MsgQueue);
                    string msg = MsgQueue.Dequeue();
                    Monitor.Exit(MsgQueue);

                    Monitor.Enter(FileLock);

                    string _path = FilePath + msg.Substring(0, 5).Trim() + "\\" + DateTime.Now.ToString("yyyy-MM");

                    if (!Directory.Exists(_path))
                    {
                        Directory.CreateDirectory(_path);
                    }
                    string fileName = _path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
                    msg = msg.Remove(0, 5);
                    var logStreamWriter = new StreamWriter(fileName, true);
                    logStreamWriter.WriteLine(msg);
                    logStreamWriter.Close();
                    logStreamWriter.Dispose();
                    Monitor.Exit(FileLock);
                    if (GetFileSize(fileName) > 1024 * 2)
                    {
                        CopyToBak(fileName);
                    }
                }
                else
                {
                    System.Threading.Thread.Sleep(5);
                }

            }
        }


        private static long GetFileSize(string fileName)
        {
            long strRe = 0;
            if (File.Exists(fileName))
            {
                Monitor.Enter(FileLock);
                var myFs = new FileStream(fileName, FileMode.Open);
                strRe = myFs.Length / 1024;
                myFs.Close();
                myFs.Dispose();
                Monitor.Exit(FileLock);
            }
            return strRe;
        }
        private static void CopyToBak(string sFileName)
        {
            int fileCount = 0;
            string sBakName = "";
            Monitor.Enter(FileLock);
            do
            {
                fileCount++;
                sBakName = sFileName + "." + fileCount + ".BAK";
            }
            while (File.Exists(sBakName));

            File.Copy(sFileName, sBakName);
            File.Delete(sFileName);
            Monitor.Exit(FileLock);
        }
    }
}



补充内容 (2017-1-13 14:51):
每2M大小会自动分文件保存

Log.rar

1.25 KB, 下载次数: 450, 下载积分: 金钱 -1

日志类



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2017-1-13 10:18:15 | 显示全部楼层
好东西
回复

使用道具 举报

发表于 2017-11-8 21:30:15 | 显示全部楼层
好东西,可以留用撒
发表于 2017-12-22 13:47:39 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-9 00:52:19 来自移动端 | 显示全部楼层
看过帖子回复一下是个好习惯
发表于 2018-12-21 10:52:44 | 显示全部楼层
看过帖子回复一下是个好习惯
发表于 2018-12-21 21:28:39 | 显示全部楼层
嗯,我测试一下啊。
发表于 2019-5-31 17:06:25 | 显示全部楼层
我也测试一下!
发表于 2019-9-26 11:33:55 | 显示全部楼层
如何使用啊  兄弟!!!!!
发表于 2019-11-4 15:34:51 | 显示全部楼层
来试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 02:10

© 2014-2021

快速回复 返回顶部 返回列表