【问题标题】:C# Best practices on text log file文本日志文件的 C# 最佳实践
【发布时间】:2015-06-28 22:36:34
【问题描述】:

我有一个在 IIS 托管环境上运行的 ASP.Net MVC 应用程序, 我希望有一个应用程序日志文件来记录一些自定义事件和错误。

这样做的最佳做法是什么?

  • 我是否应该在应用程序启动时打开文件(比如 log.txt),在需要时使用 StreamWriter 写入并在应用程序结束时关闭

  • 或每次都打开 -> 写入 -> 关闭?

对于第一种方法,恐怕当应用程序域意外退出时,文件仍会保持打开状态,

对于第二种方法,可能由于多线程操作或太频繁的打开/关闭而导致 IO 错误?

有什么想法吗?

【问题讨论】:

  • 有一些日志框架(例如 log4net)旨在考虑所有这些因素。
  • 正如 AlexK 所建议的,已经有非常完善的开源日志记录/错误处理库,如 Log4net、NLog 等。这些是您最好的选择,因为它们已在数以千计的应用程序中使用。为什么要重新发明轮子..
  • 即使您不想使用某些 3rd 方框架,您也可以使用 C# .net 框架中可用的现有功能,例如写信给EventLog 我建议您做更多研究就你而言,这只是一个自以为是的问题
  • 我同意@AlexK。有一些可用的库是线程安全的,可以处理多个写入器和队列。

标签: c# asp.net-mvc file logging text


【解决方案1】:

不要使用您自己的本土日志记录。

不要使用已建立的框架(如 log4net)。

不要将您的应用程序与内部日志记录混在一起(保持打开/每次都打开等)

是否具有可配置的日志记录

不要将您的应用绑定到日志记录实现

代码到接口

有一个通用的记录器,您可以在应用程序中传递和使用:

namespace YourApp.Framework.Logger
{
    public interface ILogger
    {
        void Error(Exception ex);
        void Info(object msg);
        void Debug(string msg);
        void Error(string msg, Exception ex);
    }
}

消费者:

public class TokenController : ApiController
{
    private readonly ITokenRepository _repository;
    private readonly ILogger _logger;

    public TokenController(ITokenRepository repository, ILogger logger)
    {
        _repository = repository;
        _logger = logger;
    }

    public HttpResponseMessage Token()
    {
        ....
        _logger.Info(string.Format("Customer {0} autenticated", customerId));
        ....
    }
}

在 log4net 的记录器上实现 ILogger,例如:

public class Logger : ILogger
{
    private static ILog _log = LogManager.GetLogger("ErrorLogger");

    void ILogger.Info(object msg)
    {
        _log.Info(msg);
    }
    ....
}

在配置文件中配置 log4net:

<log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="Log\Service.log" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="5" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%newline%date [%thread] %level %logger - %message%newline" />
        </layout>
    </appender>    
    <logger name="ErrorLogger" additivity="False">
        <level value="DEBUG" />
        <appender-ref ref="RollingFileAppender" />
    </logger>
</log4net>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2015-07-23
    相关资源
    最近更新 更多