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

Rex*_*Lam 0 c# asp.net-mvc logging text file

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

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

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

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

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

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

有任何想法吗 ?

小智 10

不要使用自己的本土伐木.

不要用既定框架(如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);
    }
}
Run Code Online (Sandbox Code Playgroud)

消费者:

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));
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    void ILogger.Info(object msg)
    {
        _log.Info(msg);
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

在配置文件中配置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>
Run Code Online (Sandbox Code Playgroud)