繁体   English   中英

C# 为记录器 class 正确实现 StreamWriter

[英]C# correct implementation of a StreamWriter for a logger class

我的项目遇到了一个奇怪的问题。

这是我的记录器 class:

using System.Diagnostics;
using System.IO;

namespace someSpace
{
    public enum LogTarget
    {
        File, Database, EventLog
    }

    public static class LogHelper
    {
        private static LogBase logger = null;
        public static void Log(LogTarget target, string path, string message)
        {
            switch (target)
            {
                case LogTarget.File:
                    logger = new FileLogger();
                    logger.Log(path, message);
                    break;
                case LogTarget.EventLog:
                    logger = new EventLogger();
                    logger.Log("", message);
                    break;
                default:
                    return;
            }
        }
    }

    public abstract class LogBase
    {
        protected readonly object lockObj = new object();
        public abstract void Log(string path, string message);
    }

    public class FileLogger : LogBase
    {
        public override void Log(string path, string message)
        {
            lock (lockObj)
            {
                File.Open(path, FileMode.Open).Close();
                using (StreamWriter streamWriter = new StreamWriter(path))
                {
                    streamWriter.WriteLine(message);
                    streamWriter.Close();
                }
            }
        }
    }

    public class EventLogger : LogBase
    {
        public override void Log(string path, string message)
        {
            lock (lockObj)
            {
                EventLog m_EventLog = new EventLog("");
                m_EventLog.Source = "IDGEventLog";
                m_EventLog.WriteEntry(message);
            }
        }
    } 
} 

我像这样调用 function 日志...

LogHelper.Log(LogTarget.File, LOG_FILE_PATH, e.ToString());

我假设通过在我的 class 中使用“使用”结构,stream 将自动关闭,随后文件将被关闭并释放。

这不会发生; 程序的后续运行一直说该文件仍在被某个进程使用。 我不知道如何诊断问题。

lock (lockObj)
{
    var file = File.Open(path, FileMode.Open);

    using (StreamWriter streamWriter = new StreamWriter(file))
    {
        streamWriter.WriteLine(message);
        streamWriter.Close();
    }

    file.Close();
}

也以这种方式修改为提示评论但问题仍然存在......

每次调用 Log 都会创建一个带有自己 lockObj 的新记录器,其他记录器不会被锁定。 使 lockObj 成为 static 成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM