C#文本日志文件的最佳实践

时间:2015-04-21 16:14:14

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

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

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

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

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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:9)

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

执行使用已建立的框架(如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>