将错误写入Web服务中的文本文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将错误写入Web服务中的文本文件相关的知识,希望对你有一定的参考价值。

我有一个Web服务,它有一个默认的ErrorLog方法,用于将日志添加到Db表。如果在ErrorLog Add或存储过程中发现异常,则返回它无法添加。我想将错误写入服务器上的文本文件(理论上这应该永远不会发生)。

在实际实现之前,我意识到多个人很可能会收到错误,所有错误都会失败,所有人都会尝试写入同一个文本文件。

如何在服务上实现队列,以便将消息添加到队列中,另一个服务/作业循环通过此队列并将错误添加到文件中?

我试过寻找例子,其中大部分是非常基本的。我唯一想知道的是如何跟踪队列?我只是创建一个静态类吗?

以下工作会怎样?

public class ErrorLogging
{

    public ErrorLogging(Error error)
    {
        if (ErrorLoggingQueue._GlobalQueue == null)
        {
            ErrorLoggingQueue._GlobalQueue = new Queue<Error>();
        }

        ErrorLoggingQueue._GlobalQueue.Enqueue(error);
    }
}

public static class ErrorLoggingQueue
{
    public static Queue<Error> _GlobalQueue;
}

// Assume that this class/method gets called every x minutes or seconds from  a job or something.
public class JobClass
{
    public void WriteErrors()
    {
        if (ErrorLoggingQueue._GlobalQueue != null)
        {
            while (ErrorLoggingQueue._GlobalQueue.Count != 0)
            {
                Error error = (Error)ErrorLoggingQueue._GlobalQueue.Dequeue();

                // Do stuff here
            }
        }
    }
}
答案

是的,具有Queue的静态变量将起作用并将在请求之间共享。只需为入队和出队添加锁定以使这些操作成为原子。这些方面的东西:

class YourWebservice
{
    static Queue<Error> _GlobalQueue = new Queue<Error>();
    static readonly object queueLock = new object();
    static Thread errorLogger;

    public void SomeWebserviceMethod()
    {
        //Some code...
        //.
        //.

        //Here we want to log an error
        EnqueueError(new Error());
    }
    private void EnqueueError(Error err )
    {
        lock(queueLock)
        {
            _GlobalQueue?.Enqueue(err);
            if ( errorLogger==null || !(errorLogger?.IsAlive ?? false) )
            {
                errorLogger = new Thread(new ThreadStart(WriteErrors));
                errorLogger?.Start();
            }
        }
    }

    private static Error DequeueError()
    {
        try
        {
            lock (queueLock)
            {
                return  _GlobalQueue?.Dequeue();
            }
        }
        catch(Exception)
        {
            //if we got here it means queue is empty.
        }

        return null;
    }
    private static void WriteErrors()
    {
       Error error = DequeueError();
       while (error!=null)
       {
            //Log error here
            //...
            //..

            error = DequeueError();               
       }
    }
}

以上是关于将错误写入Web服务中的文本文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将treeview的内容写入文本文件

记录C#常用的代码片段

将 Excel 2007 中的文本写入 Sharepoint 站点上的 .txt 文件会导致运行时错误“76”找不到路径

从 Android Studio 中的片段将数据写入 Firebase

如何在 IIS 中授予 Web api 应用程序写入权限?

尝试写入文件时 C++ 中的循环错误