Как зарегистрировать информацию с помощью NLog в проекте Xamarin форм - PullRequest
0 голосов
/ 23 сентября 2019

Я использую Nlog для регистрации исключений в моем проекте (кроссплатформенный проект xamarin).

Моя реализация:

public interface ILogger
{
    void Trace(string text, params object[] args);
    void Debug(string text, params object[] args);
    void Info(string text, params object[] args);
    void Warn(string text, params object[] args);
    void Error(string text, params object[] args);
    void Fatal(string text, params object[] args);
}

public interface ILogManager
{
    ILogger GetLog([System.Runtime.CompilerServices.CallerFilePath]string callerFilePath = "");
}

В проекте UWP для конкретной платформы я создал 2 класса:

public class NLogLogger : ILogger
{
    private Logger log;

    public NLogLogger(Logger log)
    {
        this.log = log;
    }

    public void Debug(string text, params object[] args)
    {
        log.Debug(text, args);
    }

    public void Error(string text, params object[] args)
    {
        log.Error(text, args);
    }

    public void Fatal(string text, params object[] args)
    {
        log.Fatal(text, args);
    }

    public void Info(string text, params object[] args)
    {
        log.Info(text, args);
    }

    public void Trace(string text, params object[] args)
    {
        log.Trace(text, args);
    }

    public void Warn(string text, params object[] args)
    {
        log.Warn(text, args);
    }

}

NLogManager Класс:

  public class NLogManager : ILogManager
  {
    public NLogManager()
    {
        var config = new LoggingConfiguration();

        var consoleTarget = new ConsoleTarget();
        config.AddTarget("console", consoleTarget);

        var consoleRule = new LoggingRule("*", LogLevel.Trace, consoleTarget);
        config.LoggingRules.Add(consoleRule);

        var fileTarget = new FileTarget();
        string folder = ApplicationData.Current.LocalFolder.Path;
        string fileNameWithDate = "Log_" + DateTime.Today.ToString("MMMddyyyy") + ".txt";
        fileTarget.FileName = Path.Combine(folder, fileNameWithDate);
        config.AddTarget("file", fileTarget);

        var fileRule = new LoggingRule("*", LogLevel.Warn, fileTarget);
        config.LoggingRules.Add(fileRule);

        LogManager.Configuration = config;
    }

    public EverwellUnpluggedLogger.ILogger GetLog([CallerFilePath] string callerFilePath = "")
    {
        string fileName = callerFilePath;

         if (fileName.Contains("/"))
           {
               fileName = fileName.Substring(fileName.LastIndexOf("/", StringComparison.CurrentCultureIgnoreCase) + 1);
           }

           var logger = LogManager.GetLogger(fileName);
           return new NLogLogger(logger);
    }
}

Если в каком-либо методе выдается исключение, я использую строку ниже, чтобы записать его в текстовый файл.Это работает нормально.

ILogger logger = DependencyService.Get<ILogManager>().GetLog();
        logger.Error(ex.Message, ex);

Аналогично, когда я использую logger.info (), в моем текстовом файле ничего не записывается.

 logger.Info(logs);

Нужно ли менятьлюбая конфигурация в файле Nlog.config?Пожалуйста, помогите.

1 Ответ

1 голос
/ 23 сентября 2019

Если вы спрашиваете, почему эта строка не регистрируется в fileTarget:

logger.Info(logs);

Тогда, вероятно, проблема заключается в том, что вы включаете только предупреждения (или хуже):

var fileRule = new LoggingRule("*", LogLevel.Warn, fileTarget);

Попробуйте изменить это вместо этого:

var fileRule = new LoggingRule("*", LogLevel.Info, fileTarget);
...