Rex Lam
Rex Lam

Reputation: 1405

C# Best practices on text log file

I have a ASP.Net MVC application running on IIS hosting environment, I wish to have a application wise log file to log some custom event and error.

What is the best practices to doing this ?

for 1st approach, I'm afraid that when the application domain exit unexpected the file will still keep open,

for 2nd approach, there may have IO error due to multi-thread operation or too freq open/close ?

Any ideas ?

Upvotes: 2

Views: 13300

Answers (1)

user270576
user270576

Reputation: 997

Do not use your own home-grown logging.

Do use established frameworks (like log4net).

Do not cloud your app with logging internals (keep open/open every time, etc.)

Do have configurable logging

Do not tie your app to logging implementation

Do code to interface

Have a generic logger that you pass around and use in the app:

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);
    }
}

Consumer:

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));
        ....
    }
}

Base implementation of your ILogger on log4net's logger, for example:

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

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

Configure log4net in config file:

<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>

Upvotes: 11

Related Questions