【问题标题】:Text File Logging in MVC using standard Libraries?使用标准库在 MVC 中记录文本文件?
【发布时间】:2018-06-15 07:22:44
【问题描述】:

我正在尝试弄清楚如何在 MVC 中记录到平面 txt 文件。

我并不是要求最好的解决方案。我要求指出正确的方向。

我有一个想法,让一个单例类处理我的所有日​​志记录。

我本质上只是想调用一个名为

的方法
alogger = Logger.GetLogger();
aLogger.Log("some message",enum.serverity)

每当我需要将某些内容记录到文件中时。然后让singelton处理如何写入文件等等。

但后来我开始研究 microsoft.extensions.logging 库,希望我可以将我的大部分日志记录外包给 NuGet 中已经存在的一些标准。

但是,我对那个库的复杂性感到不知所措,并且正在考虑只做我自己的基于小线程的日志记录。因为这似乎是满足我简单需求的更简单的解决方案。 是否有任何简单的指南如何归档我想要的但仍然使用看起来不像我们正在构建记录器火箭的标准库? 我缺少更好的更简单的方法吗?

【问题讨论】:

    标签: c# asp.net-mvc logging


    【解决方案1】:

    您的所有问题都有一个简单的答案 - 使用 Log4Net 库。

    这是我在其中一个项目中做过的最简单的实现:

    ILogger.cs

    public interface ILogger
        {
            void Info(string message);
    
            void Warn(string message);
    
            void Debug(string message); 
    
            void Error(string message);
    
            void Error(Exception exception);
    
            void Fatal(string message);
        }
    

    Logger.cs

    public class Logger : ILogger
        {
            #region Properties   
            private readonly ILog log;   //ILog refers to interface from log4net library
    
            //Singleton Instance of Logger Class
            private static readonly object threadLock = new Object();
            private static Lazy<Logger> instance;
    
            public static Logger Instance
            {
                get
                {
                    if (instance == null)
                    {
                        lock (threadLock)
                        {
                            instance = new Lazy<Logger>(() => new Logger());
                            return instance.Value;
                        }
                    }
                    else
                    {
                        return instance.Value;
                    }
                }
            }
    
            #endregion
    
            #region Constructor
            //Private constructor to restrict from any instance creation
            private Logger()
            {
                XmlConfigurator.Configure();
                log = LogManager.GetLogger(GetType());
                //log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            }
            #endregion
    
            #region Methods
            public void Info(string message)
            {
                log.Info(message);
            }
    
            public void Warn(string message)
            {
                log.Warn(message); 
            }
    
            public void Debug(string message)  
            { 
                log.Debug(message);
            }
    
            public void Error(string message)
            {
                log.Error(message);
            }
    
            public void Error(Exception exception)
            {
                log.Error(exception);
            }
    
            public void Fatal(string message)
            {
                log.Fatal(message);
            }
            #endregion
        }
    

    App.Config

    <configSections>
        <!--- Specifying the configuration information about the XML tag "log4net" -->
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
     </configSections>
    
    
    
     <!---log4Net configuration for enabling logs to be stored in different modes -->
      <log4net debug="true">
        <appender name="consoleAppender" type="log4net.Appender.ConsoleAppender">
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %level %logger -%message%newline" />
          </layout>
        </appender>
    
        <appender name="filelogAppender" type="log4net.Appender.RollingFileAppender">
        </appender>
    
        <appender name="rollingFilelogAppender" type="log4net.Appender.RollingFileAppender">
          <file value="C:\SpecifyLocation\SpecifyFileName.log" />
          <encoding value="utf-8" />
          <appendToFile value="true" />
          <rollingStyle value="Date" />
          <datePattern value="'Test_APILogs-'ddMMyyyy'.log'" />
          <!--<staticLogFileName value="false" />
          <maxSizeRollBackups value="50" />
          <maximumFileSize value="1MB" />-->
    
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %level %logger -%message%newline" />
          </layout>
        </appender>
    
        <appender name="dblogAppender" type="log4net.Appender.AdoNetAppender">
        </appender>
    
        <!---Root element where we specify the appenders (providers) that stores the logs.
        The various logging levels provided are:
        OFF - nothing gets logged (cannot be called)
        FATAL
        ERROR
        WARN
        INFO
        DEBUG
        ALL - everything gets logged (cannot be called)
        -->
        <root>
          <level value="ALL" />
          <!--<appender-ref ref="consoleAppender" />-->
          <!--<appender-ref ref="filelogAppender" />-->
          <appender-ref ref="rollingFilelogAppender" />
          <!--<appender-ref ref="dblogAppender" />-->
        </root>
      </log4net>
    

    控制器

            [HttpPost, Route("add")]
            public IHttpActionResult AddEmployee(AddEmployeeRequestDTO request)
            {
                try
                {
                    if (request == null)
                        return Content(HttpStatusCode.BadRequest, ErrorCodes.E002);
    
    
                }
                catch (Exception ex)
                {
    #if (DEBUG)
                    Logger.Instance.Error(ex);
                    throw ex;
    
    #endif
                    //Logger.Instance.Error(ex);
                    //return Content(HttpStatusCode.InternalServerError, ErrorCodes.E001);
                }
            }
    

    【讨论】:

    • 你让我找到了一个好的方向 :) 我对 Log4Net 做了一些研究,但最终改用了 NLog。更简单的用法,更快,据我所知,如果不是更多,也一样灵活。
    • 是的,你也可以使用 NLog。两者都是一样的,但是 NLog 有更积极的用户支持。干杯:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2015-01-28
    • 1970-01-01
    • 2013-01-13
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多