Как использовать IMvxTrace в MvvmCross - PullRequest
0 голосов
/ 17 сентября 2018

Недавно я начал изучать Xamarin, и сегодня я открыл большой проект, написанный на MvvmCross, и я должен добавить туда новые функции. Это сложно, так как обычно я работаю с Java и Android Studio, но теперь мне нужно углубиться в C # и Visual Studio.

Во-первых, я хочу понять, как проходит этот проект, и для этого я хочу вставить журналы в разные классы .cs и просматривать их во время навигации по приложению.

В Setup.cs:

protected override IMvxTrace CreateDebugTrace()
    {
        return new NLogTrace();
    }

NLogTrace.cs:

public class NLogTrace : IMvxTrace
{
    private readonly ILogger _logger;

    public NLogTrace()
    {
        InitializeNLog();

        _logger = LogManager.GetLogger("MvvmCross");
    }

    public static string LogFileName => Path.Combine(GetCacheFolder(), "logFile.txt");

    private static void InitializeNLog()
    {
        // Step 1. Create configuration object 
        var config = new LoggingConfiguration();

        // Step 2. Create targets and add them to the configuration 
        var consoleTarget = new ConsoleTarget();
        config.AddTarget("console", consoleTarget);

        var logFolderPath = GetCacheFolder();
        var fileTarget = new FileTarget
        {
            FileName = Path.Combine(logFolderPath, "logFile.txt"),
            ArchiveFileName = Path.Combine(logFolderPath, "log.{#}.txt"),
            ArchiveEvery = FileArchivePeriod.Day,
            ArchiveNumbering = ArchiveNumberingMode.Date,
            MaxArchiveFiles = 7
        };
        config.AddTarget("file", fileTarget);

        // Step 3. Set target properties 
        consoleTarget.Layout = @"${longdate}|${level:uppercase=true}|${logger}|${message}"; //
        fileTarget.Layout = "${longdate}|${level:uppercase=true}|${logger}|${message}";

        // Step 4. Define rules
        var rule1 = new LoggingRule("*", LogLevel.Trace, consoleTarget);
        config.LoggingRules.Add(rule1);

        #if DEBUG
        var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget);
        config.LoggingRules.Add(rule2);
        #else
        var rule2 = new LoggingRule("*", LogLevel.Info, fileTarget);
        config.LoggingRules.Add(rule2);
        #endif

        LogManager.Configuration = config;
    }

    private static string GetCacheFolder()
    {
        var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        var relativeCacheFolderPath = Path.Combine(documents, "Storage", "Logs");

        var directory = new DirectoryInfo(relativeCacheFolderPath);
        var resolvedCacheFolderPath = directory.FullName;
        return resolvedCacheFolderPath;
    }

    public void Trace(MvxTraceLevel level, string tag, string message)
    {
        switch (level)
        {
            case MvxTraceLevel.Diagnostic:
                _logger.Debug(message);
                break;
            case MvxTraceLevel.Warning:
                _logger.Warn(message);
                break;
            case MvxTraceLevel.Error:
                _logger.Error(message);
                break;
        }
    }

    public void Trace(MvxTraceLevel level, string tag, Func<string> message)
    {
        switch (level)
        {
            case MvxTraceLevel.Diagnostic:
                _logger.Debug(message());
                break;
            case MvxTraceLevel.Warning:
                _logger.Warn(message());
                break;
            case MvxTraceLevel.Error:
                _logger.Error(message());
                break;
        }
    }

    public void Trace(MvxTraceLevel level, string tag, string message, params object[] args)
    {
        switch (level)
        {
            case MvxTraceLevel.Diagnostic:
                _logger.Debug(message, args);
                break;
            case MvxTraceLevel.Warning:
                _logger.Warn(message, args);
                break;
            case MvxTraceLevel.Error:
                _logger.Error(message, args);
                break;
        }
    }
}

Итак, я вижу какой-то логгер, но понятия не имею, как его использовать в каком-то файле .cs. Можете ли вы предоставить некоторый фрагмент, как использовать

Trace(MvxTraceLevel level, string tag, string message)

в произвольно выбранном файле .cs из проектов .Core или .Droid?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Я нашел ответ.Прежде всего, приведенный выше код был бесполезен.

Для файлов в проекте Android я могу использовать простые журналы Android:

using Android.Util;
.......
Log.Info("TAG", "Sending confirmation that app is running");

Для файлов в проекте .Core (а также, который работает для файлов Android) Я нашел в коде следующую цепочку:

interface ILogger

используется в

interface ILogService

, который реализован в .Droid как

 AndroidLogService : ILogService

и зарегистрирован в Setup.csкак

Mvx.LazyConstructAndRegisterSingleton<ILogService, AndroidLogService>();

, используемый в файле в проекте .Droid:

private readonly ILogger _logger;

public AndroidSomeService(ILogService logService)
{
    _logger = logService.GetLogger<AndroidSomeService>();
    .......
}

_logger.Warn("Failed to retrieve logo. Error: {0}", ex);
0 голосов
/ 17 сентября 2018

Вы должны использовать инъекцию зависимости. Для полной документации см. Документы . Короче говоря, вы добавляете параметр IMvxLog в модель представления / конструктор сервиса:

public MyViewModel( IMvxLog logger )
{
   this._logger = logger;
}

А затем просто вызовите соответствующий метод для _logger:

_log.Trace("Some message");

Если вы хотите использовать IMvxLog из класса, где вы не можете настроить внедрение зависимостей, вы можете использовать Mvx для его разрешения:

var logger = Mvx.Resolve<IMvxLog>();
...